<?xml version="1.0" encoding="UTF-8"?>
<robot generator="Robot 7.5 (Python 3.11.10 on linux)" generated="2026-10-16T01:13:58.802140" 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-manganese/test/csit/suites/ovsdb/Southbound_Cluster">
<suite id="s1-s1-s1" name="Ovsdb Southbound Cluster" source="/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:13:59.358714" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-16T01:13:59.357078" elapsed="0.001704"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-10-16T01:13:59.356529" elapsed="0.002341"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-10-16T01:13:59.361513" 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-10-16T01:13:59.360224" elapsed="0.001322"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-10-16T01:13:59.361794" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:13:59.361656" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-10-16T01:13:59.361623" elapsed="0.000251"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-16T01:13:59.362436" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-16T01:13:59.362069" elapsed="0.000411"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-10-16T01:13:59.362978" 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-10-16T01:13:59.362650" elapsed="0.000357"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Convert To Integer" owner="BuiltIn">
<arg>${cluster_size}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-10-16T01:13:59.363613" elapsed="0.000315"/>
</kw>
<msg time="2026-10-16T01:13:59.364031" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:13:59.364076" 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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:13:59.363179" elapsed="0.000919"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:13:59.364653" 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-10-16T01:13:59.364277" elapsed="0.000432"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:13:59.366425" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:13:59.366151" elapsed="0.000303"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:13:59.366884" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:13:59.366601" elapsed="0.000308"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:13:59.367417" 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-10-16T01:13:59.367083" elapsed="0.000361"/>
</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-10-16T01:13:59.368716" elapsed="0.000221"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:13:59.369403" level="INFO">${member_ip} = 10.30.170.180</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:13:59.369101" elapsed="0.000327"/>
</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-10-16T01:13:59.369592" elapsed="0.000298"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:13:59.370639" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:13:59.370372" elapsed="0.000308"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:13:59.370740" elapsed="0.000050"/>
</return>
<msg time="2026-10-16T01:13:59.370902" 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-10-16T01:13:59.370090" elapsed="0.000835"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:13:59.371537" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.180:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a89a5f4a0d0&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-10-16T01:13:59.371171" elapsed="0.000590"/>
</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-10-16T01:13:59.371928" elapsed="0.000157"/>
</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-10-16T01:13:59.367936" elapsed="0.004205"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:13:59.367753" elapsed="0.004429"/>
</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-10-16T01:13:59.372995" elapsed="0.000150"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:13:59.373581" level="INFO">${member_ip} = 10.30.170.14</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:13:59.373300" elapsed="0.000306"/>
</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-10-16T01:13:59.373840" elapsed="0.000170"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:13:59.374883" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:13:59.374446" elapsed="0.000463"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:13:59.374951" elapsed="0.000030"/>
</return>
<msg time="2026-10-16T01:13:59.375084" 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-10-16T01:13:59.374182" elapsed="0.000925"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:13:59.375583" level="INFO">Creating Session using : alias=ClusterManagement__session_2, url=http://10.30.170.14:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a89a5f45ad0&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-10-16T01:13:59.375274" elapsed="0.000443"/>
</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-10-16T01:13:59.375877" elapsed="0.000148"/>
</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-10-16T01:13:59.372517" elapsed="0.003562"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:13:59.372346" elapsed="0.003771"/>
</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-10-16T01:13:59.376839" elapsed="0.000150"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:13:59.377419" level="INFO">${member_ip} = 10.30.170.84</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:13:59.377141" elapsed="0.000302"/>
</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-10-16T01:13:59.377603" elapsed="0.000198"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:13:59.378498" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:13:59.378234" elapsed="0.000289"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:13:59.378564" elapsed="0.000028"/>
</return>
<msg time="2026-10-16T01:13:59.378723" 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-10-16T01:13:59.377972" elapsed="0.000776"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:13:59.379239" level="INFO">Creating Session using : alias=ClusterManagement__session_3, url=http://10.30.170.84:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a89a5f50f90&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-10-16T01:13:59.378914" elapsed="0.000427"/>
</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-10-16T01:13:59.379497" elapsed="0.000146"/>
</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-10-16T01:13:59.376359" elapsed="0.003367"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:13:59.376198" elapsed="0.003573"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-10-16T01:13:59.367507" elapsed="0.012297"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-16T01:13:59.380384" level="INFO">${ClusterManagement__member_index_list} = [1, 2, 3]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-16T01:13:59.379994" elapsed="0.000431"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-16T01:13:59.381021" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.180', 2: '10.30.170.14', 3: '10.30.170.84'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-16T01:13:59.380606" elapsed="0.000456"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-16T01:13:59.381586" 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 the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-16T01:13:59.381240" elapsed="0.000386"/>
</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-10-16T01:13:59.365587" elapsed="0.016123"/>
</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-10-16T01:13:59.359882" elapsed="0.021919"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:13:59.381982" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:13:59.381872" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-16T01:13:59.381850" elapsed="0.000200"/>
</if>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:13:59.383265" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:13:59.382931" elapsed="0.000359"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:13:59.383744" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:13:59.383439" elapsed="0.000331"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:13:59.383811" elapsed="0.000029"/>
</return>
<msg time="2026-10-16T01:13:59.383940" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:13:59.382596" elapsed="0.001367"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:13:59.384837" level="INFO">${member_ip} = 10.30.170.180</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-10-16T01:13:59.384596" elapsed="0.000266"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:13:59.385882" 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-10-16T01:13:59.385990" 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-10-16T01:13:59.385496" elapsed="0.000519"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:13:59.389564" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:13:59.388525" elapsed="0.001153"/>
</branch>
<status status="PASS" start="2026-10-16T01:13:59.388482" elapsed="0.001294"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:13:59.390491" 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-10-16T01:13:59.390792" 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-10-16T01:13:59.390091" elapsed="0.000820"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:13:59.391832" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.180" 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-10-16T01:13:59.391223" elapsed="0.000764"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:13:59.393013" 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-10-16T01:13:59.392291" elapsed="0.000838"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:13:59.394576" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:13:59.394648" 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-10-16T01:13:59.394216" elapsed="0.000470"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:13:59.394895" elapsed="0.000307"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:13:59.396078" level="INFO">Logging into '10.30.170.180:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:13:59.796933" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-194-generic x86_64)

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

 System information as of Fri Oct 16 01:13:54 UTC 2026

  System load:  0.53               Processes:             127
  Usage of /:   13.9% of 77.35GB   Users logged in:       0
  Memory usage: 6%                 IPv4 address for ens3: 10.30.170.180
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


[?2004h[jenkins@releng-12472-74-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-10-16T01:13:59.395824" elapsed="0.401364"/>
</kw>
<msg time="2026-10-16T01:13:59.797279" 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-10-16T01:13:59.395407" elapsed="0.401981"/>
</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-10-16T01:13:59.393497" elapsed="0.404148"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:13:59.798926" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-10-16T01:13:59.812312" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-10-16T01:13:59.812596" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:13:59.812786" 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-10-16T01:13:59.798179" elapsed="0.014722"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:13:59.813180" elapsed="0.000754"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:13:59.815617" 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-10-16T01:13:59.814864" elapsed="0.001008"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:13:59.816520" elapsed="0.000046"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:13:59.816108" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-10-16T01:13:59.816035" elapsed="0.000742"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:13:59.817336" elapsed="0.000092"/>
</return>
<status status="PASS" start="2026-10-16T01:13:59.816970" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-10-16T01:13:59.816914" elapsed="0.000693"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:13:59.817786" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:13:59.819661" 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-10-16T01:13:59.820593" elapsed="0.000356"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:13:59.821270" elapsed="0.000215"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:13:59.818549" elapsed="0.003032"/>
</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-10-16T01:13:59.387689" elapsed="0.434228"/>
</kw>
<msg time="2026-10-16T01:13:59.822062" 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-10-16T01:13:59.387051" elapsed="0.435085"/>
</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-10-16T01:13:59.386635" elapsed="0.435602"/>
</kw>
<msg time="2026-10-16T01:13:59.822289" 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-10-16T01:13:59.386171" elapsed="0.436184"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:13:59.823511" elapsed="0.000465"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:13:59.824238" elapsed="0.000196"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:13:59.824628" elapsed="0.000159"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:13:59.822913" elapsed="0.001939"/>
</kw>
<msg time="2026-10-16T01:13:59.824966" 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-10-16T01:13:59.385058" elapsed="0.439940"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:13:59.825600" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:13:59.825290" elapsed="0.000363"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-10-16T01:13:59.825758" elapsed="0.000039"/>
</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-10-16T01:13:59.384290" elapsed="0.441613"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:13:59.384133" elapsed="0.441866"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:13:59.827252" level="INFO">${member_ip} = 10.30.170.14</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-10-16T01:13:59.826945" elapsed="0.000341"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:13:59.828302" 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-10-16T01:13:59.828436" 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-10-16T01:13:59.828110" elapsed="0.000360"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:13:59.832379" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:13:59.831759" elapsed="0.000721"/>
</branch>
<status status="PASS" start="2026-10-16T01:13:59.831714" elapsed="0.000842"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:13:59.833290" 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-10-16T01:13:59.833557" 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-10-16T01:13:59.832896" elapsed="0.000791"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:13:59.834545" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.14" 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-10-16T01:13:59.834011" elapsed="0.000728"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:13:59.835757" 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-10-16T01:13:59.835038" elapsed="0.000836"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:13:59.837232" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:13:59.837302" 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-10-16T01:13:59.836962" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:13:59.837514" elapsed="0.000328"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:13:59.838663" level="INFO">Logging into '10.30.170.14:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:14:00.232930" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-194-generic x86_64)

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

 System information as of Fri Oct 16 01:13:56 UTC 2026

  System load:  0.53               Processes:             127
  Usage of /:   13.9% of 77.35GB   Users logged in:       0
  Memory usage: 6%                 IPv4 address for ens3: 10.30.170.14
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


[?2004h[jenkins@releng-12472-74-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-10-16T01:13:59.838418" elapsed="0.394677"/>
</kw>
<msg time="2026-10-16T01:14:00.233184" 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-10-16T01:13:59.838048" elapsed="0.395230"/>
</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-10-16T01:13:59.836243" elapsed="0.397268"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:14:00.234456" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-10-16T01:14:00.247184" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-10-16T01:14:00.247468" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:14:00.247623" 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-10-16T01:14:00.233978" elapsed="0.013795"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:00.248052" elapsed="0.000796"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:00.250090" 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-10-16T01:14:00.249501" elapsed="0.000810"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:14:00.250801" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:00.250479" elapsed="0.000402"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:00.250428" elapsed="0.000532"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:14:00.251354" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-10-16T01:14:00.251098" elapsed="0.000361"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:00.251058" elapsed="0.000480"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:14:00.251628" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:00.252980" elapsed="0.000373"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:14:00.253626" elapsed="0.000308"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:00.254164" elapsed="0.000151"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:14:00.252208" elapsed="0.002177"/>
</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-10-16T01:13:59.830938" elapsed="0.423642"/>
</kw>
<msg time="2026-10-16T01:14:00.254695" 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-10-16T01:13:59.830208" elapsed="0.424551"/>
</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-10-16T01:13:59.829614" elapsed="0.425217"/>
</kw>
<msg time="2026-10-16T01:14:00.254868" 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-10-16T01:13:59.828711" elapsed="0.426199"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:00.255513" 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-10-16T01:14:00.256001" elapsed="0.000133"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:00.256272" elapsed="0.000088"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:14:00.255185" elapsed="0.001221"/>
</kw>
<msg time="2026-10-16T01:14:00.256492" 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-10-16T01:13:59.827557" elapsed="0.428958"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:00.256992" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:14:00.256764" elapsed="0.000266"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-10-16T01:14:00.257068" elapsed="0.000026"/>
</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-10-16T01:13:59.826375" elapsed="0.430795"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:13:59.826144" elapsed="0.431062"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:14:00.258180" level="INFO">${member_ip} = 10.30.170.84</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-10-16T01:14:00.257960" elapsed="0.000244"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:00.258942" 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-10-16T01:14:00.259035" 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-10-16T01:14:00.258803" elapsed="0.000257"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:00.262237" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:00.261555" elapsed="0.000779"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:00.261515" elapsed="0.000894"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:00.263162" 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-10-16T01:14:00.263416" 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-10-16T01:14:00.262778" elapsed="0.000752"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:00.264398" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.84" 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-10-16T01:14:00.263866" elapsed="0.000680"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:00.265737" 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-10-16T01:14:00.264882" elapsed="0.000971"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:14:00.267200" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:14:00.267271" 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-10-16T01:14:00.266930" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:00.267485" elapsed="0.000321"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:14:00.268618" level="INFO">Logging into '10.30.170.84:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:14:00.682907" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-194-generic x86_64)

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

 System information as of Fri Oct 16 01:13:48 UTC 2026

  System load:  0.93               Processes:             128
  Usage of /:   13.9% of 77.35GB   Users logged in:       0
  Memory usage: 6%                 IPv4 address for ens3: 10.30.170.84
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


[?2004h[jenkins@releng-12472-74-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-10-16T01:14:00.268381" elapsed="0.414702"/>
</kw>
<msg time="2026-10-16T01:14:00.683175" 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-10-16T01:14:00.268013" elapsed="0.415256"/>
</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-10-16T01:14:00.266223" elapsed="0.417285"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:14:00.684432" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-10-16T01:14:00.697447" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-10-16T01:14:00.697884" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:14:00.698102" 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-10-16T01:14:00.683960" elapsed="0.014302"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:00.698647" elapsed="0.000773"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:00.701293" 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-10-16T01:14:00.700481" elapsed="0.001027"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:14:00.702237" elapsed="0.000042"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:00.701839" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:00.701666" elapsed="0.000823"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:14:00.703113" elapsed="0.000084"/>
</return>
<status status="PASS" start="2026-10-16T01:14:00.702757" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:00.702632" elapsed="0.000756"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:14:00.703550" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:00.705767" elapsed="0.000602"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:14:00.706819" elapsed="0.000324"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:00.707468" elapsed="0.000414"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:14:00.704586" elapsed="0.003431"/>
</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-10-16T01:14:00.260766" elapsed="0.447544"/>
</kw>
<msg time="2026-10-16T01:14:00.708535" 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-10-16T01:14:00.260109" elapsed="0.448500"/>
</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-10-16T01:14:00.259715" elapsed="0.449032"/>
</kw>
<msg time="2026-10-16T01:14:00.708803" 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-10-16T01:14:00.259210" elapsed="0.449655"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:00.709741" elapsed="0.000394"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:14:00.710388" elapsed="0.000186"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:00.710855" elapsed="0.000158"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:14:00.709246" elapsed="0.001838"/>
</kw>
<msg time="2026-10-16T01:14:00.711204" 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-10-16T01:14:00.258404" elapsed="0.452833"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:00.712065" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:14:00.711528" elapsed="0.000606"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-10-16T01:14:00.712197" elapsed="0.000039"/>
</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-10-16T01:14:00.257483" elapsed="0.454861"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:14:00.257306" elapsed="0.455086"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:13:59.384016" elapsed="1.328425"/>
</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-10-16T01:13:59.382255" elapsed="1.330270"/>
</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-10-16T01:14:00.712821" elapsed="0.000334"/>
</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-10-16T01:14:00.719840" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:00.719749" elapsed="0.000133"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:00.719730" elapsed="0.000173"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:00.720239" 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-10-16T01:14:00.720336" 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-10-16T01:14:00.720104" elapsed="0.000257"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:00.720840" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:14:00.720547" elapsed="0.000346"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:00.721354" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:14:00.721129" elapsed="0.000265"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:14:00.722136" 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-10-16T01:14:00.721936" elapsed="0.000425">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-10-16T01:14:00.722461" level="INFO">${status} = FAIL</msg>
<msg time="2026-10-16T01:14:00.722502" 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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:00.721548" elapsed="0.000976"/>
</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-10-16T01:14:00.722846" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:00.722592" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:00.722575" elapsed="0.000364"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:14:00.723616" level="INFO">${ip_address} = 10.30.170.180</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_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-10-16T01:14:00.723403" elapsed="0.000237"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-10-16T01:14:00.723808" elapsed="0.000032"/>
</return>
<msg time="2026-10-16T01:14:00.723945" level="INFO">${odl_ip} = 10.30.170.180</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-10-16T01:14:00.723159" elapsed="0.000810"/>
</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-10-16T01:14:00.724149" elapsed="0.000330"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:00.724962" level="INFO">index=10
host=10.30.170.180
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-10-16T01:14:00.725080" level="INFO">${karaf_connection_object} = index=10
host=10.30.170.180
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-10-16T01:14:00.724826" elapsed="0.000284"/>
</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-10-16T01:14:00.725278" elapsed="0.000248"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-10-16T01:14:00.725944" level="INFO">Logging into '10.30.170.180:8101' as 'karaf'.</msg>
<msg time="2026-10-16T01:14:01.555811" 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-10-16T01:14:00.725737" elapsed="0.830258"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:01.557686" elapsed="0.000362"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:14:01.558233" elapsed="0.000170"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:01.558543" elapsed="0.000095"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:14:01.557287" elapsed="0.001400"/>
</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-10-16T01:14:01.556504" elapsed="0.002273"/>
</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-10-16T01:14:00.719477" elapsed="0.839364"/>
</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-10-16T01:14:00.714204" elapsed="0.844699"/>
</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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:00.713626" elapsed="0.845341"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:14:00.713429" elapsed="0.845586"/>
</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-10-16T01:14:01.564284" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:01.564183" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:01.564159" elapsed="0.000200"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:01.564730" 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-10-16T01:14:01.564841" 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-10-16T01:14:01.564566" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:01.565300" 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-10-16T01:14:01.565056" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:01.565775" level="INFO">2</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:14:01.565524" elapsed="0.000354"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:14:01.566590" 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-10-16T01:14:01.566384" elapsed="0.000379">Dictionary does not contain key '2'.</status>
</kw>
<msg time="2026-10-16T01:14:01.566869" level="INFO">${status} = FAIL</msg>
<msg time="2026-10-16T01:14:01.566909" 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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:01.566032" elapsed="0.000898"/>
</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-10-16T01:14:01.567212" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:01.566999" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:01.566982" elapsed="0.000320"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:14:01.567961" level="INFO">${ip_address} = 10.30.170.14</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_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-10-16T01:14:01.567748" elapsed="0.000239"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-10-16T01:14:01.568030" elapsed="0.000030"/>
</return>
<msg time="2026-10-16T01:14:01.568159" level="INFO">${odl_ip} = 10.30.170.14</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-10-16T01:14:01.567481" elapsed="0.000701"/>
</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-10-16T01:14:01.568353" elapsed="0.000328"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:01.569097" level="INFO">index=12
host=10.30.170.14
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-10-16T01:14:01.569210" level="INFO">${karaf_connection_object} = index=12
host=10.30.170.14
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_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-10-16T01:14:01.568972" elapsed="0.000263"/>
</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-10-16T01:14:01.569396" elapsed="0.000244"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-10-16T01:14:01.570059" level="INFO">Logging into '10.30.170.14:8101' as 'karaf'.</msg>
<msg time="2026-10-16T01:14:02.480636" 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-10-16T01:14:01.569852" elapsed="0.911010"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:02.482496" elapsed="0.000371"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:14:02.483051" elapsed="0.000159"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:02.483350" elapsed="0.000096"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:14:02.482104" elapsed="0.001391"/>
</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-10-16T01:14:02.481348" elapsed="0.002191"/>
</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-10-16T01:14:01.563922" elapsed="0.919664"/>
</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-10-16T01:14:01.559658" elapsed="0.923974"/>
</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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:01.559283" elapsed="0.924398"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:14:01.559140" elapsed="0.924712"/>
</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-10-16T01:14:02.489305" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:02.489205" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:02.489182" elapsed="0.000198"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:02.489775" 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-10-16T01:14:02.489905" 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-10-16T01:14:02.489580" elapsed="0.000356"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:02.490398" 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-10-16T01:14:02.490147" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:02.490930" level="INFO">3</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:14:02.490623" elapsed="0.000351"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:14:02.491781" 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-10-16T01:14:02.491498" elapsed="0.000417">Dictionary does not contain key '3'.</status>
</kw>
<msg time="2026-10-16T01:14:02.492019" level="INFO">${status} = FAIL</msg>
<msg time="2026-10-16T01:14:02.492060" 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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:02.491128" elapsed="0.000954"/>
</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-10-16T01:14:02.492363" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:02.492150" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:02.492133" elapsed="0.000323"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:14:02.493130" level="INFO">${ip_address} = 10.30.170.84</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_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-10-16T01:14:02.492920" elapsed="0.000236"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-10-16T01:14:02.493198" elapsed="0.000031"/>
</return>
<msg time="2026-10-16T01:14:02.493329" level="INFO">${odl_ip} = 10.30.170.84</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-10-16T01:14:02.492641" elapsed="0.000711"/>
</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-10-16T01:14:02.493524" elapsed="0.000376"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:02.494217" level="INFO">index=14
host=10.30.170.84
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-10-16T01:14:02.494308" level="INFO">${karaf_connection_object} = index=14
host=10.30.170.84
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_erro...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-10-16T01:14:02.494116" elapsed="0.000216"/>
</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-10-16T01:14:02.494490" elapsed="0.000313"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-10-16T01:14:02.495192" level="INFO">Logging into '10.30.170.84:8101' as 'karaf'.</msg>
<msg time="2026-10-16T01:14:03.341436" 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-10-16T01:14:02.494986" elapsed="0.846624"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:03.343240" 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-10-16T01:14:03.343795" elapsed="0.000165"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:03.344169" 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-10-16T01:14:03.342849" elapsed="0.001466"/>
</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-10-16T01:14:03.342107" elapsed="0.002251"/>
</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-10-16T01:14:02.488897" elapsed="0.855508"/>
</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-10-16T01:14:02.484469" elapsed="0.859981"/>
</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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:02.484100" elapsed="0.860398"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:14:02.483960" elapsed="0.860577"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-10-16T01:14:00.713240" elapsed="2.631333"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-10-16T01:13:59.359253" elapsed="3.985388"/>
</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-10-16T01:14:03.345759" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:03.345614" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:03.345593" elapsed="0.000241"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:14:03.347811" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:03.347678" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:03.347655" elapsed="0.000237"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:14:03.348830" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:14:03.348439" elapsed="0.000424"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:14:03.349368" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:14:03.349053" elapsed="0.000339"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:14:03.349433" elapsed="0.000036"/>
</return>
<msg time="2026-10-16T01:14:03.349573" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:14:03.348131" elapsed="0.001465"/>
</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-10-16T01:14:03.352171" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:03.352029" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:03.352013" 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-10-16T01:14:03.353387" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:03.353280" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:03.353263" elapsed="0.000255"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:14:03.354105" 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-10-16T01:14:03.353663" elapsed="0.000483"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:03.354598" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:14:03.354384" elapsed="0.000251"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:14:03.483551" 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-10-16T01:14:03.356392" elapsed="0.127440"/>
</kw>
<msg time="2026-10-16T01:14:03.484043" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:14:03.484112" 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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:03.354895" elapsed="0.129269"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:14:03.605326" 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 "- "m "a "n "g "a "n "e "s "e "/ "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 "[78Cn "[A[78Cd
 "_ "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-10-16T01:14:03.486113" elapsed="0.119525"/>
</kw>
<msg time="2026-10-16T01:14:03.605895" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:14:03.605974" 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 "- "m "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:03.484465" elapsed="0.121558"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:03.606552" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:03.606219" elapsed="0.000475"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:03.606182" elapsed="0.000583"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:03.607568" 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 "- "m "a "n "g "a "n "e "s "e "/ "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 "[78Cn "[A[78Cd
 "_ "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-10-16T01:14:03.607002" elapsed="0.000728"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:03.608105" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:03.607857" elapsed="0.000388"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:03.607838" elapsed="0.000434"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:14:03.608309" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:03.610537" elapsed="0.000407"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:14:03.611178" elapsed="0.000170"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:03.611531" elapsed="0.000101"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:14:03.609875" elapsed="0.001975"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:14:03.608665" elapsed="0.003314"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:14:03.353051" elapsed="0.259009"/>
</kw>
<msg time="2026-10-16T01:14:03.612150" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:14:03.612190" 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 "- "m "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:03.352384" elapsed="0.259842"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:14:03.612381" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:14:03.612295" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:03.612278" elapsed="0.000182"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:14:03.612944" 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-10-16T01:14:03.613352" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:14:03.613419" 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-10-16T01:14:03.351752" elapsed="0.261754"/>
</kw>
<msg time="2026-10-16T01:14:03.613597" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:14:03.613638" 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 "- "m "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:03.350038" elapsed="0.263636"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:03.614024" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:03.613803" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:03.613785" elapsed="0.000311"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:14:03.349875" elapsed="0.264244"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:14:03.616626" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:03.616542" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:03.616526" elapsed="0.000240"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:14:03.617961" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:03.617832" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:03.617811" elapsed="0.000282"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:14:03.618603" 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-10-16T01:14:03.618238" elapsed="0.000402"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:03.619183" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:14:03.618964" elapsed="0.000256"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:14:03.739948" 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-10-16T01:14:03.620768" elapsed="0.119418"/>
</kw>
<msg time="2026-10-16T01:14:03.740401" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:14:03.740472" 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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:03.619436" elapsed="0.121086"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:14:03.870255" 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 "- "m "a "n "g "a "n "e "s "e "/ "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 "[78Cn "[A[78Cd
 "_ "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-10-16T01:14:03.742426" elapsed="0.128056"/>
</kw>
<msg time="2026-10-16T01:14:03.870673" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:14:03.870779" 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 "- "m "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:03.740924" elapsed="0.129906"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:03.871342" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:03.871024" elapsed="0.000458"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:03.870989" elapsed="0.000523"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:03.872348" 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 "- "m "a "n "g "a "n "e "s "e "/ "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 "[78Cn "[A[78Cd
 "_ "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-10-16T01:14:03.871711" elapsed="0.000762"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:03.873193" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:03.872937" elapsed="0.000396"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:03.872571" elapsed="0.000788"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:14:03.873396" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:03.875639" elapsed="0.000432"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:14:03.876306" elapsed="0.000167"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:03.876655" elapsed="0.000204"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:14:03.874992" elapsed="0.001989"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:14:03.873822" elapsed="0.003256"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:14:03.617569" elapsed="0.259586"/>
</kw>
<msg time="2026-10-16T01:14:03.877240" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:14:03.877280" 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 "- "m "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:03.616964" elapsed="0.260351"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:14:03.877468" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:14:03.877384" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:03.877366" 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 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-10-16T01:14:03.878097" 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-10-16T01:14:03.878450" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:14:03.878515" 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-10-16T01:14:03.616296" elapsed="0.262305"/>
</kw>
<msg time="2026-10-16T01:14:03.878687" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:14:03.878772" 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 "- "m "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:03.614388" elapsed="0.264439"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:03.879157" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:03.878913" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:03.878893" elapsed="0.000336"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:14:03.614248" elapsed="0.265003"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:14:03.881772" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:03.881646" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:03.881630" 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-10-16T01:14:03.882973" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:03.882844" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:03.882822" elapsed="0.000282"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:14:03.883615" 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-10-16T01:14:03.883250" elapsed="0.000403"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:03.884226" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:14:03.883992" elapsed="0.000273"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:14:04.011817" 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-10-16T01:14:03.885901" elapsed="0.126123"/>
</kw>
<msg time="2026-10-16T01:14:04.012199" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:14:04.012269" 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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:03.884486" elapsed="0.127832"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:14:04.179512" 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 "- "m "a "n "g "a "n "e "s "e "/ "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 "[78Cn "[A[78Cd
 "_ "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-10-16T01:14:04.014135" elapsed="0.165798"/>
</kw>
<msg time="2026-10-16T01:14:04.180154" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:14:04.180228" 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 "- "m "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:04.012628" elapsed="0.167653"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:04.180939" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:04.180490" elapsed="0.000624"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:04.180451" elapsed="0.000695"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:04.182011" 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 "- "m "a "n "g "a "n "e "s "e "/ "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 "[78Cn "[A[78Cd
 "_ "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-10-16T01:14:04.181335" elapsed="0.000872"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:04.182579" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:04.182333" elapsed="0.000424"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:04.182315" elapsed="0.000470"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:14:04.182821" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:04.185248" elapsed="0.000286"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:14:04.185855" elapsed="0.000167"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:04.186208" 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-10-16T01:14:04.184283" elapsed="0.002125"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:14:04.183172" elapsed="0.003336"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:14:03.882572" elapsed="0.304013"/>
</kw>
<msg time="2026-10-16T01:14:04.186667" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:14:04.186794" 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 "- "m "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:03.882022" elapsed="0.304810"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:14:04.186988" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:14:04.186902" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:04.186885" elapsed="0.000181"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:14:04.187431" 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-10-16T01:14:04.187839" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:14:04.187905" 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-10-16T01:14:03.881399" elapsed="0.306591"/>
</kw>
<msg time="2026-10-16T01:14:04.188076" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:14:04.188115" 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 "- "m "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:03.879516" elapsed="0.308634"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:04.188435" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:04.188217" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:04.188201" elapsed="0.000304"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:14:03.879375" elapsed="0.309152"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:14:03.349652" elapsed="0.838907"/>
</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-10-16T01:14:03.347438" elapsed="0.841182"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-10-16T01:14:03.345431" elapsed="0.843246"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:03.344988" elapsed="0.843798"/>
</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-10-16T01:13:59.356211" elapsed="4.832631"/>
</kw>
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-10-16T01:14:04.189674" 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-10-16T01:14:04.189370" elapsed="0.000367"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="PASS" start="2026-10-16T01:14:04.189882" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:14:04.189807" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:04.189790" elapsed="0.000163"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:04.190131" elapsed="0.000019"/>
</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-10-16T01:14:04.190301" elapsed="0.000051"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:04.190509" 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-10-16T01:14:04.190693" elapsed="0.000052"/>
</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-10-16T01:14:04.190971" elapsed="0.000022"/>
</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-10-16T01:14:04.189095" elapsed="0.001955"/>
</kw>
<status status="PASS" start="2026-10-16T01:13:59.355813" elapsed="4.835285"/>
</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-10-16T01:14:04.192603" elapsed="0.000258"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:14:04.192356" 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-10-16T01:14:04.193832" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:04.193741" elapsed="0.000134"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:04.193691" 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-10-16T01:14:04.196010" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:04.195927" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:04.195909" elapsed="0.000164"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:14:04.196990" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:14:04.196627" elapsed="0.000388"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:14:04.197440" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:14:04.197166" elapsed="0.000298"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:14:04.197505" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:14:04.197631" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:14:04.196276" elapsed="0.001378"/>
</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-10-16T01:14:04.200233" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:04.200146" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:04.200129" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:14:04.201380" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:04.201297" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:04.201281" elapsed="0.000159"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:14:04.201890" 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-10-16T01:14:04.201595" elapsed="0.000320"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:04.202250" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:14:04.202077" elapsed="0.000197"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:14:04.275997" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:14:04.202865" elapsed="0.073307"/>
</kw>
<msg time="2026-10-16T01:14:04.276327" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:14:04.276368" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:04.202424" elapsed="0.073979"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:14:04.366633" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:14:04.277150" elapsed="0.089930"/>
</kw>
<msg time="2026-10-16T01:14:04.367486" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:14:04.367551" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:04.276566" elapsed="0.091041"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:04.368213" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:04.367796" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:04.367749" elapsed="0.000612"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:04.369355" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:14:04.368631" elapsed="0.000846"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:04.369920" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:04.369568" elapsed="0.000457"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:04.369544" elapsed="0.000516"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:14:04.370110" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:04.374223" elapsed="0.000819"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:14:04.376936" elapsed="0.001083"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:04.379891" 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-10-16T01:14:04.371433" elapsed="0.009033"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:14:04.370590" elapsed="0.010061"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:14:04.201042" elapsed="0.179776"/>
</kw>
<msg time="2026-10-16T01:14:04.380945" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:14:04.381003" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:04.200439" elapsed="0.180617"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:14:04.381283" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-10-16T01:14:04.381157" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:04.381133" elapsed="0.000266"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:14:04.382202" elapsed="0.000037"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:04.382665" elapsed="0.000052"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:14:04.382798" elapsed="0.000023"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:14:04.199847" elapsed="0.183079"/>
</kw>
<msg time="2026-10-16T01:14:04.383051" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:14:04.383109" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:04.198037" elapsed="0.185125"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:04.383612" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:04.383260" elapsed="0.000426"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:04.383237" elapsed="0.000517"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:14:04.197899" elapsed="0.185889"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:14:04.387670" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:04.387545" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:04.387519" elapsed="0.000279"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:14:04.389482" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:04.389356" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:04.389331" elapsed="0.000245"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:14:04.390174" 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-10-16T01:14:04.389828" elapsed="0.000383"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:04.390778" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:14:04.390449" elapsed="0.000368"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:14:04.463622" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:14:04.391653" elapsed="0.072190"/>
</kw>
<msg time="2026-10-16T01:14:04.464003" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:14:04.464044" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:04.391047" elapsed="0.073032"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:14:04.556566" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:14:04.464688" elapsed="0.092225"/>
</kw>
<msg time="2026-10-16T01:14:04.557158" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:14:04.557202" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:04.464262" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:04.557944" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:04.557372" elapsed="0.000653"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:04.557326" elapsed="0.000731"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:04.558776" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:14:04.558253" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:04.559128" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:04.558927" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:04.558910" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:14:04.559259" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:04.562072" 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-10-16T01:14:04.563855" elapsed="0.000483"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:04.565628" elapsed="0.000785"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:14:04.560285" elapsed="0.006198"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:14:04.559644" elapsed="0.006958"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:14:04.388928" elapsed="0.177753"/>
</kw>
<msg time="2026-10-16T01:14:04.566798" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:14:04.566838" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:04.388016" elapsed="0.178857"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:14:04.567033" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:14:04.566943" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:04.566926" elapsed="0.000186"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:14:04.567448" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:04.567925" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:14:04.567991" 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-10-16T01:14:04.387112" elapsed="0.180966"/>
</kw>
<msg time="2026-10-16T01:14:04.568163" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:14:04.568202" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:04.384170" elapsed="0.184068"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:04.568522" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:04.568305" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:04.568289" elapsed="0.000304"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:14:04.383965" elapsed="0.184651"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:14:04.571145" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:04.571060" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:04.571043" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:14:04.572328" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:04.572244" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:04.572228" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:14:04.572814" 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-10-16T01:14:04.572535" elapsed="0.000304"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:04.573170" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:14:04.572999" elapsed="0.000195"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:14:04.629989" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:14:04.573785" elapsed="0.056381"/>
</kw>
<msg time="2026-10-16T01:14:04.630321" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:14:04.630363" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:04.573344" elapsed="0.057054"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:14:04.712947" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:14:04.631032" elapsed="0.082090"/>
</kw>
<msg time="2026-10-16T01:14:04.713280" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:14:04.713322" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:04.630560" elapsed="0.082796"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:04.713634" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:04.713426" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:04.713407" elapsed="0.000383"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:04.714320" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:14:04.713975" elapsed="0.000427"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:04.714666" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:04.714463" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:04.714446" elapsed="0.000346"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:14:04.714823" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:04.717301" 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-10-16T01:14:04.719013" elapsed="0.000451"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:04.720641" elapsed="0.000469"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:14:04.715616" elapsed="0.005560"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:14:04.715089" elapsed="0.006208"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:14:04.571986" elapsed="0.149388"/>
</kw>
<msg time="2026-10-16T01:14:04.721455" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:14:04.721494" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:04.571353" elapsed="0.150176"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:14:04.721682" elapsed="0.000064"/>
</return>
<status status="PASS" start="2026-10-16T01:14:04.721597" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:04.721581" 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-10-16T01:14:04.722176" 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-10-16T01:14:04.722474" elapsed="0.000021"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:14:04.722537" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:14:04.570718" elapsed="0.151904"/>
</kw>
<msg time="2026-10-16T01:14:04.722726" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:14:04.722781" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:04.568913" elapsed="0.153904"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:04.723099" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:04.722883" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:04.722867" elapsed="0.000303"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:14:04.568773" elapsed="0.154419"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:14:04.197740" elapsed="0.525479"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:14:04.195602" elapsed="0.527676"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:14:04.193448" elapsed="0.529890"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:04.193057" elapsed="0.530326"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:14:04.192000" elapsed="0.531434"/>
</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-10-16T01:14:04.731507" elapsed="0.000188"/>
</kw>
<msg time="2026-10-16T01:14:04.731768" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:04.730973" elapsed="0.000846"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:14:04.730562" elapsed="0.001324"/>
</kw>
<msg time="2026-10-16T01:14:04.731925" 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-10-16T01:14:04.727758" elapsed="0.004207"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:14:04.727369" elapsed="0.004659"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:04.732496" 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-10-16T01:14:04.732268" elapsed="0.000270"/>
</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-10-16T01:14:04.735452" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:14:04.735108" elapsed="0.000370"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:14:04.735959" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:14:04.735627" elapsed="0.000357"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:14:04.736030" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:14:04.736156" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:14:04.734750" elapsed="0.001429"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:14:04.736326" elapsed="0.000301"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:14:04.737125" 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-10-16T01:14:04.736821" elapsed="0.000329"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:14:04.737522" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:14:04.737296" elapsed="0.000250"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:14:04.737934" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:14:04.737682" elapsed="0.000275"/>
</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-10-16T01:14:04.740021" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:14:04.739754" elapsed="0.000291"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:14:04.740086" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:14:04.740205" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:14:04.739413" elapsed="0.000815"/>
</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-10-16T01:14:04.758814" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:14:04.758476" elapsed="0.000364"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:14:04.759563" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:14:04.759305" elapsed="0.000345">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:14:04.759769" 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-10-16T01:14:04.758992" elapsed="0.000801"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:14:04.760280" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:14:04.759965" elapsed="0.000340"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:14:04.760584" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:14:04.760828" 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-10-16T01:14:04.760466" elapsed="0.000387"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:04.761268" 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-10-16T01:14:04.761048" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:04.762219" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:14:04.761976" elapsed="0.000285"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:14:04.762773" 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-10-16T01:14:04.762432" elapsed="0.000366"/>
</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-10-16T01:14:04.763091" elapsed="0.000020"/>
</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-10-16T01:14:04.763271" elapsed="0.000022"/>
</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-10-16T01:14:04.763451" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:14:04.762964" elapsed="0.000538"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:14:04.762848" elapsed="0.000681"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:14:04.763568" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:14:04.763713" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:14:04.761616" elapsed="0.002133"/>
</kw>
<status status="PASS" start="2026-10-16T01:14:04.761368" 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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:04.763946" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:04.763802" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:04.761350" elapsed="0.002665"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:14:04.764562" 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-10-16T01:14:04.764167" elapsed="0.000420"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:14:04.764631" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:14:04.757979" elapsed="0.006786"/>
</kw>
<msg time="2026-10-16T01:14:04.764813" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:04.753011" elapsed="0.011893"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:04.769088" elapsed="0.000066"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:04.773362" elapsed="0.000067"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:04.778858" elapsed="0.000068"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:04.779256" 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-10-16T01:14:04.779643" elapsed="0.000071"/>
</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-10-16T01:14:04.780197" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:04.780052" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:14:04.780038" 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-10-16T01:14:04.780422" 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-10-16T01:14:04.780602" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:04.780827" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:14:04.780010" elapsed="0.000867"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:14:04.779881" elapsed="0.001030"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:04.781220" elapsed="0.000052"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:14:04.781367" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:14:04.781545" 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-10-16T01:14:04.750809" elapsed="0.030784"/>
</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-10-16T01:14:04.784001" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:14:04.783789" elapsed="0.000286">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:14:04.784258" 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-10-16T01:14:04.783308" elapsed="0.000991"/>
</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-10-16T01:14:04.784830" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:04.784429" elapsed="0.000476"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:14:04.785444" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:14:04.785178" elapsed="0.000290"/>
</kw>
<status status="PASS" start="2026-10-16T01:14:04.784961" elapsed="0.000562"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:04.784391" elapsed="0.001186"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:14:04.786488" 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-10-16T01:14:04.785964" elapsed="0.000567"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:14:04.786621" elapsed="0.000059"/>
</return>
<msg time="2026-10-16T01:14:04.786923" 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-manganese/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-10-16T01:14:04.782390" elapsed="0.004580"/>
</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-10-16T01:14:04.789182" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:14:04.788977" elapsed="0.000266">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:14:04.789426" 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-10-16T01:14:04.788540" elapsed="0.000927"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:14:04.789838" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-16T01:14:04.789598" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:04.789559" elapsed="0.000432"/>
</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-10-16T01:14:04.790298" elapsed="0.000052"/>
</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-10-16T01:14:04.790678" elapsed="0.000114"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:14:04.790882" elapsed="0.000028"/>
</return>
<msg time="2026-10-16T01:14:04.791118" 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-manganese/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-10-16T01:14:04.787681" elapsed="0.003484"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:04.794793" 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-10-16T01:14:04.794459" elapsed="0.000426"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:04.795579" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:14:04.795279" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:14:05.265381" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:14:05.265597" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:14:05.265882" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:14:04.796239" elapsed="0.471618">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:14:04.795918" elapsed="0.472321">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:14:05.268958" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:05.268392" elapsed="0.000754"/>
</branch>
<status status="FAIL" start="2026-10-16T01:14:04.795879" elapsed="0.473390">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:14:05.270822" elapsed="0.000149"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:14:05.271478" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:05.271271" elapsed="0.000338"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:14:05.271183" elapsed="0.000608"/>
</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-10-16T01:14:05.272447" elapsed="0.000113"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:14:05.272832" elapsed="0.000063"/>
</return>
<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="FAIL" start="2026-10-16T01:14:04.792059" elapsed="0.481092">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:14:05.273688" elapsed="0.000101"/>
</return>
<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="FAIL" start="2026-10-16T01:14:04.742300" elapsed="0.531820">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:14:05.274674" elapsed="0.000293"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:05.274316" elapsed="0.001575"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:14:05.274279" elapsed="0.001686"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:14:05.276040" elapsed="0.000032"/>
</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="FAIL" start="2026-10-16T01:14:04.741672" elapsed="0.534587">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:14:04.740287" elapsed="0.536193">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:14:04.740272" elapsed="0.536309">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:05.277478" elapsed="0.000054"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:14:05.278140" elapsed="0.000046"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:05.278517" elapsed="0.000042"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:14:05.279027" elapsed="0.000049"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:14:05.279484" elapsed="0.000045"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:14:05.279997" elapsed="0.000046"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:14:05.280373" elapsed="0.000041"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:14:05.280505" elapsed="0.000033"/>
</return>
<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="FAIL" start="2026-10-16T01:14:04.738929" elapsed="0.541853">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:14:05.280926" elapsed="0.000034"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:14:04.738315" elapsed="0.542812">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:05.281644" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:05.281318" elapsed="0.000490"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:05.282173" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:05.281861" elapsed="0.000420"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:05.282644" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:05.282330" elapsed="0.000463"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:14:05.281272" elapsed="0.001574"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:14:04.738168" elapsed="0.544769">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:14:04.738001" elapsed="0.545058">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:14:05.283173" elapsed="0.000032"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:14:04.734131" elapsed="0.549244">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:05.283815" elapsed="0.000046"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:05.284306" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:05.283994" elapsed="0.000416"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:14:05.283959" elapsed="0.000499"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:05.284779" elapsed="0.000044"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:05.285169" elapsed="0.000041"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:14:05.285299" elapsed="0.000030"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:14:04.733408" elapsed="0.552091">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:14:04.733213" elapsed="0.552420">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:14:04.733100" elapsed="0.552767">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:14:04.732770" elapsed="0.553287">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:05.286532" elapsed="0.000049"/>
</kw>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:14:04.723643" elapsed="0.563177">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:14:04.191182" elapsed="1.095955">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:14:05.290410" elapsed="0.000535"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:14:05.289846" elapsed="0.001211"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:14:05.293162" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:05.292960" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:05.292921" elapsed="0.000384"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:14:05.298543" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:05.298343" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:05.298306" elapsed="0.000380"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:14:05.300820" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:14:05.300032" elapsed="0.000848"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:14:05.301902" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:14:05.301214" elapsed="0.000742"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:14:05.302049" elapsed="0.000060"/>
</return>
<msg time="2026-10-16T01:14:05.302352" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:14:05.299188" elapsed="0.003231"/>
</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-10-16T01:14:05.308193" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:05.308000" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:05.307961" elapsed="0.000372"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:14:05.310858" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:05.310684" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:05.310641" elapsed="0.000303"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:14:05.311457" 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-10-16T01:14:05.311141" elapsed="0.000350"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:05.312005" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:14:05.311762" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:14:05.386677" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:14:05.313201" elapsed="0.073688"/>
</kw>
<msg time="2026-10-16T01:14:05.387055" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:14:05.387097" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:05.312340" elapsed="0.074793"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:14:05.481332" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:14:05.387755" elapsed="0.093796"/>
</kw>
<msg time="2026-10-16T01:14:05.481736" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:14:05.481792" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:05.387296" elapsed="0.094531"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:05.482102" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:05.481897" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:05.481879" elapsed="0.000316"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:05.482731" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:14:05.482374" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:05.483076" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:05.482879" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:05.482863" elapsed="0.000306"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:14:05.483200" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:05.485973" elapsed="0.000608"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:14:05.487868" elapsed="0.000481"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:05.489546" 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-10-16T01:14:05.484253" elapsed="0.005711"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:14:05.483479" elapsed="0.006605"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:14:05.310086" elapsed="0.180075"/>
</kw>
<msg time="2026-10-16T01:14:05.490245" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:14:05.490284" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:05.308660" elapsed="0.181660"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:14:05.490473" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:14:05.490389" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:05.490372" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:14:05.490915" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:05.491212" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:14:05.491276" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:14:05.307289" elapsed="0.184071"/>
</kw>
<msg time="2026-10-16T01:14:05.491442" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:14:05.491487" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:05.303410" elapsed="0.188113"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:05.492127" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:05.491592" elapsed="0.000587"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:05.491575" elapsed="0.000626"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:14:05.303012" elapsed="0.189210"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:14:05.494627" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:05.494542" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:05.494525" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:14:05.495898" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:05.495808" elapsed="0.000132"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:05.495736" elapsed="0.000224"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:14:05.496325" 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-10-16T01:14:05.496102" elapsed="0.000248"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:05.496676" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:14:05.496508" elapsed="0.000208"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:14:05.571327" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:14:05.497310" elapsed="0.074194"/>
</kw>
<msg time="2026-10-16T01:14:05.571662" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:14:05.571725" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:05.496886" elapsed="0.074888"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:14:05.648339" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:14:05.572367" elapsed="0.076154"/>
</kw>
<msg time="2026-10-16T01:14:05.648686" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:14:05.648765" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:05.571940" elapsed="0.076863"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:05.649086" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:05.648876" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:05.648857" elapsed="0.000325"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:05.649731" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:14:05.649364" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:05.650083" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:05.649883" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:05.649867" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:14:05.650208" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:05.652672" elapsed="0.000675"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:14:05.654573" elapsed="0.000490"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:05.656415" elapsed="0.000473"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:14:05.651020" elapsed="0.005936"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:14:05.650475" elapsed="0.006598"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:14:05.495473" elapsed="0.161677"/>
</kw>
<msg time="2026-10-16T01:14:05.657233" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:14:05.657272" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:05.494898" elapsed="0.162411"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:14:05.657464" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:14:05.657378" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:05.657361" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:14:05.657960" elapsed="0.000062"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:05.658300" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:14:05.658365" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:14:05.494253" elapsed="0.164197"/>
</kw>
<msg time="2026-10-16T01:14:05.658532" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:14:05.658570" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:05.492474" elapsed="0.166131"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:05.658923" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:05.658672" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:05.658656" elapsed="0.000338"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:14:05.492332" elapsed="0.166684"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:14:05.661426" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:05.661335" elapsed="0.000133"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:05.661318" elapsed="0.000171"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:14:05.662577" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:05.662493" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:05.662476" elapsed="0.000164"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:14:05.663042" 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-10-16T01:14:05.662817" elapsed="0.000250"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:05.663389" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:14:05.663225" elapsed="0.000188"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:14:05.740799" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:14:05.664012" elapsed="0.076958"/>
</kw>
<msg time="2026-10-16T01:14:05.741141" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:14:05.741182" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:05.663568" elapsed="0.077649"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:14:05.815365" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:14:05.741833" elapsed="0.073710"/>
</kw>
<msg time="2026-10-16T01:14:05.815725" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:14:05.815781" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:05.741380" elapsed="0.074439"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:05.816097" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:05.815891" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:05.815872" elapsed="0.000319"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:05.816755" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:14:05.816372" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:05.817096" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:05.816899" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:05.816882" elapsed="0.000348"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:14:05.817261" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:05.819777" 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-10-16T01:14:05.821464" elapsed="0.000488"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:05.823318" 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-10-16T01:14:05.818082" elapsed="0.005785"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:14:05.817532" elapsed="0.006452"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:14:05.662238" elapsed="0.161824"/>
</kw>
<msg time="2026-10-16T01:14:05.824144" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:14:05.824184" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:05.661633" elapsed="0.162586"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:14:05.824374" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:14:05.824290" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:05.824273" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:14:05.824820" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:05.825120" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:14:05.825184" 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-10-16T01:14:05.661045" elapsed="0.164224"/>
</kw>
<msg time="2026-10-16T01:14:05.825351" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:14:05.825390" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:05.659259" elapsed="0.166239"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:05.825816" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:05.825569" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:05.825553" elapsed="0.000336"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:14:05.659123" elapsed="0.166788"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:14:05.302549" elapsed="0.523390"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:14:05.297632" elapsed="0.528358"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:14:05.292330" elapsed="0.533712"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:05.291394" elapsed="0.534690"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:14:05.289014" elapsed="0.537119"/>
</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-10-16T01:14:05.828825" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:14:05.828464" elapsed="0.000386"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:14:05.829268" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:14:05.828999" elapsed="0.000293"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:14:05.829332" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:14:05.829455" 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-10-16T01:14:05.828114" elapsed="0.001363"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:05.831663" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:05.831430" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:05.831413" elapsed="0.000355"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:05.832097" 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-10-16T01:14:05.832190" 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-10-16T01:14:05.831966" elapsed="0.000248"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:05.832680" level="INFO">Attempting to execute command "sudo mn -c" on remote system "10.30.171.104" 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-10-16T01:14:05.832397" elapsed="0.000341"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:05.833240" 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-10-16T01:14:05.832936" elapsed="0.000328"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:14:05.834122" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:14:05.834191" 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-10-16T01:14:05.833844" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:05.834360" elapsed="0.000470"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:14:05.835598" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:14:06.537662" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:14:06 UTC 2026

  System load:  0.12               Processes:             111
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


[?2004h[jenkins@releng-12472-74-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-10-16T01:14:05.835362" elapsed="0.702413"/>
</kw>
<msg time="2026-10-16T01:14:06.537840" 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-10-16T01:14:05.834996" elapsed="0.702903"/>
</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-10-16T01:14:05.833455" elapsed="0.704523"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:14:06.538370" level="INFO">Executing command 'sudo mn -c'.</msg>
<msg time="2026-10-16T01:14:07.791258" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:14:07.791550" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:14:07.791643" 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-10-16T01:14:06.538205" elapsed="1.253490"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:07.792179" elapsed="0.000580"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:07.793924" 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-10-16T01:14:07.793288" 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-10-16T01:14:07.794441" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:07.794202" elapsed="0.000340"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:07.794155" elapsed="0.000436"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:14:07.795053" elapsed="0.000065"/>
</return>
<status status="PASS" start="2026-10-16T01:14:07.794734" elapsed="0.000455"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:07.794669" elapsed="0.000572"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:14:07.795313" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:07.796989" elapsed="0.000652"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:14:07.798280" elapsed="0.000331"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:07.798992" elapsed="0.000215"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:14:07.796031" elapsed="0.003285"/>
</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-10-16T01:14:05.831006" elapsed="1.968465"/>
</kw>
<msg time="2026-10-16T01:14:07.799578" 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-10-16T01:14:05.830460" elapsed="1.969225"/>
</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-10-16T01:14:05.830051" elapsed="1.969856"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:07.804063" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:07.803474" elapsed="0.000706"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:07.803436" elapsed="0.000798"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:07.805005" 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-10-16T01:14:07.805215" 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-10-16T01:14:07.804667" elapsed="0.000601"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:07.806380" 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.104" 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-10-16T01:14:07.805675" elapsed="0.000800"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:07.807636" 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-10-16T01:14:07.806952" elapsed="0.000740"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:14:07.810012" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:14:07.810172" 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-10-16T01:14:07.809393" elapsed="0.000829"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:07.810584" elapsed="0.000705"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:14:07.813086" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:14:08.214335" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:14:06 UTC 2026

  System load:  0.12               Processes:             111
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:14:06 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:14:07.812516" elapsed="0.401993"/>
</kw>
<msg time="2026-10-16T01:14:08.214596" 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-10-16T01:14:07.811652" elapsed="0.403029"/>
</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-10-16T01:14:07.808176" elapsed="0.406740"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:14:08.215497" 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-10-16T01:14:08.259179" level="INFO">Command exited with return code -1.</msg>
<msg time="2026-10-16T01:14:08.259456" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:14:08.259545" 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-10-16T01:14:08.215233" elapsed="0.044360"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:08.260055" elapsed="0.000517"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:08.261755" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:14:08.261135" 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-10-16T01:14:08.262280" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:08.262030" elapsed="0.000355"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:08.261979" elapsed="0.000456"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:14:08.262753" elapsed="0.000127"/>
</return>
<status status="PASS" start="2026-10-16T01:14:08.262542" elapsed="0.000408"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:08.262512" elapsed="0.000487"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:14:08.263068" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:08.264729" elapsed="0.000719"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:14:08.265909" elapsed="0.000329"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:08.266548" 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-10-16T01:14:08.263758" elapsed="0.003150"/>
</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-10-16T01:14:07.802460" elapsed="0.464602"/>
</kw>
<msg time="2026-10-16T01:14:08.267168" 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-10-16T01:14:07.801242" elapsed="0.466031"/>
</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-10-16T01:14:07.800253" elapsed="0.467180"/>
</kw>
<arg>${tools_system}</arg>
<status status="PASS" start="2026-10-16T01:14:05.829715" elapsed="2.437833"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:14:08.268472" level="INFO">${ovs_opt} = </msg>
<var>${ovs_opt}</var>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:14:08.267931" elapsed="0.000595"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-10-16T01:14:08.270148" level="INFO">${ovs_opt} =   tcp:10.30.170.180:6640</msg>
<var>${ovs_opt}</var>
<arg>${ovs_opt}</arg>
<arg>${SPACE}tcp:${ODL_SYSTEM_${index}_IP}:${ovs_mgr_port}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-10-16T01:14:08.269333" elapsed="0.000870"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:08.271179" level="INFO">  tcp:10.30.170.180:6640</msg>
<arg>${ovs_opt}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:14:08.270636" elapsed="0.000633"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:14:08.269017" elapsed="0.002318"/>
</iter>
<iter>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-10-16T01:14:08.272630" level="INFO">${ovs_opt} =   tcp:10.30.170.180:6640  tcp:10.30.170.14:6640</msg>
<var>${ovs_opt}</var>
<arg>${ovs_opt}</arg>
<arg>${SPACE}tcp:${ODL_SYSTEM_${index}_IP}:${ovs_mgr_port}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-10-16T01:14:08.271870" elapsed="0.000814"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:08.273646" level="INFO">  tcp:10.30.170.180:6640  tcp:10.30.170.14:6640</msg>
<arg>${ovs_opt}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:14:08.273155" elapsed="0.000613"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:14:08.271516" elapsed="0.002341"/>
</iter>
<iter>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-10-16T01:14:08.275119" level="INFO">${ovs_opt} =   tcp:10.30.170.180:6640  tcp:10.30.170.14:6640  tcp:10.30.170.84:6640</msg>
<var>${ovs_opt}</var>
<arg>${ovs_opt}</arg>
<arg>${SPACE}tcp:${ODL_SYSTEM_${index}_IP}:${ovs_mgr_port}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-10-16T01:14:08.274336" elapsed="0.000839"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:08.276140" level="INFO">  tcp:10.30.170.180:6640  tcp:10.30.170.14:6640  tcp:10.30.170.84:6640</msg>
<arg>${ovs_opt}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:14:08.275594" elapsed="0.000637"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:14:08.274035" elapsed="0.002260"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:14:08.268649" elapsed="0.007707"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:08.281154" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:08.280485" elapsed="0.000787"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:08.280447" elapsed="0.000877"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:08.282094" 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-10-16T01:14:08.282296" 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-10-16T01:14:08.281809" elapsed="0.000542"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:08.283456" level="INFO">Attempting to execute command "sudo ovs-vsctl set-manager   tcp:10.30.170.180:6640  tcp:10.30.170.14:6640  tcp:10.30.170.84:6640" on remote system "10.30.171.104" 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-10-16T01:14:08.282815" elapsed="0.000737"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:08.284649" 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-10-16T01:14:08.283988" elapsed="0.000745"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:14:08.286301" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:14:08.286397" 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-10-16T01:14:08.285944" elapsed="0.000483"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:08.286632" elapsed="0.000444"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:14:08.288175" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:14:08.700560" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:14:06 UTC 2026

  System load:  0.12               Processes:             111
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:14:08 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:14:08.287850" elapsed="0.412899"/>
</kw>
<msg time="2026-10-16T01:14:08.700845" 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-10-16T01:14:08.287304" elapsed="0.413634"/>
</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-10-16T01:14:08.285189" elapsed="0.415864"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:14:08.701627" level="INFO">Executing command 'sudo ovs-vsctl set-manager   tcp:10.30.170.180:6640  tcp:10.30.170.14:6640  tcp:10.30.170.84:6640'.</msg>
<msg time="2026-10-16T01:14:08.735526" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:14:08.735684" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:14:08.735763" 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-10-16T01:14:08.701354" elapsed="0.034454"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:08.736041" elapsed="0.000344"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:08.737165" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:14:08.736761" elapsed="0.000458"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:14:08.737500" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:08.737327" elapsed="0.000244"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:08.737293" elapsed="0.000311"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:14:08.737824" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-10-16T01:14:08.737671" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:08.737652" elapsed="0.000293"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:14:08.737989" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:08.739074" elapsed="0.000461"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:14:08.739828" elapsed="0.000485"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:08.740512" elapsed="0.000126"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:14:08.738422" elapsed="0.002407"/>
</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-10-16T01:14:08.279487" elapsed="0.461446"/>
</kw>
<msg time="2026-10-16T01:14:08.741001" 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-10-16T01:14:08.277829" elapsed="0.463239"/>
</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-10-16T01:14:08.276789" elapsed="0.464381"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:08.749046" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:08.748671" elapsed="0.000447"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:08.748646" elapsed="0.000505"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:08.749594" 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-10-16T01:14:08.749740" 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-10-16T01:14:08.749423" elapsed="0.000352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:08.750452" level="INFO">Attempting to execute command "sudo ovs-vsctl show" on remote system "10.30.171.104" 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-10-16T01:14:08.750055" elapsed="0.000456"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:08.751189" 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-10-16T01:14:08.750769" elapsed="0.000453"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:14:08.752376" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:14:08.752471" 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-10-16T01:14:08.752012" elapsed="0.000489"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:08.752725" elapsed="0.000436"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:14:08.754512" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:14:09.159485" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:14:06 UTC 2026

  System load:  0.12               Processes:             111
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:14:08 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:14:08.753932" elapsed="0.405754"/>
</kw>
<msg time="2026-10-16T01:14:09.159806" 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-10-16T01:14:08.753383" elapsed="0.406518"/>
</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-10-16T01:14:08.751482" elapsed="0.408535"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:14:09.160568" level="INFO">Executing command 'sudo ovs-vsctl show'.</msg>
<msg time="2026-10-16T01:14:09.184149" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:14:09.184308" level="INFO">${stdout} = ef5e6311-6bc3-45eb-bec5-977d25c19a20
    Manager "tcp:10.30.170.84:6640"
    Manager "tcp:10.30.170.180:6640"
    Manager "tcp:10.30.170.14:6640"
    ovs_version: "2.17.11"</msg>
<msg time="2026-10-16T01:14:09.184365" 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-10-16T01:14:09.160317" elapsed="0.024079"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:09.184618" elapsed="0.000375"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:09.185833" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:14:09.185411" elapsed="0.000477"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:14:09.186166" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:09.186001" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:09.185964" elapsed="0.000305"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:14:09.186454" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-10-16T01:14:09.186339" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:09.186319" elapsed="0.000246"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:14:09.186608" elapsed="0.000026"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:09.187681" 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-10-16T01:14:09.188398" elapsed="0.000207"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:09.188834" elapsed="0.000125"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:14:09.187085" elapsed="0.001939"/>
</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-10-16T01:14:08.748069" elapsed="0.441050"/>
</kw>
<msg time="2026-10-16T01:14:09.189185" 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-10-16T01:14:08.747325" elapsed="0.441928"/>
</kw>
<msg time="2026-10-16T01:14:09.189396" level="INFO">${output} = ef5e6311-6bc3-45eb-bec5-977d25c19a20
    Manager "tcp:10.30.170.84:6640"
    Manager "tcp:10.30.170.180:6640"
    Manager "tcp:10.30.170.14: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-10-16T01:14:08.746686" elapsed="0.442745"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:09.190048" level="INFO">ef5e6311-6bc3-45eb-bec5-977d25c19a20
    Manager "tcp:10.30.170.84:6640"
    Manager "tcp:10.30.170.180:6640"
    Manager "tcp:10.30.170.14: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-10-16T01:14:09.189714" elapsed="0.000393"/>
</kw>
<if>
<branch type="IF" condition="&quot;${should_match}&quot; == &quot;True&quot;">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-10-16T01:14:09.191271" level="FAIL">'ef5e6311-6bc3-45eb-bec5-977d25c19a20
    Manager "tcp:10.30.170.84:6640"
    Manager "tcp:10.30.170.180:6640"
    Manager "tcp:10.30.170.14:6640"
    ovs_version: "2.17.11"' does not contain 'is_connected'</msg>
<arg>${output}</arg>
<arg>${expected_output}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="FAIL" start="2026-10-16T01:14:09.190482" elapsed="0.000907">'ef5e6311-6bc3-45eb-bec5-977d25c19a20
    Manager "tcp:10.30.170.84:6640"
    Manager "tcp:10.30.170.180:6640"
    Manager "tcp:10.30.170.14:6640"
    ovs_version: "2.17.11"' does not contain 'is_connected'</status>
</kw>
<status status="FAIL" start="2026-10-16T01:14:09.190189" elapsed="0.001298">'ef5e6311-6bc3-45eb-bec5-977d25c19a20
    Manager "tcp:10.30.170.84:6640"
    Manager "tcp:10.30.170.180:6640"
    Manager "tcp:10.30.170.14:6640"
    ovs_version: "2.17.11"' does not contain 'is_connected'</status>
</branch>
<status status="FAIL" start="2026-10-16T01:14:09.190166" elapsed="0.001373">'ef5e6311-6bc3-45eb-bec5-977d25c19a20
    Manager "tcp:10.30.170.84:6640"
    Manager "tcp:10.30.170.180:6640"
    Manager "tcp:10.30.170.14: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 the `container` contains the `item`.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:09.191884" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:09.191628" elapsed="0.000329"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:14:09.191605" elapsed="0.000384"/>
</if>
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-10-16T01:14:09.192031" elapsed="0.000019"/>
</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-10-16T01:14:08.746138" elapsed="0.446036">'ef5e6311-6bc3-45eb-bec5-977d25c19a20
    Manager "tcp:10.30.170.84:6640"
    Manager "tcp:10.30.170.180:6640"
    Manager "tcp:10.30.170.14:6640"
    ovs_version: "2.17.11"' does not contain 'is_connected'</status>
</kw>
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-10-16T01:14:09.192252" elapsed="0.000020"/>
</return>
<arg>${tools_system}</arg>
<doc>Uses "vsctl show" to check for string "is_connected"</doc>
<status status="FAIL" start="2026-10-16T01:14:08.742131" elapsed="0.450247">'ef5e6311-6bc3-45eb-bec5-977d25c19a20
    Manager "tcp:10.30.170.84:6640"
    Manager "tcp:10.30.170.180:6640"
    Manager "tcp:10.30.170.14: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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:10.205585" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:10.204964" elapsed="0.000917"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:10.204911" elapsed="0.001038"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:10.206768" 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-10-16T01:14:10.207071" 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-10-16T01:14:10.206385" elapsed="0.000741"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:10.208258" level="INFO">Attempting to execute command "sudo ovs-vsctl show" on remote system "10.30.171.104" 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-10-16T01:14:10.207540" elapsed="0.000815"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:10.209471" 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-10-16T01:14:10.208779" elapsed="0.000747"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:14:10.211432" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:14:10.211585" 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-10-16T01:14:10.210844" elapsed="0.000790"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:10.212020" elapsed="0.000660"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:14:10.214960" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:14:10.637348" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:14:06 UTC 2026

  System load:  0.12               Processes:             111
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:14:09 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:14:10.213954" elapsed="0.423563"/>
</kw>
<msg time="2026-10-16T01:14:10.637599" 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-10-16T01:14:10.213089" elapsed="0.424631"/>
</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-10-16T01:14:10.210013" elapsed="0.427835"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:14:10.638379" level="INFO">Executing command 'sudo ovs-vsctl show'.</msg>
<msg time="2026-10-16T01:14:10.664445" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:14:10.664581" level="INFO">${stdout} = ef5e6311-6bc3-45eb-bec5-977d25c19a20
    Manager "tcp:10.30.170.84:6640"
        is_connected: true
    Manager "tcp:10.30.170.180:6640"
        is_connected: true
    Manager "tcp:10.30.170.14:6640"
...</msg>
<msg time="2026-10-16T01:14:10.664624" 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-10-16T01:14:10.638144" elapsed="0.026502"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:10.664844" elapsed="0.000549"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:10.666172" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:14:10.665757" elapsed="0.000468"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:14:10.666505" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:10.666339" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:10.666300" elapsed="0.000311"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:14:10.666839" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-10-16T01:14:10.666679" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:10.666660" elapsed="0.000288"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:14:10.666990" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:10.668045" elapsed="0.000407"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:14:10.668726" elapsed="0.000236"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:10.669157" 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-10-16T01:14:10.667419" elapsed="0.001950"/>
</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-10-16T01:14:10.203927" elapsed="0.465631"/>
</kw>
<msg time="2026-10-16T01:14:10.669631" 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-10-16T01:14:10.202555" elapsed="0.467171"/>
</kw>
<msg time="2026-10-16T01:14:10.669884" level="INFO">${output} = ef5e6311-6bc3-45eb-bec5-977d25c19a20
    Manager "tcp:10.30.170.84:6640"
        is_connected: true
    Manager "tcp:10.30.170.180:6640"
        is_connected: true
    Manager "tcp:10.30.170.14: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-10-16T01:14:10.201522" elapsed="0.468395"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:10.670494" level="INFO">ef5e6311-6bc3-45eb-bec5-977d25c19a20
    Manager "tcp:10.30.170.84:6640"
        is_connected: true
    Manager "tcp:10.30.170.180:6640"
        is_connected: true
    Manager "tcp:10.30.170.14: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-10-16T01:14:10.670183" elapsed="0.000369"/>
</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 the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-16T01:14:10.670959" elapsed="0.000427"/>
</kw>
<status status="PASS" start="2026-10-16T01:14:10.670634" elapsed="0.000802"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:10.670611" elapsed="0.000858"/>
</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 the `container` contains the `item`.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:10.671852" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:10.671537" elapsed="0.000391"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:10.671517" elapsed="0.000442"/>
</if>
<return>
<value>${output}</value>
<status status="PASS" start="2026-10-16T01:14:10.672000" elapsed="0.000035"/>
</return>
<msg time="2026-10-16T01:14:10.672175" level="INFO">${output} = ef5e6311-6bc3-45eb-bec5-977d25c19a20
    Manager "tcp:10.30.170.84:6640"
        is_connected: true
    Manager "tcp:10.30.170.180:6640"
        is_connected: true
    Manager "tcp:10.30.170.14: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-10-16T01:14:10.200552" elapsed="0.471657"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-10-16T01:14:10.672271" elapsed="0.000032"/>
</return>
<arg>${tools_system}</arg>
<doc>Uses "vsctl show" to check for string "is_connected"</doc>
<status status="PASS" start="2026-10-16T01:14:10.193326" elapsed="0.479073"/>
</kw>
<msg time="2026-10-16T01:14:10.672497" level="INFO">${output} = ef5e6311-6bc3-45eb-bec5-977d25c19a20
    Manager "tcp:10.30.170.84:6640"
        is_connected: true
    Manager "tcp:10.30.170.180:6640"
        is_connected: true
    Manager "tcp:10.30.170.14: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-10-16T01:14:08.741423" elapsed="1.931107"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:10.673141" level="INFO">ef5e6311-6bc3-45eb-bec5-977d25c19a20
    Manager "tcp:10.30.170.84:6640"
        is_connected: true
    Manager "tcp:10.30.170.180:6640"
        is_connected: true
    Manager "tcp:10.30.170.14: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-10-16T01:14:10.672832" elapsed="0.000367"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-10-16T01:14:10.673642" 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-10-16T01:14:10.673413" elapsed="0.000261"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:14:10.674846" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:14:10.674438" elapsed="0.000443"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:14:10.674940" elapsed="0.000038"/>
</return>
<msg time="2026-10-16T01:14:10.675110" 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-10-16T01:14:10.673988" elapsed="0.001154"/>
</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-10-16T01:14:10.679114" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:14:10.678689" elapsed="0.000462"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:14:10.685019" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:14:10.685105" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:14:10.685297" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:14:10.679360" elapsed="0.006842">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:14:10.686578" elapsed="0.000034"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:14:10.686903" elapsed="0.000031"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:14:10.687139" elapsed="0.000026"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:10.687372" elapsed="0.000026"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:14:10.687597" elapsed="0.000025"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:10.687926" elapsed="0.000027"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:14:10.688319" elapsed="0.000025"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:14:10.688557" elapsed="0.000026"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:10.688830" elapsed="0.000035"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:10.689082" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:14:10.689368" elapsed="0.000025"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:14:10.688136" elapsed="0.001305"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:14:10.688028" elapsed="0.001449"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:14:10.689530" elapsed="0.000021"/>
</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="FAIL" start="2026-10-16T01:14:10.678146" elapsed="0.011527">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:14:12.696808" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:14:12.696036" elapsed="0.000858"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:14:12.704931" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:14:12.705065" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:14:12.705325" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:14:12.697256" elapsed="0.009075">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:14:12.706996" elapsed="0.000055"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:14:12.707448" elapsed="0.000048"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:14:12.707870" elapsed="0.000044"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:12.708247" elapsed="0.000040"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:14:12.708597" elapsed="0.000040"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:12.709214" elapsed="0.000042"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:14:12.709867" elapsed="0.000045"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:14:12.710258" elapsed="0.000041"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:12.710644" elapsed="0.000041"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:12.711080" elapsed="0.000043"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:14:12.711552" elapsed="0.000041"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:14:12.709526" elapsed="0.002144"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:14:12.709359" elapsed="0.002563"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:14:12.712032" elapsed="0.000038"/>
</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="FAIL" start="2026-10-16T01:14:12.694863" elapsed="0.017408">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:14:14.718591" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:14:14.717869" elapsed="0.000784"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:14:14.726668" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:14:14.726846" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:14:14.727102" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:14:14.719067" elapsed="0.009171">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:14:14.728908" elapsed="0.000056"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:14:14.729361" elapsed="0.000047"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:14:14.729762" elapsed="0.000043"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:14.730184" elapsed="0.000042"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:14:14.730544" elapsed="0.000039"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:14.731246" elapsed="0.000044"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:14:14.731901" elapsed="0.000043"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:14:14.732285" elapsed="0.000039"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:14.732662" elapsed="0.000067"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:14.733092" elapsed="0.000043"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:14:14.733663" elapsed="0.000080"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:14:14.731564" elapsed="0.002259"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:14:14.731392" elapsed="0.002507"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:14:14.733991" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:14:14.716689" elapsed="0.017534">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:14:16.741061" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:14:16.740284" elapsed="0.000840"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:14:16.748762" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:14:16.748910" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:14:16.749154" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:14:16.741475" elapsed="0.008634">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:14:16.750749" elapsed="0.000055"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:14:16.751232" elapsed="0.000051"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:14:16.751612" elapsed="0.000042"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:16.752043" elapsed="0.000043"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:14:16.752407" elapsed="0.000041"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:16.752904" elapsed="0.000046"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:14:16.753496" elapsed="0.000042"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:14:16.753929" elapsed="0.000044"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:16.754352" elapsed="0.000044"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:16.754775" elapsed="0.000043"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:14:16.755298" elapsed="0.000043"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:14:16.753208" elapsed="0.002210"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:14:16.753048" elapsed="0.002426"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:14:16.755562" elapsed="0.000033"/>
</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="FAIL" start="2026-10-16T01:14:16.739159" elapsed="0.016659">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:14:18.762476" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:14:18.761508" elapsed="0.001032"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:14:18.770492" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:14:18.770614" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:14:18.770878" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:14:18.762950" elapsed="0.008909">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:14:18.772499" elapsed="0.000055"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:14:18.773039" elapsed="0.000050"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:14:18.773416" elapsed="0.000041"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:18.773821" elapsed="0.000044"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:14:18.774210" elapsed="0.000041"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:18.774664" elapsed="0.000070"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:14:18.775317" elapsed="0.000041"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:14:18.775695" elapsed="0.000071"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:18.776131" elapsed="0.000043"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:18.776522" elapsed="0.000041"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:14:18.777037" elapsed="0.000043"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:14:18.775028" elapsed="0.002129"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:14:18.774840" elapsed="0.002374"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:14:18.777303" elapsed="0.000034"/>
</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="FAIL" start="2026-10-16T01:14:18.760362" elapsed="0.017167">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:14:20.784481" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:14:20.783735" elapsed="0.000809"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:14:20.792025" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:14:20.792147" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:14:20.792389" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:14:20.784949" elapsed="0.008542">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:14:20.794165" elapsed="0.000055"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:14:20.794621" elapsed="0.000048"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:14:20.795083" elapsed="0.000043"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:20.795462" elapsed="0.000041"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:14:20.795854" elapsed="0.000042"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:20.796326" elapsed="0.000041"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:14:20.796971" elapsed="0.000044"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:14:20.797356" elapsed="0.000040"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:20.797780" elapsed="0.000051"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:20.798195" elapsed="0.000053"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:14:20.798668" elapsed="0.000072"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:14:20.796629" elapsed="0.002190"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:14:20.796468" elapsed="0.002407"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:14:20.799051" elapsed="0.000034"/>
</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="FAIL" start="2026-10-16T01:14:20.782568" elapsed="0.016709">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:14:22.805432" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:14:22.804667" elapsed="0.000827"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:14:22.813337" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:14:22.813482" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:14:22.813760" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:14:22.805891" elapsed="0.008840">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:14:22.815413" elapsed="0.000058"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:14:22.815904" elapsed="0.000067"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:14:22.816308" elapsed="0.000041"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:22.816689" elapsed="0.000071"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:14:22.817104" elapsed="0.000042"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:22.817679" elapsed="0.000075"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:14:22.818333" elapsed="0.000042"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:14:22.818752" elapsed="0.000043"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:22.819177" elapsed="0.000042"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:22.819565" elapsed="0.000041"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:14:22.820092" elapsed="0.000043"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:14:22.818039" elapsed="0.002174"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:14:22.817858" elapsed="0.002411"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:14:22.820356" elapsed="0.000034"/>
</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="FAIL" start="2026-10-16T01:14:22.803560" elapsed="0.017026">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:14:24.827483" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:14:24.826560" elapsed="0.000985"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:14:24.835457" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:14:24.835576" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:14:24.835883" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:14:24.827938" elapsed="0.008930">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:14:24.837551" elapsed="0.000059"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:14:24.838152" elapsed="0.000059"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:14:24.838574" elapsed="0.000045"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:24.839044" elapsed="0.000047"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:14:24.839440" elapsed="0.000043"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:24.839959" elapsed="0.000091"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:14:24.840650" elapsed="0.000046"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:14:24.841136" elapsed="0.000046"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:24.841570" elapsed="0.000047"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:24.842043" elapsed="0.000046"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:14:24.842561" elapsed="0.000045"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:14:24.840340" elapsed="0.002480"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:14:24.840164" elapsed="0.002721"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:14:24.843006" elapsed="0.000040"/>
</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="FAIL" start="2026-10-16T01:14:24.825434" elapsed="0.017828">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:14:26.849558" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:14:26.848821" elapsed="0.000800"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:14:26.857347" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:14:26.857466" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:14:26.857686" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:14:26.850029" elapsed="0.008613">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:14:26.859299" elapsed="0.000055"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:14:26.859785" elapsed="0.000050"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:14:26.860190" elapsed="0.000043"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:26.860569" elapsed="0.000042"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:14:26.860965" elapsed="0.000061"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:26.861543" elapsed="0.000050"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:14:26.862215" elapsed="0.000053"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:14:26.862609" elapsed="0.000041"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:26.863046" elapsed="0.000043"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:26.863432" elapsed="0.000040"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:14:26.863940" elapsed="0.000043"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:14:26.861902" elapsed="0.002179"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:14:26.861730" elapsed="0.002408"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:14:26.864227" elapsed="0.000034"/>
</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="FAIL" start="2026-10-16T01:14:26.847641" elapsed="0.016815">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:14:28.871074" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:14:28.870310" elapsed="0.000828"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:14:28.878941" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:14:28.879187" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:14:28.879425" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:14:28.871493" elapsed="0.008877">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:14:28.881021" elapsed="0.000075"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:14:28.881504" elapsed="0.000049"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:14:28.881911" elapsed="0.000045"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:28.882315" elapsed="0.000042"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:14:28.882678" elapsed="0.000071"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:28.883191" elapsed="0.000044"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:14:28.883807" elapsed="0.000045"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:14:28.884363" elapsed="0.000057"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:28.884825" elapsed="0.000046"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:28.885243" elapsed="0.000043"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:14:28.885727" elapsed="0.000045"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:14:28.883490" elapsed="0.002359"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:14:28.883332" elapsed="0.002574"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:14:28.885992" elapsed="0.000033"/>
</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="FAIL" start="2026-10-16T01:14:28.869218" elapsed="0.017093">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:14:30.892519" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:14:30.891752" elapsed="0.000829"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:14:30.899695" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:14:30.899860" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:14:30.900102" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:14:30.892989" elapsed="0.008015">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:14:30.901630" elapsed="0.000183"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:14:30.902270" elapsed="0.000051"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:14:30.902652" elapsed="0.000043"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:30.903085" elapsed="0.000044"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:14:30.903454" elapsed="0.000041"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:30.903955" elapsed="0.000044"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:14:30.904571" elapsed="0.000042"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:14:30.905016" elapsed="0.000070"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:30.905434" elapsed="0.000042"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:30.905848" elapsed="0.000043"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:14:30.906330" elapsed="0.000043"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:14:30.904278" elapsed="0.002172"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:14:30.904117" elapsed="0.002389"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:14:30.906590" elapsed="0.000034"/>
</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="FAIL" start="2026-10-16T01:14:30.890601" elapsed="0.016243">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:14:32.913541" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:14:32.912825" elapsed="0.000777"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:14:32.920479" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:14:32.920595" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:14:32.920869" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:14:32.913981" elapsed="0.007831">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:14:32.922432" elapsed="0.000054"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:14:32.922910" elapsed="0.000047"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:14:32.923308" elapsed="0.000042"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:32.923684" elapsed="0.000068"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:14:32.924075" elapsed="0.000061"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:32.924540" elapsed="0.000039"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:14:32.925165" elapsed="0.000041"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:14:32.925653" elapsed="0.000042"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:32.926075" elapsed="0.000062"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:32.926479" elapsed="0.000041"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:14:32.926977" elapsed="0.000041"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:14:32.924859" elapsed="0.002256"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:14:32.924675" elapsed="0.002498"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:14:32.927265" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:14:32.911697" elapsed="0.015797">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:14:34.933519" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:14:34.932805" elapsed="0.000776"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:14:34.940431" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:14:34.940560" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:14:34.940824" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:14:34.933958" elapsed="0.007806">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:14:34.942449" elapsed="0.000058"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:14:34.942937" elapsed="0.000049"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:14:34.943337" elapsed="0.000043"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:34.943743" elapsed="0.000053"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:14:34.944136" elapsed="0.000041"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:34.944599" elapsed="0.000040"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:14:34.945250" elapsed="0.000044"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:14:34.945637" elapsed="0.000041"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:34.946051" elapsed="0.000042"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:34.946454" elapsed="0.000042"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:14:34.946967" elapsed="0.000042"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:14:34.944932" elapsed="0.002154"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:14:34.944771" elapsed="0.002394"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:14:34.947253" elapsed="0.000033"/>
</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="FAIL" start="2026-10-16T01:14:34.931682" elapsed="0.015886">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:14:36.954098" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:14:36.953361" elapsed="0.000820"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:14:36.961809" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:14:36.961927" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:14:36.962194" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:14:36.954543" elapsed="0.008563">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:14:36.963767" elapsed="0.000055"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:14:36.964240" elapsed="0.000048"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:14:36.964618" elapsed="0.000041"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:36.965024" elapsed="0.000041"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:14:36.965409" elapsed="0.000042"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:36.965906" elapsed="0.000042"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:14:36.966517" elapsed="0.000042"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:14:36.966928" elapsed="0.000042"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:36.967340" elapsed="0.000041"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:36.967747" elapsed="0.000042"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:14:36.968224" elapsed="0.000041"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:14:36.966224" elapsed="0.002119"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:14:36.966046" elapsed="0.002352"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:14:36.968484" elapsed="0.000033"/>
</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="FAIL" start="2026-10-16T01:14:36.952216" elapsed="0.016516">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:14:38.974660" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:14:38.973923" elapsed="0.000827"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:14:38.981736" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:14:38.981855" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:14:38.982189" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:14:38.975095" elapsed="0.007996">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:14:38.983754" elapsed="0.000057"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:14:38.984235" elapsed="0.000048"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:14:38.984608" elapsed="0.000041"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:38.985011" elapsed="0.000041"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:14:38.985388" elapsed="0.000041"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:38.985877" elapsed="0.000042"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:14:38.986486" elapsed="0.000041"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:14:38.986897" elapsed="0.000042"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:38.987299" elapsed="0.000042"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:38.987680" elapsed="0.000068"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:14:38.988195" elapsed="0.000042"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:14:38.986194" elapsed="0.002120"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:14:38.986018" elapsed="0.002352"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:14:38.988455" elapsed="0.000034"/>
</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="FAIL" start="2026-10-16T01:14:38.972859" elapsed="0.015818">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:14:40.995225" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:14:40.994460" elapsed="0.000829"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:14:41.002491" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:14:41.002631" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:14:41.002931" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:14:40.995647" elapsed="0.008221">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:14:41.004591" elapsed="0.000061"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:14:41.005082" elapsed="0.000048"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:14:41.005489" elapsed="0.000042"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:41.005894" elapsed="0.000042"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:14:41.006283" elapsed="0.000049"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:41.006899" elapsed="0.000043"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:14:41.007534" elapsed="0.000042"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:14:41.007949" elapsed="0.000041"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:41.008367" elapsed="0.000054"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:41.008793" elapsed="0.000042"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:14:41.009304" elapsed="0.000042"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:14:41.007239" elapsed="0.002183"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:14:41.007042" elapsed="0.002440"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:14:41.009573" elapsed="0.000033"/>
</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="FAIL" start="2026-10-16T01:14:40.993361" elapsed="0.016485">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<msg time="2026-10-16T01:14:41.010052" level="FAIL">Keyword 'OVSDB.Get OVSDB UUID' failed after retrying for 30 seconds. The last error was: Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:14:10.675387" elapsed="30.335020">Keyword 'OVSDB.Get OVSDB UUID' failed after retrying for 30 seconds. The last error was: Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<return>
<value>${ovsdb_uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:14:41.010537" elapsed="0.000033"/>
</return>
<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="FAIL" start="2026-10-16T01:14:05.827650" elapsed="35.183126">Keyword 'OVSDB.Get OVSDB UUID' failed after retrying for 30 seconds. The last error was: Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${ovsdb_uuid}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:41.011270" elapsed="0.000044"/>
</kw>
<doc>Connect OVS to all cluster instances.</doc>
<status status="FAIL" start="2026-10-16T01:14:05.287904" elapsed="35.723711">Keyword 'OVSDB.Get OVSDB UUID' failed after retrying for 30 seconds. The last error was: Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</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-10-16T01:14:41.015204" elapsed="0.000540"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:14:41.014594" elapsed="0.001271"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:14:41.018051" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:41.017822" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:41.017776" elapsed="0.000445"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:14:41.023107" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:41.022904" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:41.022865" elapsed="0.000413"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:14:41.025447" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:14:41.024610" elapsed="0.000898"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:14:41.026510" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:14:41.025874" elapsed="0.000691"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:14:41.026657" elapsed="0.000099"/>
</return>
<msg time="2026-10-16T01:14:41.026985" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:14:41.023788" elapsed="0.003249"/>
</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-10-16T01:14:41.033009" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:41.032795" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:41.032745" elapsed="0.000417"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:14:41.035836" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:41.035611" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:41.035575" elapsed="0.000404"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:14:41.036886" 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-10-16T01:14:41.036323" elapsed="0.000620"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:41.037659" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:14:41.037353" elapsed="0.000342"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:14:41.087157" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:14:41.038612" elapsed="0.048820"/>
</kw>
<msg time="2026-10-16T01:14:41.087653" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:14:41.087718" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:41.037964" elapsed="0.049793"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:14:41.210044" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:14:41.088553" elapsed="0.121841"/>
</kw>
<msg time="2026-10-16T01:14:41.210621" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:14:41.210664" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:41.088001" elapsed="0.122719"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:41.211141" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:41.210834" elapsed="0.000399"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:41.210800" elapsed="0.000460"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:41.211909" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:14:41.211456" elapsed="0.000553"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:41.212278" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:41.212069" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:41.212053" elapsed="0.000319"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:14:41.212408" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:41.215127" 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-10-16T01:14:41.216902" elapsed="0.000702"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:41.218951" 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-10-16T01:14:41.213355" elapsed="0.005990"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:14:41.212784" elapsed="0.006675"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:14:41.035008" elapsed="0.184528"/>
</kw>
<msg time="2026-10-16T01:14:41.219620" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:14:41.219660" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:41.033548" elapsed="0.186206"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:14:41.219975" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-16T01:14:41.219887" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:41.219870" elapsed="0.000185"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:14:41.220409" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:41.220741" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:14:41.220806" 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-10-16T01:14:41.031927" elapsed="0.188965"/>
</kw>
<msg time="2026-10-16T01:14:41.220977" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:14:41.221016" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:41.027828" elapsed="0.193222"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:41.221346" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:41.221117" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:41.221101" elapsed="0.000316"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:14:41.027487" elapsed="0.193952"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:14:41.223953" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:41.223869" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:41.223852" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:14:41.225118" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:41.225034" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:41.225018" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:14:41.225566" 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-10-16T01:14:41.225339" elapsed="0.000251"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:41.225935" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:14:41.225766" elapsed="0.000193"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:14:41.287182" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:14:41.226533" elapsed="0.060847"/>
</kw>
<msg time="2026-10-16T01:14:41.287541" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:14:41.287583" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:41.226110" elapsed="0.061508"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:14:41.433766" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:14:41.288273" elapsed="0.145723"/>
</kw>
<msg time="2026-10-16T01:14:41.434177" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:14:41.434234" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:41.287814" elapsed="0.146456"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:41.434609" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:41.434359" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:41.434334" elapsed="0.000397"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:41.435311" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:14:41.434918" elapsed="0.000550"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:41.435753" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:41.435531" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:41.435515" elapsed="0.000334"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:14:41.435882" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:41.438486" 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-10-16T01:14:41.440258" elapsed="0.000494"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:41.441957" 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-10-16T01:14:41.436761" elapsed="0.005771"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:14:41.436214" elapsed="0.006434"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:14:41.224778" elapsed="0.217992"/>
</kw>
<msg time="2026-10-16T01:14:41.442856" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:14:41.442896" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:41.224165" elapsed="0.218766"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:14:41.443084" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:14:41.443000" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:41.442983" elapsed="0.000177"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:14:41.443498" 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-10-16T01:14:41.443854" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:14:41.443919" 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-10-16T01:14:41.223560" elapsed="0.220445"/>
</kw>
<msg time="2026-10-16T01:14:41.444089" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:14:41.444129" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:41.221720" elapsed="0.222444"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:41.444461" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:41.444246" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:41.444230" elapsed="0.000302"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:14:41.221562" elapsed="0.222992"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:14:41.447242" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:41.447145" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:41.447128" elapsed="0.000176"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:14:41.448402" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:41.448318" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:41.448302" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:14:41.448858" 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-10-16T01:14:41.448605" elapsed="0.000278"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:41.449224" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:14:41.449040" elapsed="0.000209"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:14:41.504082" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:14:41.449831" elapsed="0.054495"/>
</kw>
<msg time="2026-10-16T01:14:41.504649" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:14:41.504692" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:41.449401" elapsed="0.055350"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:14:41.628508" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:14:41.505499" elapsed="0.123294"/>
</kw>
<msg time="2026-10-16T01:14:41.629000" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:14:41.629042" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:41.504974" elapsed="0.124103"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:41.629498" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:41.629184" elapsed="0.000387"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:41.629153" elapsed="0.000446"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:41.630229" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:14:41.629803" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:41.630582" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:41.630384" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:41.630367" elapsed="0.000313"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:14:41.630740" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:41.633399" 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-10-16T01:14:41.635165" elapsed="0.000502"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:41.637034" elapsed="0.001639"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:14:41.631630" elapsed="0.007129"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:14:41.631072" elapsed="0.007806"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:14:41.448050" elapsed="0.190907"/>
</kw>
<msg time="2026-10-16T01:14:41.639040" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:14:41.639080" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:41.447448" elapsed="0.191668"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:14:41.639285" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:14:41.639184" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:41.639167" elapsed="0.000198"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:14:41.639689" elapsed="0.000126"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:41.640097" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:14:41.640161" 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-10-16T01:14:41.446849" elapsed="0.193414"/>
</kw>
<msg time="2026-10-16T01:14:41.640348" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:14:41.640388" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:41.445087" elapsed="0.195336"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:41.640785" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:41.640546" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:41.640529" elapsed="0.000329"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:14:41.444681" elapsed="0.196199"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:14:41.027146" elapsed="0.613764"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:14:41.022158" elapsed="0.618803"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:14:41.017149" elapsed="0.623862"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:41.016209" elapsed="0.624842"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:14:41.013766" elapsed="0.627332"/>
</kw>
<kw name="Get Ovsdb Entity Owner Status For One Device" owner="ClusterOvsdb">
<msg time="2026-10-16T01:14:41.644817" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:14:41.643605" elapsed="0.001249">Variable '${ovsdb_uuid}' not found.</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-10-16T01:14:41.645027" elapsed="0.000021"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${original_owner}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:41.645244" elapsed="0.000020"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${original_candidate_list}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:41.645437" elapsed="0.000019"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${original_candidate}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:41.645624" elapsed="0.000019"/>
</kw>
<doc>Check Entity Owner Status and identify owner and candidate.</doc>
<status status="FAIL" start="2026-10-16T01:14:41.012415" elapsed="0.633373">Variable '${ovsdb_uuid}' not found.</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-10-16T01:14:41.647357" elapsed="0.000202"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:14:41.647101" elapsed="0.000508"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:14:41.648512" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:41.648425" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:41.648408" elapsed="0.000167"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:14:41.650444" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:41.650361" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:41.650345" elapsed="0.000161"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:14:41.651432" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:14:41.651073" elapsed="0.000385"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:14:41.651900" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:14:41.651607" elapsed="0.000317"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:14:41.651965" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:14:41.652092" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:14:41.650722" elapsed="0.001393"/>
</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-10-16T01:14:41.683862" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:41.683747" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:41.683722" 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-10-16T01:14:41.685243" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:41.685142" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:41.685125" elapsed="0.000183"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:14:41.685711" 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-10-16T01:14:41.685451" elapsed="0.000289"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:41.686149" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:14:41.685972" elapsed="0.000201"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:14:41.730176" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:14:41.686784" elapsed="0.043585"/>
</kw>
<msg time="2026-10-16T01:14:41.730529" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:14:41.730571" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:41.686343" elapsed="0.044263"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:14:41.852762" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:14:41.731287" elapsed="0.121682"/>
</kw>
<msg time="2026-10-16T01:14:41.853143" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:14:41.853184" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:41.730801" elapsed="0.122434"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:41.853562" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:41.853323" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:41.853298" elapsed="0.000360"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:41.854334" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:14:41.853873" elapsed="0.000544"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:41.854679" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:41.854477" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:41.854461" elapsed="0.000329"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:14:41.854824" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:41.857437" 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-10-16T01:14:41.859186" elapsed="0.000488"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:41.861080" 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-10-16T01:14:41.855688" elapsed="0.005789"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:14:41.855148" elapsed="0.006446"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:14:41.684884" elapsed="0.176788"/>
</kw>
<msg time="2026-10-16T01:14:41.861774" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:14:41.861815" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:41.684118" elapsed="0.177731"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:14:41.862004" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:14:41.861918" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:41.861901" elapsed="0.000181"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:14:41.862430" 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-10-16T01:14:41.862829" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:14:41.862949" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:14:41.683325" elapsed="0.179715"/>
</kw>
<msg time="2026-10-16T01:14:41.863129" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:14:41.863171" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:41.652455" elapsed="0.210762"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:41.863508" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:41.863290" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:41.863273" elapsed="0.000307"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:14:41.652317" elapsed="0.211286"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:14:41.866167" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:41.866083" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:41.866066" elapsed="0.000182"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:14:41.867330" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:41.867248" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:41.867231" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:14:41.867782" 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-10-16T01:14:41.867533" elapsed="0.000274"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:41.868131" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:14:41.867964" elapsed="0.000191"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:14:41.917086" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:14:41.868784" elapsed="0.048490"/>
</kw>
<msg time="2026-10-16T01:14:41.917429" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:14:41.917471" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:41.868361" elapsed="0.049143"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:14:42.017319" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:14:41.918111" elapsed="0.099447"/>
</kw>
<msg time="2026-10-16T01:14:42.017776" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:14:42.017820" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:41.917669" elapsed="0.100187"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:42.018226" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:42.017953" elapsed="0.000348"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:42.017925" elapsed="0.000402"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:42.018917" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:14:42.018509" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:42.019269" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:42.019057" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:42.019041" elapsed="0.000321"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:14:42.019395" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:42.021990" 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-10-16T01:14:42.023800" elapsed="0.000482"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:42.025633" 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-10-16T01:14:42.020284" elapsed="0.005742"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:14:42.019739" elapsed="0.006402"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:14:41.866980" elapsed="0.159254"/>
</kw>
<msg time="2026-10-16T01:14:42.026320" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:14:42.026360" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:41.866395" elapsed="0.160000"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:14:42.026548" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:14:42.026465" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:42.026448" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:14:42.027042" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:42.027368" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:14:42.027433" 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-10-16T01:14:41.865790" elapsed="0.161729"/>
</kw>
<msg time="2026-10-16T01:14:42.027606" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:14:42.027647" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:41.863878" elapsed="0.163803"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:42.027986" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:42.027768" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:42.027752" elapsed="0.000306"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:14:41.863740" elapsed="0.164340"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:14:42.030805" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:42.030719" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:42.030686" elapsed="0.000182"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:14:42.031974" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:42.031886" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:42.031869" elapsed="0.000167"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:14:42.032421" 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-10-16T01:14:42.032177" elapsed="0.000268"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:42.032792" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:14:42.032602" elapsed="0.000215"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:14:42.074150" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:14:42.033482" elapsed="0.040861"/>
</kw>
<msg time="2026-10-16T01:14:42.074513" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:14:42.074555" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:42.032968" elapsed="0.041620"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:14:42.162060" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:14:42.075214" elapsed="0.087081"/>
</kw>
<msg time="2026-10-16T01:14:42.162454" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:14:42.162494" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:42.074777" elapsed="0.087751"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:42.162827" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:42.162598" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:42.162580" elapsed="0.000342"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:42.163452" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:14:42.163099" elapsed="0.000434"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:42.163810" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:42.163593" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:42.163576" elapsed="0.000327"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:14:42.163935" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:42.166415" 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-10-16T01:14:42.168146" elapsed="0.000467"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:42.170021" 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-10-16T01:14:42.164739" elapsed="0.005665"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:14:42.164225" elapsed="0.006294"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:14:42.031607" elapsed="0.138987"/>
</kw>
<msg time="2026-10-16T01:14:42.170675" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:14:42.170732" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:42.031014" elapsed="0.139754"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:14:42.170920" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:14:42.170837" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:42.170820" elapsed="0.000176"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:14:42.171327" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:42.171623" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:14:42.171687" elapsed="0.000110"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:14:42.030404" elapsed="0.141467"/>
</kw>
<msg time="2026-10-16T01:14:42.171955" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:14:42.171995" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:42.028357" elapsed="0.143671"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:42.172348" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:42.172096" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:42.172081" elapsed="0.000338"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:14:42.028217" elapsed="0.144224"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:14:41.652163" elapsed="0.520306"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:14:41.650055" elapsed="0.522469"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:14:41.648155" elapsed="0.524456"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:41.647769" elapsed="0.524887"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:14:41.646768" elapsed="0.525956"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:42.176343" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:42.176095" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:42.176078" elapsed="0.000340"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:42.176756" 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-10-16T01:14:42.176850" 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-10-16T01:14:42.176608" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:42.177362" level="INFO">Attempting to execute command "sudo ovs-vsctl add-br br-s1" on remote system "10.30.171.104" 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-10-16T01:14:42.177059" elapsed="0.000346"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:42.177900" level="INFO">${conn_id} = 41</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-10-16T01:14:42.177579" elapsed="0.000345"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:14:42.178767" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:14:42.178837" 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-10-16T01:14:42.178480" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:42.179005" elapsed="0.000297"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:14:42.180073" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:14:42.635185" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:14:06 UTC 2026

  System load:  0.12               Processes:             111
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:14:10 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:14:42.179845" elapsed="0.455564"/>
</kw>
<msg time="2026-10-16T01:14:42.635503" 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-10-16T01:14:42.179463" elapsed="0.456138"/>
</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-10-16T01:14:42.178116" elapsed="0.457621"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:14:42.636316" level="INFO">Executing command 'sudo ovs-vsctl add-br br-s1'.</msg>
<msg time="2026-10-16T01:14:42.730440" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:14:42.730754" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:14:42.730847" 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-10-16T01:14:42.636053" elapsed="0.094842"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:42.731316" elapsed="0.000558"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:42.733050" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:14:42.732407" 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-10-16T01:14:42.733573" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:42.733327" elapsed="0.000350"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:42.733275" elapsed="0.000489"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:14:42.734059" elapsed="0.000059"/>
</return>
<status status="PASS" start="2026-10-16T01:14:42.733874" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:42.733843" elapsed="0.000415"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:14:42.734456" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:42.736114" elapsed="0.000694"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:14:42.737229" elapsed="0.000322"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:42.737895" elapsed="0.000199"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:14:42.735157" elapsed="0.003043"/>
</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-10-16T01:14:42.175664" elapsed="0.562837"/>
</kw>
<msg time="2026-10-16T01:14:42.738608" 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-10-16T01:14:42.175135" elapsed="0.563612"/>
</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-10-16T01:14:42.174662" elapsed="0.564246"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:14:42.740058" 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-10-16T01:14:42.739359" elapsed="0.000754"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:14:42.741230" 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-10-16T01:14:42.740558" elapsed="0.000730"/>
</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-10-16T01:14:42.751273" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:14:42.750481" elapsed="0.000849"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:14:42.752319" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:14:42.751662" elapsed="0.000711"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:14:42.752464" elapsed="0.000059"/>
</return>
<msg time="2026-10-16T01:14:42.752778" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:14:42.749641" elapsed="0.003191"/>
</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-10-16T01:14:42.758804" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:14:42.758146" elapsed="0.000714"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:14:42.758953" elapsed="0.000057"/>
</return>
<msg time="2026-10-16T01:14:42.759243" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:14:42.757410" elapsed="0.001886"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:42.761934" 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-10-16T01:14:42.761404" elapsed="0.000623"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:42.762977" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:14:42.762458" 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-10-16T01:14:42.770869" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:14:42.770985" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:14:42.771264" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:14:42.763757" elapsed="0.008428">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:14:42.763200" elapsed="0.009177">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:42.772823" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:42.772450" elapsed="0.000505"/>
</branch>
<status status="FAIL" start="2026-10-16T01:14:42.763164" elapsed="0.009841">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:42.773812" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:14:42.774079" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:42.774006" elapsed="0.000157"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:14:42.773970" 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-10-16T01:14:42.774536" elapsed="0.000042"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:14:42.774674" elapsed="0.000062"/>
</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-10-16T01:14:42.759994" elapsed="0.014931">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:14:42.775044" 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-10-16T01:14:42.756456" elapsed="0.018797">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:42.775755" elapsed="0.000052"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:14:42.753228" elapsed="0.022685">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:14:42.752946" elapsed="0.023083">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:14:42.748535" elapsed="0.027702">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:43.785997" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:14:43.785103" elapsed="0.000957"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:14:43.787072" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:14:43.786424" elapsed="0.000702"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:14:43.787242" elapsed="0.000074"/>
</return>
<msg time="2026-10-16T01:14:43.787548" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:14:43.784267" elapsed="0.003332"/>
</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-10-16T01:14:43.793449" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:14:43.792834" elapsed="0.000670"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:14:43.793595" elapsed="0.000055"/>
</return>
<msg time="2026-10-16T01:14:43.793892" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:14:43.792082" elapsed="0.001861"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:43.796559" 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-10-16T01:14:43.796032" elapsed="0.000622"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:43.797628" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:14:43.797111" elapsed="0.000754"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:14:43.805792" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:14:43.805908" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:14:43.806128" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:14:43.798538" elapsed="0.008433">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:14:43.798011" elapsed="0.009124">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:43.807563" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:43.807205" elapsed="0.000489"/>
</branch>
<status status="FAIL" start="2026-10-16T01:14:43.797972" elapsed="0.009805">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:43.808542" elapsed="0.000054"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:14:43.808841" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:43.808764" elapsed="0.000164"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:14:43.808727" elapsed="0.000246"/>
</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-10-16T01:14:43.809298" elapsed="0.000045"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:14:43.809440" 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-10-16T01:14:43.794621" elapsed="0.015028">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:14:43.809796" 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-10-16T01:14:43.791133" elapsed="0.018851">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:43.810465" elapsed="0.000049"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:14:43.787995" elapsed="0.022623">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:14:43.787739" elapsed="0.023021">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:14:43.782986" elapsed="0.027963">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:44.820569" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:14:44.819696" elapsed="0.000936"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:14:44.821647" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:14:44.821006" elapsed="0.000723"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:14:44.821828" elapsed="0.000070"/>
</return>
<msg time="2026-10-16T01:14:44.822128" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:14:44.818863" elapsed="0.003316"/>
</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-10-16T01:14:44.828173" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:14:44.827540" elapsed="0.000687"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:14:44.828341" elapsed="0.000057"/>
</return>
<msg time="2026-10-16T01:14:44.828608" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:14:44.826820" elapsed="0.001838"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:44.831325" 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-10-16T01:14:44.830804" elapsed="0.000614"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:44.832417" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:14:44.831914" elapsed="0.000591"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:14:44.840546" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:14:44.840664" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:14:44.840915" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:14:44.833175" elapsed="0.008511">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:14:44.832643" elapsed="0.009239">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:44.842325" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:44.841953" elapsed="0.000507"/>
</branch>
<status status="FAIL" start="2026-10-16T01:14:44.832605" elapsed="0.009904">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:44.843308" elapsed="0.000054"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:14:44.843578" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:44.843504" elapsed="0.000158"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:14:44.843467" elapsed="0.000272"/>
</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-10-16T01:14:44.844047" elapsed="0.000043"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:14:44.844185" elapsed="0.000030"/>
</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-10-16T01:14:44.829372" elapsed="0.015048">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:14:44.844539" 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-10-16T01:14:44.825866" elapsed="0.018892">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:44.845222" elapsed="0.000069"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:14:44.822676" elapsed="0.022721">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:14:44.822419" elapsed="0.023093">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:14:44.817590" elapsed="0.028105">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:45.856013" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:14:45.855119" elapsed="0.000957"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:14:45.857103" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:14:45.856440" elapsed="0.000717"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:14:45.857272" elapsed="0.000074"/>
</return>
<msg time="2026-10-16T01:14:45.857577" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:14:45.854272" elapsed="0.003356"/>
</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-10-16T01:14:45.863629" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:14:45.863010" elapsed="0.000672"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:14:45.863956" elapsed="0.000065"/>
</return>
<msg time="2026-10-16T01:14:45.864239" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:14:45.862278" elapsed="0.002031"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:45.866943" 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-10-16T01:14:45.866404" elapsed="0.000632"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:45.867989" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:14:45.867469" elapsed="0.000608"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:14:45.875790" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:14:45.875907" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:14:45.876126" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:14:45.868776" elapsed="0.008176">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:14:45.868217" elapsed="0.008901">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:45.877548" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:45.877189" elapsed="0.000491"/>
</branch>
<status status="FAIL" start="2026-10-16T01:14:45.868177" elapsed="0.009581">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:45.878511" elapsed="0.000051"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:14:45.878805" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:45.878728" elapsed="0.000160"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:14:45.878667" elapsed="0.000266"/>
</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-10-16T01:14:45.879239" elapsed="0.000063"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:14:45.879397" elapsed="0.000030"/>
</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-10-16T01:14:45.865002" elapsed="0.014603">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:14:45.879851" elapsed="0.000038"/>
</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-10-16T01:14:45.861301" elapsed="0.018757">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:45.880541" elapsed="0.000048"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:14:45.858030" elapsed="0.022664">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:14:45.857773" elapsed="0.023073">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:14:45.852809" elapsed="0.028221">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:46.892685" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:14:46.891594" elapsed="0.001215"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:14:46.894061" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:14:46.893250" elapsed="0.000873"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:14:46.894231" elapsed="0.000111"/>
</return>
<msg time="2026-10-16T01:14:46.894632" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:14:46.890604" elapsed="0.004131"/>
</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-10-16T01:14:46.901696" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:14:46.900939" elapsed="0.000861"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:14:46.901903" elapsed="0.000066"/>
</return>
<msg time="2026-10-16T01:14:46.902235" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:14:46.899992" elapsed="0.002326"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:46.905551" 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-10-16T01:14:46.904899" elapsed="0.000764"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:46.906869" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:14:46.906200" elapsed="0.000771"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:14:46.915854" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:14:46.916005" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:14:46.916306" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:14:46.907861" elapsed="0.009354">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:14:46.907153" elapsed="0.010271">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:46.917937" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:46.917511" elapsed="0.000609"/>
</branch>
<status status="FAIL" start="2026-10-16T01:14:46.907102" elapsed="0.011078">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:46.919170" elapsed="0.000227"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:14:46.919682" elapsed="0.000084"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:46.919596" elapsed="0.000253"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:14:46.919553" elapsed="0.000349"/>
</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-10-16T01:14:46.920327" elapsed="0.000056"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:14:46.920509" elapsed="0.000048"/>
</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-10-16T01:14:46.903137" elapsed="0.017689">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:14:46.921003" 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-10-16T01:14:46.898817" elapsed="0.022404">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:46.921884" elapsed="0.000057"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:14:46.895178" elapsed="0.026880">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:14:46.894898" elapsed="0.027318">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:14:46.888857" elapsed="0.033635">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:47.932559" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:14:47.931663" elapsed="0.000962"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:14:47.933637" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:14:47.933000" elapsed="0.000690"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:14:47.933818" elapsed="0.000076"/>
</return>
<msg time="2026-10-16T01:14:47.934126" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:14:47.930778" elapsed="0.003399"/>
</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-10-16T01:14:47.940049" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:14:47.939423" elapsed="0.000681"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:14:47.940196" elapsed="0.000054"/>
</return>
<msg time="2026-10-16T01:14:47.940487" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:14:47.938665" elapsed="0.001877"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:47.943366" 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-10-16T01:14:47.942812" elapsed="0.000680"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:47.944450" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:14:47.943944" elapsed="0.000596"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:14:47.953191" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:14:47.953339" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:14:47.953660" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:14:47.945205" elapsed="0.009275">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:14:47.944677" elapsed="0.009965">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:47.955095" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:47.954743" elapsed="0.000482"/>
</branch>
<status status="FAIL" start="2026-10-16T01:14:47.944638" elapsed="0.010658">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:47.956090" elapsed="0.000051"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:14:47.956374" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:47.956298" elapsed="0.000163"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:14:47.956246" 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-10-16T01:14:47.956885" elapsed="0.000046"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:14:47.957027" elapsed="0.000030"/>
</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-10-16T01:14:47.941334" elapsed="0.015905">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:14:47.957382" elapsed="0.000031"/>
</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-10-16T01:14:47.937737" elapsed="0.019833">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:47.958057" elapsed="0.000049"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:14:47.934567" elapsed="0.023642">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:14:47.934313" elapsed="0.024034">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:14:47.929445" elapsed="0.029087">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<msg time="2026-10-16T01:14:47.958766" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<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="FAIL" start="2026-10-16T01:14:42.741747" elapsed="5.217218">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${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="NOT RUN" start="2026-10-16T01:14:47.959489" elapsed="0.000044"/>
</kw>
<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-10-16T01:14:42.174295" elapsed="5.785507">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<doc>Create bridge with OVS command and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-10-16T01:14:41.646139" elapsed="6.313970">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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-10-16T01:14:47.963729" elapsed="0.000486"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:14:47.963140" elapsed="0.001203"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:14:47.966490" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:47.966271" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:47.966233" elapsed="0.000399"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:14:47.970975" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:47.970791" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:47.970753" elapsed="0.000362"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:14:47.973157" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:14:47.972401" elapsed="0.000814"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:14:47.974228" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:14:47.973594" elapsed="0.000713"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:14:47.974399" elapsed="0.000060"/>
</return>
<msg time="2026-10-16T01:14:47.974682" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:14:47.971575" elapsed="0.003186"/>
</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-10-16T01:14:47.980751" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:47.980534" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:47.980496" elapsed="0.000401"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:14:47.982991" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:47.982865" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:47.982839" elapsed="0.000249"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:14:47.983660" 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-10-16T01:14:47.983320" elapsed="0.000377"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:47.984224" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:14:47.983968" elapsed="0.000291"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:14:48.029405" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:14:47.985168" elapsed="0.044597"/>
</kw>
<msg time="2026-10-16T01:14:48.030026" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:14:48.030069" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:47.984508" elapsed="0.045596"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:14:48.124237" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:14:48.030840" elapsed="0.093700"/>
</kw>
<msg time="2026-10-16T01:14:48.124776" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:14:48.124820" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:48.030331" elapsed="0.094525"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:48.125317" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:48.124975" elapsed="0.000434"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:48.124935" elapsed="0.000505"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:48.126091" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:14:48.125641" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:48.126450" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:48.126236" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:48.126219" elapsed="0.000400"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:14:48.126659" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:48.129383" 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-10-16T01:14:48.131203" elapsed="0.000555"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:48.133201" 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-10-16T01:14:48.127613" elapsed="0.005995"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:14:48.127047" elapsed="0.006698"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:14:47.982426" elapsed="0.151400"/>
</kw>
<msg time="2026-10-16T01:14:48.133914" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:14:48.133954" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:47.981223" elapsed="0.152765"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:14:48.134147" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-16T01:14:48.134060" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:48.134043" elapsed="0.000184"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:14:48.134582" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:48.134945" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:14:48.135010" 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-10-16T01:14:47.979873" elapsed="0.155226"/>
</kw>
<msg time="2026-10-16T01:14:48.135187" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:14:48.135227" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:47.975595" elapsed="0.159668"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:48.135568" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:48.135348" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:48.135332" elapsed="0.000307"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:14:47.975176" elapsed="0.160485"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:14:48.140387" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:48.140296" elapsed="0.000135"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:48.140263" 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-10-16T01:14:48.141584" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:48.141485" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:48.141462" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:14:48.142077" 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-10-16T01:14:48.141838" elapsed="0.000264"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:48.142453" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:14:48.142265" elapsed="0.000213"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:14:48.187401" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:14:48.143069" elapsed="0.044574"/>
</kw>
<msg time="2026-10-16T01:14:48.187864" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:14:48.187906" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:48.142635" elapsed="0.045304"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:14:48.296059" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:14:48.188809" elapsed="0.107531"/>
</kw>
<msg time="2026-10-16T01:14:48.296551" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:14:48.296594" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:48.188245" elapsed="0.108383"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:48.297060" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:48.296766" elapsed="0.000367"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:48.296729" elapsed="0.000434"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:48.297819" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:14:48.297378" elapsed="0.000522"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:48.298163" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:48.297961" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:48.297944" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:14:48.298310" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:48.301059" 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-10-16T01:14:48.302839" elapsed="0.000500"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:48.304681" 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-10-16T01:14:48.299271" elapsed="0.005808"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:14:48.298669" elapsed="0.006526"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:14:48.141207" elapsed="0.164068"/>
</kw>
<msg time="2026-10-16T01:14:48.305387" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:14:48.305429" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:48.140603" elapsed="0.164860"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:14:48.305622" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:14:48.305536" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:48.305519" elapsed="0.000256"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:14:48.306117" 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-10-16T01:14:48.306446" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:14:48.306512" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:14:48.139966" elapsed="0.166634"/>
</kw>
<msg time="2026-10-16T01:14:48.306691" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:14:48.306750" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:48.135971" elapsed="0.170817"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:48.307079" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:48.306859" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:48.306843" elapsed="0.000308"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:14:48.135833" elapsed="0.171394"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:14:48.310023" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:48.309937" elapsed="0.000132"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:48.309919" elapsed="0.000179"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:14:48.311240" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:48.311156" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:48.311139" elapsed="0.000181"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:14:48.311694" 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-10-16T01:14:48.311466" elapsed="0.000272"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:48.312073" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:14:48.311901" elapsed="0.000196"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:14:48.358789" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:14:48.312674" elapsed="0.046307"/>
</kw>
<msg time="2026-10-16T01:14:48.359145" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:14:48.359187" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:48.312250" elapsed="0.046970"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:14:48.486916" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:14:48.359862" elapsed="0.127240"/>
</kw>
<msg time="2026-10-16T01:14:48.487262" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:14:48.487319" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:48.359406" elapsed="0.127949"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:48.487638" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:48.487426" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:48.487408" elapsed="0.000356"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:48.488318" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:14:48.487955" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:48.488660" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:48.488458" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:48.488442" elapsed="0.000334"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:14:48.488807" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:48.491239" 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-10-16T01:14:48.492951" elapsed="0.000462"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:48.494587" elapsed="0.000561"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:14:48.489598" elapsed="0.005616"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:14:48.489087" elapsed="0.006258"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:14:48.310896" elapsed="0.184527"/>
</kw>
<msg time="2026-10-16T01:14:48.495504" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:14:48.495544" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:48.310272" elapsed="0.185306"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:14:48.495804" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:14:48.495682" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:48.495665" 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-10-16T01:14:48.496206" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:48.496526" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:14:48.496591" 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-10-16T01:14:48.309621" elapsed="0.187057"/>
</kw>
<msg time="2026-10-16T01:14:48.496861" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:14:48.496901" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:48.307521" elapsed="0.189417"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:48.497228" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:48.497009" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:48.496992" elapsed="0.000328"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:14:48.307380" elapsed="0.189963"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:14:47.974869" elapsed="0.522504"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:14:47.970063" elapsed="0.527367"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:14:47.965589" elapsed="0.531898"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:47.964664" elapsed="0.532869"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:14:47.962336" elapsed="0.535248"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:48.501311" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:48.501063" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:48.501046" elapsed="0.000341"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:48.501727" 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-10-16T01:14:48.501823" 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-10-16T01:14:48.501580" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:48.502342" 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.104" 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-10-16T01:14:48.502035" elapsed="0.000350"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:48.502886" level="INFO">${conn_id} = 46</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-10-16T01:14:48.502562" elapsed="0.000348"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:14:48.503810" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:14:48.503882" 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-10-16T01:14:48.503510" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:48.504053" elapsed="0.000305"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:14:48.505135" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:14:48.896602" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:14:06 UTC 2026

  System load:  0.12               Processes:             111
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:14:42 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:14:48.504901" elapsed="0.391980"/>
</kw>
<msg time="2026-10-16T01:14:48.896970" 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-10-16T01:14:48.504521" elapsed="0.392548"/>
</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-10-16T01:14:48.503103" elapsed="0.394092"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:14:48.897830" level="INFO">Executing command 'sudo ovs-vsctl add-port br-s1 vx1 -- set Interface vx1 type=vxlan'.</msg>
<msg time="2026-10-16T01:14:48.931535" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:14:48.931753" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:14:48.931819" 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-10-16T01:14:48.897535" elapsed="0.034320"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:48.932136" elapsed="0.000400"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:48.933432" 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-10-16T01:14:48.932955" elapsed="0.000555"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:14:48.933844" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:48.933646" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:48.933606" elapsed="0.000372"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:14:48.934202" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-10-16T01:14:48.934050" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:48.934029" elapsed="0.000314"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:14:48.934387" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:48.935589" 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-10-16T01:14:48.936419" elapsed="0.000254"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:48.936924" 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-10-16T01:14:48.934913" elapsed="0.002249"/>
</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-10-16T01:14:48.500580" elapsed="0.436701"/>
</kw>
<msg time="2026-10-16T01:14:48.937371" 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-10-16T01:14:48.500047" elapsed="0.437404"/>
</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-10-16T01:14:48.499605" elapsed="0.437973"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:14:48.938452" 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-10-16T01:14:48.937911" elapsed="0.000579"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:14:48.939266" 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-10-16T01:14:48.938811" elapsed="0.000519"/>
</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-10-16T01:14:48.945970" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:14:48.945486" elapsed="0.000519"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:14:48.946612" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:14:48.946216" elapsed="0.000430"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:14:48.946722" elapsed="0.000038"/>
</return>
<msg time="2026-10-16T01:14:48.946901" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:14:48.944975" elapsed="0.001959"/>
</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-10-16T01:14:48.950676" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:14:48.950275" elapsed="0.000456"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:14:48.950791" elapsed="0.000037"/>
</return>
<msg time="2026-10-16T01:14:48.950965" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:14:48.949831" elapsed="0.001168"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:48.952647" 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-10-16T01:14:48.952333" elapsed="0.000399"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:48.953341" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:14:48.952996" 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-10-16T01:14:48.959187" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:14:48.959245" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:14:48.959428" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:14:48.953869" elapsed="0.006042">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:14:48.953506" elapsed="0.006501">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:48.960202" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:48.960041" elapsed="0.000240"/>
</branch>
<status status="FAIL" start="2026-10-16T01:14:48.953482" elapsed="0.006839">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:48.960719" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:14:48.960857" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:48.960812" elapsed="0.000095"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:14:48.960795" 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-10-16T01:14:48.961089" elapsed="0.000026"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:14:48.961167" 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-10-16T01:14:48.951445" elapsed="0.009826">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:14:48.961342" 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-10-16T01:14:48.949219" elapsed="0.012222">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:48.961684" elapsed="0.000046"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:14:48.947240" elapsed="0.014547">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:14:48.947009" elapsed="0.014834">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:14:48.944261" elapsed="0.017667">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:49.972993" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:14:49.972004" elapsed="0.001059"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:14:49.974182" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:14:49.973471" elapsed="0.000769"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:14:49.974369" elapsed="0.000081"/>
</return>
<msg time="2026-10-16T01:14:49.974743" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:14:49.971060" elapsed="0.003742"/>
</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-10-16T01:14:49.980913" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:14:49.980249" elapsed="0.000720"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:14:49.981065" elapsed="0.000057"/>
</return>
<msg time="2026-10-16T01:14:49.981361" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:14:49.979503" elapsed="0.001911"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:49.984105" 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-10-16T01:14:49.983562" elapsed="0.000637"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:49.985167" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:14:49.984644" 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-10-16T01:14:49.993158" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:14:49.993274" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:14:49.993523" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:14:49.985967" elapsed="0.008387">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:14:49.985422" elapsed="0.009133">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:49.995039" elapsed="0.000482"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:49.994641" elapsed="0.000977"/>
</branch>
<status status="FAIL" start="2026-10-16T01:14:49.985381" elapsed="0.010289">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:49.996516" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:14:49.996816" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:49.996738" elapsed="0.000165"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:14:49.996674" elapsed="0.000275"/>
</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-10-16T01:14:49.997259" elapsed="0.000065"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:14:49.997423" elapsed="0.000031"/>
</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-10-16T01:14:49.982129" elapsed="0.015508">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:14:49.997885" 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-10-16T01:14:49.978526" elapsed="0.019562">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:49.998581" elapsed="0.000049"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:14:49.975205" elapsed="0.023564">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:14:49.974927" elapsed="0.023963">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:14:49.969549" elapsed="0.029528">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:51.008144" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:14:51.007341" elapsed="0.000864"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:14:51.009218" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:14:51.008569" elapsed="0.000703"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:14:51.009388" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:14:51.009676" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:14:51.006495" elapsed="0.003262"/>
</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-10-16T01:14:51.015583" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:14:51.014957" elapsed="0.000682"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:14:51.015885" elapsed="0.000070"/>
</return>
<msg time="2026-10-16T01:14:51.016187" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:14:51.014199" elapsed="0.002039"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:51.018879" 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-10-16T01:14:51.018348" elapsed="0.000625"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:51.019920" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:14:51.019408" elapsed="0.000601"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:14:51.027032" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:14:51.027141" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:14:51.027375" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:14:51.020662" elapsed="0.007469">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:14:51.020143" elapsed="0.008148">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:51.028751" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:51.028385" elapsed="0.000498"/>
</branch>
<status status="FAIL" start="2026-10-16T01:14:51.020106" elapsed="0.008825">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:51.030136" elapsed="0.000127"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:14:51.030513" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:51.030439" elapsed="0.000159"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:14:51.030401" 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-10-16T01:14:51.030983" elapsed="0.000045"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:14:51.031124" elapsed="0.000030"/>
</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-10-16T01:14:51.016937" elapsed="0.014419">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:14:51.031479" elapsed="0.000031"/>
</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-10-16T01:14:51.013223" elapsed="0.018445">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:51.032155" elapsed="0.000048"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:14:51.010113" elapsed="0.022196">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:14:51.009866" elapsed="0.022581">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:14:51.005354" elapsed="0.027274">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:52.042135" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:14:52.041249" elapsed="0.000951"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:14:52.043233" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:14:52.042570" elapsed="0.000718"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:14:52.043411" elapsed="0.000072"/>
</return>
<msg time="2026-10-16T01:14:52.043747" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:14:52.040400" elapsed="0.003401"/>
</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-10-16T01:14:52.049916" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:14:52.049178" elapsed="0.000797"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:14:52.050070" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:14:52.050364" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:14:52.048436" elapsed="0.001981"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:52.053139" 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-10-16T01:14:52.052598" elapsed="0.000634"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:52.054194" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:14:52.053673" elapsed="0.000621"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:14:52.061508" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:14:52.061621" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:14:52.061965" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:14:52.055016" elapsed="0.007759">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:14:52.054471" elapsed="0.008470">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:52.063370" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:52.063011" elapsed="0.000492"/>
</branch>
<status status="FAIL" start="2026-10-16T01:14:52.054430" elapsed="0.009122">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:52.064371" elapsed="0.000055"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:14:52.064645" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:52.064571" elapsed="0.000223"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:14:52.064535" elapsed="0.000309"/>
</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-10-16T01:14:52.065157" elapsed="0.000046"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:14:52.065299" elapsed="0.000053"/>
</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-10-16T01:14:52.051108" elapsed="0.014433">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:14:52.065663" 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-10-16T01:14:52.047464" elapsed="0.018425">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:52.066365" elapsed="0.000051"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:14:52.044168" elapsed="0.022354">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:14:52.043915" elapsed="0.022721">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:14:52.039152" elapsed="0.027742">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:53.076803" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:14:53.075982" elapsed="0.000881"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:14:53.077872" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:14:53.077203" elapsed="0.000723"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:14:53.078018" elapsed="0.000063"/>
</return>
<msg time="2026-10-16T01:14:53.078311" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:14:53.075126" elapsed="0.003255"/>
</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-10-16T01:14:53.084588" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:14:53.083825" elapsed="0.000821"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:14:53.084777" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:14:53.085111" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:14:53.082994" elapsed="0.002174"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:53.087924" 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-10-16T01:14:53.087378" elapsed="0.000641"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:53.089084" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:14:53.088460" elapsed="0.000716"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:14:53.096196" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:14:53.096315" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:14:53.096580" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:14:53.089945" elapsed="0.007460">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:14:53.089311" elapsed="0.008267">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:53.098046" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:53.097652" elapsed="0.000534"/>
</branch>
<status status="FAIL" start="2026-10-16T01:14:53.089275" elapsed="0.008965">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:53.099029" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:14:53.099294" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:53.099222" elapsed="0.000181"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:14:53.099186" elapsed="0.000263"/>
</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-10-16T01:14:53.099783" elapsed="0.000044"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:14:53.099923" elapsed="0.000030"/>
</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-10-16T01:14:53.085883" elapsed="0.014249">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:14:53.100249" 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-10-16T01:14:53.081953" elapsed="0.018510">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:53.100953" elapsed="0.000051"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:14:53.078765" elapsed="0.022344">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:14:53.078488" elapsed="0.022733">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:14:53.073793" elapsed="0.027631">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:54.111150" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:14:54.110332" elapsed="0.000879"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:14:54.112217" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:14:54.111570" elapsed="0.000701"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:14:54.112385" elapsed="0.000066"/>
</return>
<msg time="2026-10-16T01:14:54.112679" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:14:54.109502" elapsed="0.003259"/>
</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-10-16T01:14:54.118737" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:14:54.118070" elapsed="0.000726"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:14:54.118891" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:14:54.119163" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:14:54.117306" elapsed="0.001909"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:54.121872" 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-10-16T01:14:54.121319" elapsed="0.000647"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:54.122927" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:14:54.122405" 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-10-16T01:14:54.129809" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:14:54.129950" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:14:54.130194" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:14:54.123676" elapsed="0.007291">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:14:54.123153" elapsed="0.007978">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:54.131564" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:54.131199" elapsed="0.000496"/>
</branch>
<status status="FAIL" start="2026-10-16T01:14:54.123116" elapsed="0.008661">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:54.132536" elapsed="0.000052"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:14:54.132835" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:54.132759" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:14:54.132693" elapsed="0.000299"/>
</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-10-16T01:14:54.133298" elapsed="0.000042"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:14:54.133457" 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-10-16T01:14:54.119918" elapsed="0.013751">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:14:54.133820" 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-10-16T01:14:54.116339" elapsed="0.017673">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:54.134492" elapsed="0.000049"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:14:54.113202" elapsed="0.021444">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:14:54.112950" elapsed="0.021849">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:14:54.108308" elapsed="0.026750">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<msg time="2026-10-16T01:14:54.135249" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<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="FAIL" start="2026-10-16T01:14:48.939649" elapsed="5.195818">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${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="NOT RUN" start="2026-10-16T01:14:54.136003" elapsed="0.000046"/>
</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="FAIL" start="2026-10-16T01:14:48.499217" elapsed="5.637034">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<doc>Add port with OVS command and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-10-16T01:14:47.960995" elapsed="6.175576">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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-10-16T01:14:54.140237" elapsed="0.000533"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:14:54.139231" elapsed="0.001658"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:14:54.142992" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:54.142792" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:54.142751" elapsed="0.000385"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:14:54.147410" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:54.147194" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:54.147157" elapsed="0.000396"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:14:54.149692" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:14:54.148941" elapsed="0.000840"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:14:54.150822" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:14:54.150116" elapsed="0.000771"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:14:54.150982" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:14:54.151268" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:14:54.148059" elapsed="0.003261"/>
</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-10-16T01:14:54.157074" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:54.156853" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:54.156812" elapsed="0.000405"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:14:54.158831" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:54.158685" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:54.158662" elapsed="0.000256"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:14:54.159459" 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-10-16T01:14:54.159119" elapsed="0.000375"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:54.159981" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:14:54.159738" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:14:54.202150" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:14:54.160848" elapsed="0.041907"/>
</kw>
<msg time="2026-10-16T01:14:54.203388" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:14:54.203494" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:54.160228" elapsed="0.043353"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:14:54.284933" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:14:54.205418" elapsed="0.079879"/>
</kw>
<msg time="2026-10-16T01:14:54.285574" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:14:54.285621" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:54.204155" elapsed="0.081504"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:54.286221" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:54.285833" elapsed="0.000481"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:54.285781" elapsed="0.000573"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:54.287517" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:14:54.286591" elapsed="0.001030"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:54.287966" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:54.287723" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:54.287680" elapsed="0.000388"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:14:54.288106" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:54.291100" 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-10-16T01:14:54.293238" elapsed="0.000610"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:54.295142" elapsed="0.000364"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:14:54.289243" elapsed="0.006349"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:14:54.288562" elapsed="0.007399"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:14:54.158308" elapsed="0.137751"/>
</kw>
<msg time="2026-10-16T01:14:54.296151" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:14:54.296205" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:54.157459" elapsed="0.138785"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:14:54.296436" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-16T01:14:54.296318" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:54.296299" 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-10-16T01:14:54.296929" 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-10-16T01:14:54.297286" elapsed="0.000031"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:14:54.297386" 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-10-16T01:14:54.156112" elapsed="0.141369"/>
</kw>
<msg time="2026-10-16T01:14:54.297572" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:14:54.297614" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:54.152240" elapsed="0.145413"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:54.298134" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:54.297885" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:54.297864" elapsed="0.000361"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:14:54.151917" elapsed="0.146332"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:14:54.301029" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:54.300922" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:54.300904" 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-10-16T01:14:54.302333" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:54.302219" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:54.302198" elapsed="0.000219"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:14:54.302867" 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-10-16T01:14:54.302584" elapsed="0.000309"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:54.303276" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:14:54.303075" elapsed="0.000227"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:14:54.352321" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:14:54.303986" elapsed="0.048544"/>
</kw>
<msg time="2026-10-16T01:14:54.352758" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:14:54.352803" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:54.303500" elapsed="0.049339"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:14:54.433897" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:14:54.353493" elapsed="0.080671"/>
</kw>
<msg time="2026-10-16T01:14:54.434401" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:14:54.434444" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:54.353037" elapsed="0.081444"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:54.434950" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:54.434603" elapsed="0.000425"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:54.434565" elapsed="0.000493"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:54.435727" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:14:54.435248" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:54.436073" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:54.435874" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:54.435856" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:14:54.436202" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:54.439252" 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-10-16T01:14:54.441014" elapsed="0.000504"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:54.442956" 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-10-16T01:14:54.437497" elapsed="0.005851"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:14:54.436584" elapsed="0.006898"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:14:54.301948" elapsed="0.141613"/>
</kw>
<msg time="2026-10-16T01:14:54.443729" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:14:54.443772" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:54.301245" elapsed="0.142563"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:14:54.443968" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-16T01:14:54.443879" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:54.443862" elapsed="0.000185"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:14:54.444399" 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-10-16T01:14:54.444798" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:14:54.444865" 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-10-16T01:14:54.300555" elapsed="0.144398"/>
</kw>
<msg time="2026-10-16T01:14:54.445039" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:14:54.445080" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:54.298566" elapsed="0.146549"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:54.445415" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:54.445183" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:54.445167" elapsed="0.000322"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:14:54.298404" elapsed="0.147107"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:14:54.448040" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:54.447955" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:54.447937" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:14:54.449208" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:54.449122" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:54.449106" elapsed="0.000164"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:14:54.449665" 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-10-16T01:14:54.449429" elapsed="0.000260"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:54.450042" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:14:54.449868" elapsed="0.000199"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:14:54.495763" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:14:54.450647" elapsed="0.045395"/>
</kw>
<msg time="2026-10-16T01:14:54.496267" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:14:54.496312" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:54.450218" elapsed="0.046158"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:14:54.571840" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:14:54.497285" elapsed="0.074793"/>
</kw>
<msg time="2026-10-16T01:14:54.572287" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:14:54.572332" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:54.496656" elapsed="0.075753"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:54.572818" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:54.572516" elapsed="0.000379"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:54.572484" elapsed="0.000503"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:54.573629" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:14:54.573190" elapsed="0.000537"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:54.573994" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:54.573791" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:54.573773" elapsed="0.000329"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:14:54.574137" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:54.576911" 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-10-16T01:14:54.578683" elapsed="0.000511"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:54.580412" elapsed="0.002496"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:14:54.575065" elapsed="0.007916"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:14:54.574504" elapsed="0.008598"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:14:54.448867" elapsed="0.134319"/>
</kw>
<msg time="2026-10-16T01:14:54.583275" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:14:54.583314" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:54.448250" elapsed="0.135101"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:14:54.583524" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-16T01:14:54.583437" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:54.583420" elapsed="0.000184"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:14:54.583959" 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-10-16T01:14:54.584294" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:14:54.584360" elapsed="0.000033"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:14:54.447625" elapsed="0.136849"/>
</kw>
<msg time="2026-10-16T01:14:54.584560" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:14:54.584599" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:54.445800" elapsed="0.138834"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:54.584948" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:54.584726" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:54.584688" elapsed="0.000331"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:14:54.445642" elapsed="0.139399"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:14:54.151448" elapsed="0.433622"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:14:54.146511" elapsed="0.438610"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:14:54.142161" elapsed="0.443010"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:54.141220" elapsed="0.443992"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:14:54.138437" elapsed="0.446822"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:54.587791" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:54.587545" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:54.587528" elapsed="0.000377"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:54.588230" 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-10-16T01:14:54.588327" 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-10-16T01:14:54.588096" elapsed="0.000256"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:54.588861" level="INFO">Attempting to execute command "ip tuntap add mode tap vport1" on remote system "10.30.171.104" 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-10-16T01:14:54.588555" elapsed="0.000350"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:54.589410" level="INFO">${conn_id} = 51</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-10-16T01:14:54.589078" elapsed="0.000358"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:14:54.590269" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:14:54.590339" 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-10-16T01:14:54.590004" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:54.590530" elapsed="0.000297"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:14:54.591641" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:14:54.985750" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:14:06 UTC 2026

  System load:  0.12               Processes:             111
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:14:48 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:14:54.591349" elapsed="0.394491"/>
</kw>
<msg time="2026-10-16T01:14:54.985901" 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-10-16T01:14:54.590989" elapsed="0.394973"/>
</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-10-16T01:14:54.589627" elapsed="0.396417"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:14:54.986428" level="INFO">Executing command 'ip tuntap add mode tap vport1'.</msg>
<msg time="2026-10-16T01:14:54.999466" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-10-16T01:14:54.999604" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:14:54.999659" 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-10-16T01:14:54.986251" elapsed="0.013439"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:54.999933" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:55.000885" 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-10-16T01:14:55.000535" elapsed="0.000409"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:14:55.001168" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:55.001034" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:55.001008" elapsed="0.000252"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:14:55.001463" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-10-16T01:14:55.001327" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:55.001307" elapsed="0.000273"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:14:55.001641" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:55.002671" elapsed="0.000415"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:14:55.003335" elapsed="0.000213"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:55.003760" elapsed="0.000127"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:14:55.002083" elapsed="0.001869"/>
</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-10-16T01:14:54.587111" elapsed="0.416993"/>
</kw>
<msg time="2026-10-16T01:14:55.004174" 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-10-16T01:14:54.586231" elapsed="0.418008"/>
</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-10-16T01:14:54.585821" elapsed="0.418521"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:55.006946" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:55.006597" elapsed="0.000421"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:55.006573" elapsed="0.000478"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:55.007500" 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-10-16T01:14:55.007626" 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-10-16T01:14:55.007316" elapsed="0.000344"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:55.008343" level="INFO">Attempting to execute command "ip tuntap add mode tap vport2" on remote system "10.30.171.104" 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-10-16T01:14:55.007940" elapsed="0.000480"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:55.009090" 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-10-16T01:14:55.008661" elapsed="0.000463"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:14:55.010247" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:14:55.010341" 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-10-16T01:14:55.009912" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:55.010593" elapsed="0.000417"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:14:55.012106" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:14:55.423528" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:14:06 UTC 2026

  System load:  0.12               Processes:             111
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:14:54 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:14:55.011784" elapsed="0.411832"/>
</kw>
<msg time="2026-10-16T01:14:55.423676" 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-10-16T01:14:55.011234" elapsed="0.412518"/>
</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-10-16T01:14:55.009403" elapsed="0.414434"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:14:55.424195" level="INFO">Executing command 'ip tuntap add mode tap vport2'.</msg>
<msg time="2026-10-16T01:14:55.437346" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-10-16T01:14:55.437460" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:14:55.437500" 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-10-16T01:14:55.424043" elapsed="0.013478"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:55.437677" elapsed="0.000234"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:55.438357" 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-10-16T01:14:55.438122" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:14:55.438733" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:55.438525" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:55.438499" elapsed="0.000331"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:14:55.439015" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-10-16T01:14:55.438897" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:55.438877" elapsed="0.000247"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:14:55.439167" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:55.440144" elapsed="0.000409"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:14:55.440828" elapsed="0.000190"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:55.441212" elapsed="0.000121"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:14:55.439580" elapsed="0.001834"/>
</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-10-16T01:14:55.005998" elapsed="0.435515"/>
</kw>
<msg time="2026-10-16T01:14:55.441579" 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-10-16T01:14:55.005222" elapsed="0.436422"/>
</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-10-16T01:14:55.004605" elapsed="0.437161"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:55.444339" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:55.444016" elapsed="0.000412"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:55.443991" elapsed="0.000471"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:55.444915" 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-10-16T01:14:55.445042" 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-10-16T01:14:55.444747" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:55.445773" level="INFO">Attempting to execute command "ifconfig vport1 up" on remote system "10.30.171.104" 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-10-16T01:14:55.445335" elapsed="0.000498"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:55.446502" 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-10-16T01:14:55.446075" elapsed="0.000460"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:14:55.447667" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:14:55.447788" 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-10-16T01:14:55.447317" elapsed="0.000503"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:55.448026" elapsed="0.000419"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:14:55.449544" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:14:55.900758" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:14:06 UTC 2026

  System load:  0.12               Processes:             111
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:14:55 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:14:55.449207" elapsed="0.451630"/>
</kw>
<msg time="2026-10-16T01:14:55.900891" 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-10-16T01:14:55.448672" elapsed="0.452313"/>
</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-10-16T01:14:55.446826" elapsed="0.454236"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:14:55.901413" level="INFO">Executing command 'ifconfig vport1 up'.</msg>
<msg time="2026-10-16T01:14:55.914275" level="INFO">Command exited with return code 255.</msg>
<msg time="2026-10-16T01:14:55.914372" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:14:55.914428" 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-10-16T01:14:55.901255" elapsed="0.013195"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:55.914601" elapsed="0.000224"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:55.915263" 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-10-16T01:14:55.915031" elapsed="0.000273"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:14:55.915547" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:55.915374" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:55.915352" elapsed="0.000288"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:14:55.915843" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-10-16T01:14:55.915727" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:55.915687" elapsed="0.000263"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:14:55.915993" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:55.916944" elapsed="0.000383"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:14:55.917596" elapsed="0.000209"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:55.918001" 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-10-16T01:14:55.916374" elapsed="0.001815"/>
</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-10-16T01:14:55.443413" elapsed="0.474870"/>
</kw>
<msg time="2026-10-16T01:14:55.918345" 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-10-16T01:14:55.442669" elapsed="0.475754"/>
</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-10-16T01:14:55.442030" elapsed="0.476491"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:55.921033" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:55.920689" elapsed="0.000416"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:55.920665" elapsed="0.000474"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:55.921587" 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-10-16T01:14:55.921734" 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-10-16T01:14:55.921417" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:55.922447" level="INFO">Attempting to execute command "ifconfig vport2 up" on remote system "10.30.171.104" 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-10-16T01:14:55.922032" elapsed="0.000475"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:55.923175" 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-10-16T01:14:55.922768" elapsed="0.000440"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:14:55.924337" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:14:55.924453" 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-10-16T01:14:55.924003" elapsed="0.000481"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:55.924689" elapsed="0.000414"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:14:55.926489" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:14:56.330310" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:14:06 UTC 2026

  System load:  0.12               Processes:             111
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:14:55 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:14:55.925927" elapsed="0.404481"/>
</kw>
<msg time="2026-10-16T01:14:56.330466" 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-10-16T01:14:55.925393" elapsed="0.405128"/>
</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-10-16T01:14:55.923486" elapsed="0.407122"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:14:56.330992" level="INFO">Executing command 'ifconfig vport2 up'.</msg>
<msg time="2026-10-16T01:14:56.344011" level="INFO">Command exited with return code 255.</msg>
<msg time="2026-10-16T01:14:56.344113" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:14:56.344153" 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-10-16T01:14:56.330834" elapsed="0.013342"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:56.344331" elapsed="0.000226"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:56.345038" 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-10-16T01:14:56.344792" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:14:56.345248" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:56.345150" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:56.345128" elapsed="0.000186"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:14:56.345460" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:14:56.345361" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:56.345347" elapsed="0.000190"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:14:56.345568" elapsed="0.000012"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:56.346266" elapsed="0.000295"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:14:56.346758" elapsed="0.000143"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:56.347038" elapsed="0.000090"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:14:56.345869" elapsed="0.001306"/>
</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-10-16T01:14:55.920097" elapsed="0.427145"/>
</kw>
<msg time="2026-10-16T01:14:56.347289" 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-10-16T01:14:55.919355" elapsed="0.427978"/>
</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-10-16T01:14:55.918780" elapsed="0.428639"/>
</kw>
<doc>Create Tap Device vport1 and vport2 to add to the bridge br-s1 using OVS command.</doc>
<status status="PASS" start="2026-10-16T01:14:54.585477" elapsed="1.761994"/>
</kw>
<doc>Create tap devices to add to the bridge in ovs</doc>
<status status="PASS" start="2026-10-16T01:14:54.137302" elapsed="2.210284"/>
</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-10-16T01:14:56.349166" elapsed="0.000201"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:14:56.348907" 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-10-16T01:14:56.350341" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:56.350255" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:56.350238" elapsed="0.000226"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:14:56.352624" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:56.352542" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:56.352525" elapsed="0.000162"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:14:56.353601" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:14:56.353258" elapsed="0.000369"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:14:56.354064" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:14:56.353792" elapsed="0.000296"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:14:56.354128" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:14:56.354253" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:14:56.352907" elapsed="0.001368"/>
</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-10-16T01:14:56.356782" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:56.356681" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:56.356664" elapsed="0.000181"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:14:56.358018" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:56.357934" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:56.357918" elapsed="0.000164"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:14:56.358476" 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-10-16T01:14:56.358226" elapsed="0.000275"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:56.358851" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:14:56.358665" elapsed="0.000210"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:14:56.399114" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:14:56.359464" elapsed="0.039848"/>
</kw>
<msg time="2026-10-16T01:14:56.399490" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:14:56.399532" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:56.359027" elapsed="0.040540"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:14:56.489353" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:14:56.400180" elapsed="0.089377"/>
</kw>
<msg time="2026-10-16T01:14:56.489737" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:14:56.489779" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:56.399755" elapsed="0.090059"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:56.490091" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:56.489884" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:56.489866" elapsed="0.000319"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:56.490740" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:14:56.490366" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:56.491082" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:56.490887" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:56.490871" elapsed="0.000304"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:14:56.491240" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:56.493793" elapsed="0.000485"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:14:56.495578" elapsed="0.000611"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:56.497400" elapsed="0.000559"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:14:56.492060" elapsed="0.005969"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:14:56.491535" elapsed="0.006610"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:14:56.357651" elapsed="0.140571"/>
</kw>
<msg time="2026-10-16T01:14:56.498305" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:14:56.498345" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:56.356991" elapsed="0.141389"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:14:56.498553" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:14:56.498469" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:56.498451" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:14:56.498968" 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-10-16T01:14:56.499268" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:14:56.499332" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:14:56.356376" elapsed="0.143059"/>
</kw>
<msg time="2026-10-16T01:14:56.499522" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:14:56.499560" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:56.354655" elapsed="0.144940"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:56.499968" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:56.499661" elapsed="0.000356"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:56.499645" elapsed="0.000394"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:14:56.354511" elapsed="0.145550"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:14:56.502561" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:56.502475" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:56.502458" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:14:56.503754" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:56.503643" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:56.503627" elapsed="0.000201"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:14:56.504200" 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-10-16T01:14:56.503972" elapsed="0.000252"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:56.504571" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:14:56.504384" elapsed="0.000211"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:14:56.550005" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:14:56.505179" elapsed="0.045002"/>
</kw>
<msg time="2026-10-16T01:14:56.550349" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:14:56.550403" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:56.504766" elapsed="0.045673"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:14:56.650945" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:14:56.551049" elapsed="0.100077"/>
</kw>
<msg time="2026-10-16T01:14:56.651285" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:14:56.651327" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:56.550603" elapsed="0.100759"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:56.651657" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:56.651451" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:56.651432" elapsed="0.000345"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:56.652341" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:14:56.651958" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:56.652731" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:56.652504" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:56.652487" elapsed="0.000340"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:14:56.652858" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:56.655369" 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-10-16T01:14:56.657138" elapsed="0.000470"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:56.659012" 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-10-16T01:14:56.653684" elapsed="0.005872"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:14:56.653152" elapsed="0.006520"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:14:56.503369" elapsed="0.156422"/>
</kw>
<msg time="2026-10-16T01:14:56.659886" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:14:56.659925" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:56.502793" elapsed="0.157167"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:14:56.660115" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:14:56.660030" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:56.660013" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:14:56.660526" 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-10-16T01:14:56.660883" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:14:56.660949" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:14:56.502171" elapsed="0.158862"/>
</kw>
<msg time="2026-10-16T01:14:56.661115" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:14:56.661153" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:56.500311" elapsed="0.160877"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:56.661491" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:56.661254" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:56.661238" elapsed="0.000327"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:14:56.500175" elapsed="0.161412"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:14:56.664083" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:56.663997" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:56.663980" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:14:56.665247" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:56.665163" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:56.665147" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:14:56.665692" 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-10-16T01:14:56.665468" elapsed="0.000266"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:56.666069" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:14:56.665902" elapsed="0.000191"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:14:56.715290" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:14:56.666686" elapsed="0.048803"/>
</kw>
<msg time="2026-10-16T01:14:56.715645" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:14:56.715687" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:56.666248" elapsed="0.049496"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:14:56.815413" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:14:56.716335" elapsed="0.099265"/>
</kw>
<msg time="2026-10-16T01:14:56.815779" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:14:56.815820" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:56.715911" elapsed="0.099945"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:56.816130" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:56.815927" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:56.815909" elapsed="0.000315"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:56.816774" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:14:56.816422" elapsed="0.000439"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:56.817116" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:56.816921" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:56.816905" elapsed="0.000303"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:14:56.817238" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:56.819694" 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-10-16T01:14:56.821432" elapsed="0.000471"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:56.823242" elapsed="0.000505"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:14:56.818043" elapsed="0.005775"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:14:56.817525" elapsed="0.006407"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:14:56.664908" elapsed="0.159101"/>
</kw>
<msg time="2026-10-16T01:14:56.824091" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:14:56.824129" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:56.664292" elapsed="0.159873"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:14:56.824355" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:14:56.824270" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:56.824252" elapsed="0.000198"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:14:56.824849" 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-10-16T01:14:56.825145" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:14:56.825209" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:14:56.663690" elapsed="0.161602"/>
</kw>
<msg time="2026-10-16T01:14:56.825375" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:14:56.825428" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:56.661943" elapsed="0.163521"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:56.825768" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:56.825532" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:56.825516" elapsed="0.000325"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:14:56.661803" elapsed="0.164060"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:14:56.354334" elapsed="0.471557"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:14:56.352233" elapsed="0.473713"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:14:56.350000" elapsed="0.475998"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:14:56.349581" elapsed="0.476462"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:14:56.348546" elapsed="0.477551"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:14:56.829635" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:56.829384" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:56.829367" elapsed="0.000359"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:56.830051" 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-10-16T01:14:56.830174" 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-10-16T01:14:56.829919" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:56.830722" 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.104" 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-10-16T01:14:56.830415" elapsed="0.000351"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:14:56.831245" level="INFO">${conn_id} = 62</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-10-16T01:14:56.830942" elapsed="0.000328"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:14:56.832122" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:14:56.832194" 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-10-16T01:14:56.831852" elapsed="0.000365"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:56.832365" elapsed="0.000301"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:14:56.833499" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:14:57.227822" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:14:06 UTC 2026

  System load:  0.12               Processes:             111
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:14:56 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:14:56.833228" elapsed="0.394747"/>
</kw>
<msg time="2026-10-16T01:14:57.228043" 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-10-16T01:14:56.832843" elapsed="0.395276"/>
</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-10-16T01:14:56.831479" elapsed="0.396739"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:14:57.228648" level="INFO">Executing command 'sudo ovs-vsctl add-port br-s1 vport1 -- add-port br-s1 vport2'.</msg>
<msg time="2026-10-16T01:14:57.281735" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:14:57.281970" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:14:57.282065" 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-10-16T01:14:57.228463" elapsed="0.053655"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:57.282499" elapsed="0.000440"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:57.284109" 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-10-16T01:14:57.283508" 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-10-16T01:14:57.284616" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:57.284363" elapsed="0.000384"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:57.284320" elapsed="0.000479"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:14:57.285095" elapsed="0.000054"/>
</return>
<status status="PASS" start="2026-10-16T01:14:57.284908" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-10-16T01:14:57.284876" elapsed="0.000393"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:14:57.285338" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:14:57.286972" elapsed="0.000680"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:14:57.288224" elapsed="0.000343"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:14:57.288916" elapsed="0.000197"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:14:57.286035" elapsed="0.003183"/>
</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-10-16T01:14:56.828958" elapsed="0.460414"/>
</kw>
<msg time="2026-10-16T01:14:57.289502" 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-10-16T01:14:56.828416" elapsed="0.461187"/>
</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-10-16T01:14:56.827964" elapsed="0.461834"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:14:57.291003" 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-10-16T01:14:57.290231" elapsed="0.000828"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:14:57.292293" 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-10-16T01:14:57.291507" elapsed="0.000843"/>
</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-10-16T01:14:57.300140" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:14:57.299764" elapsed="0.000403"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:14:57.300967" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:14:57.300319" elapsed="0.000708"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:14:57.301121" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:14:57.301440" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:14:57.299371" elapsed="0.002122"/>
</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-10-16T01:14:57.305604" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:14:57.305208" elapsed="0.000431"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:14:57.305715" elapsed="0.000038"/>
</return>
<msg time="2026-10-16T01:14:57.305887" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:14:57.304753" elapsed="0.001166"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:57.307600" 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-10-16T01:14:57.307222" elapsed="0.000436"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:57.308243" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:14:57.307941" elapsed="0.000367"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:14:57.313921" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:14:57.313994" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:14:57.314155" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:14:57.308976" elapsed="0.005756">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:14:57.308630" elapsed="0.006210">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:57.315097" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:57.314884" elapsed="0.000295"/>
</branch>
<status status="FAIL" start="2026-10-16T01:14:57.308368" elapsed="0.006842">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:57.315773" elapsed="0.000035"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:14:57.315946" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:57.315898" elapsed="0.000100"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:14:57.315876" elapsed="0.000151"/>
</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-10-16T01:14:57.316216" elapsed="0.000027"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:14:57.316303" elapsed="0.000019"/>
</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-10-16T01:14:57.306332" elapsed="0.010123">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:14:57.316531" 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-10-16T01:14:57.304145" elapsed="0.012503">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:57.316956" elapsed="0.000030"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:14:57.301997" elapsed="0.015055">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:14:57.301728" elapsed="0.015397">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:14:57.298893" elapsed="0.018348">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:58.327376" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:14:58.326494" elapsed="0.000972"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:14:58.328499" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:14:58.327852" elapsed="0.000702"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:14:58.328650" elapsed="0.000103"/>
</return>
<msg time="2026-10-16T01:14:58.328988" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:14:58.325559" elapsed="0.003482"/>
</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-10-16T01:14:58.334968" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:14:58.334314" elapsed="0.000709"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:14:58.335117" elapsed="0.000057"/>
</return>
<msg time="2026-10-16T01:14:58.335384" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:14:58.333550" elapsed="0.001910"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:58.338139" 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-10-16T01:14:58.337604" elapsed="0.000627"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:58.339263" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:14:58.338674" 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-10-16T01:14:58.347004" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:14:58.347120" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:14:58.347333" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:14:58.340076" elapsed="0.008147">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:14:58.339519" elapsed="0.008888">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:58.348963" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:58.348544" elapsed="0.000558"/>
</branch>
<status status="FAIL" start="2026-10-16T01:14:58.339480" elapsed="0.009673">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:58.349976" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:14:58.350243" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:58.350169" elapsed="0.000158"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:14:58.350134" 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-10-16T01:14:58.350779" elapsed="0.000060"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:14:58.350941" elapsed="0.000031"/>
</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-10-16T01:14:58.336148" elapsed="0.015008">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:14:58.351401" elapsed="0.000054"/>
</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-10-16T01:14:58.332587" elapsed="0.019034">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:58.352120" elapsed="0.000050"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:14:58.329407" elapsed="0.022870">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:14:58.329154" elapsed="0.023239">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:14:58.324121" elapsed="0.028488">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:59.362204" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:14:59.361269" elapsed="0.001003"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:14:59.363394" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:14:59.362755" elapsed="0.000717"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:14:59.363570" elapsed="0.000072"/>
</return>
<msg time="2026-10-16T01:14:59.363907" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:14:59.360405" elapsed="0.003552"/>
</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-10-16T01:14:59.370009" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:14:59.369354" elapsed="0.000711"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:14:59.370158" elapsed="0.000056"/>
</return>
<msg time="2026-10-16T01:14:59.370512" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:14:59.368598" elapsed="0.001974"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:59.373416" 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-10-16T01:14:59.372896" elapsed="0.000675"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:14:59.374547" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:14:59.374033" elapsed="0.000607"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:14:59.381634" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:14:59.381787" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:14:59.382000" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:14:59.375349" elapsed="0.007457">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:14:59.374816" elapsed="0.008155">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:59.383378" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:14:59.383041" elapsed="0.000492"/>
</branch>
<status status="FAIL" start="2026-10-16T01:14:59.374774" elapsed="0.008809">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:59.388295" elapsed="0.000163"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:14:59.388690" elapsed="0.000058"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:14:59.388615" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:14:59.388576" elapsed="0.000276"/>
</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-10-16T01:14:59.389162" elapsed="0.000044"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:14:59.389304" elapsed="0.000031"/>
</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-10-16T01:14:59.371402" elapsed="0.018136">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:14:59.389660" 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-10-16T01:14:59.367624" elapsed="0.022260">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:59.390348" elapsed="0.000051"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:14:59.364324" elapsed="0.026208">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:14:59.364072" elapsed="0.026575">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:14:59.359156" elapsed="0.031707">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:15:00.401179" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:00.400214" elapsed="0.001033"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:00.402290" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:00.401628" elapsed="0.000718"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:00.402471" elapsed="0.000079"/>
</return>
<msg time="2026-10-16T01:15:00.402823" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:00.399195" elapsed="0.003681"/>
</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-10-16T01:15:00.408980" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:15:00.408286" elapsed="0.000752"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:15:00.409133" elapsed="0.000057"/>
</return>
<msg time="2026-10-16T01:15:00.409404" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:15:00.407530" elapsed="0.001950"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:00.412760" 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-10-16T01:15:00.412115" elapsed="0.000746"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:00.413843" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:00.413284" elapsed="0.000649"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:15:00.421089" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:15:00.421205" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:15:00.421555" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:15:00.414615" elapsed="0.007738">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:00.414075" elapsed="0.008471">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:15:00.422993" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:00.422621" elapsed="0.000506"/>
</branch>
<status status="FAIL" start="2026-10-16T01:15:00.414036" elapsed="0.009141">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:15:00.424205" elapsed="0.000057"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:00.424923" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:00.424410" elapsed="0.000608"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:00.424374" elapsed="0.000690"/>
</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-10-16T01:15:00.425381" elapsed="0.000043"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:15:00.425547" 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-10-16T01:15:00.410266" elapsed="0.015529">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:00.425920" 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-10-16T01:15:00.406560" elapsed="0.019550">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:15:00.426606" elapsed="0.000051"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:15:00.403251" elapsed="0.023544">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:15:00.402995" elapsed="0.023919">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:15:00.397841" elapsed="0.029257">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:15:01.437583" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:01.436728" elapsed="0.000921"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:01.438667" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:01.438027" elapsed="0.000726"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:01.438852" elapsed="0.000077"/>
</return>
<msg time="2026-10-16T01:15:01.439164" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:01.435854" elapsed="0.003362"/>
</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-10-16T01:15:01.445146" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:15:01.444508" elapsed="0.000710"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:15:01.445343" elapsed="0.000072"/>
</return>
<msg time="2026-10-16T01:15:01.445664" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:15:01.443769" elapsed="0.001978"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:01.448382" 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-10-16T01:15:01.447873" elapsed="0.000631"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:01.449664" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:01.448955" elapsed="0.000843"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:15:01.457139" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:15:01.457257" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:15:01.457494" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:15:01.450559" elapsed="0.007719">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:01.449947" elapsed="0.008496">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:15:01.458918" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:01.458543" elapsed="0.000509"/>
</branch>
<status status="FAIL" start="2026-10-16T01:15:01.449905" elapsed="0.009198">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:15:01.459900" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:01.460169" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:01.460096" elapsed="0.000157"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:01.460059" elapsed="0.000239"/>
</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-10-16T01:15:01.460632" elapsed="0.000047"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:15:01.460807" 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-10-16T01:15:01.446424" elapsed="0.014597">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:01.461143" elapsed="0.000031"/>
</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-10-16T01:15:01.442798" elapsed="0.018536">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:15:01.461875" elapsed="0.000051"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:15:01.439607" elapsed="0.022428">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:15:01.439330" elapsed="0.022822">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:15:01.434536" elapsed="0.027800">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:15:02.472600" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:02.471759" elapsed="0.000904"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:02.473666" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:02.473036" elapsed="0.000713"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:02.473847" elapsed="0.000068"/>
</return>
<msg time="2026-10-16T01:15:02.474145" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:02.470899" elapsed="0.003298"/>
</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-10-16T01:15:02.480233" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:15:02.479602" elapsed="0.000687"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:15:02.480383" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:15:02.480675" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:15:02.478879" elapsed="0.001875"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:02.483359" 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-10-16T01:15:02.482856" elapsed="0.000597"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:02.484404" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:02.483924" elapsed="0.000600"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:15:02.491271" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:15:02.491382" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:15:02.491652" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:15:02.485202" elapsed="0.007241">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:02.484667" elapsed="0.007966">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:15:02.493090" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:02.492742" elapsed="0.000479"/>
</branch>
<status status="FAIL" start="2026-10-16T01:15:02.484628" elapsed="0.008642">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:15:02.494061" elapsed="0.000052"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:02.494331" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:02.494254" elapsed="0.000164"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:02.494218" elapsed="0.000246"/>
</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-10-16T01:15:02.494820" elapsed="0.000044"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:15:02.494961" 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-10-16T01:15:02.481417" elapsed="0.013757">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:02.495295" 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-10-16T01:15:02.477920" elapsed="0.017585">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:15:02.495998" elapsed="0.000049"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:15:02.474682" elapsed="0.021472">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:15:02.474408" elapsed="0.021862">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:15:02.469625" elapsed="0.026942">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<msg time="2026-10-16T01:15:02.496795" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<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="FAIL" start="2026-10-16T01:14:57.292847" elapsed="5.204144">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${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="NOT RUN" start="2026-10-16T01:15:02.497509" elapsed="0.000044"/>
</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="FAIL" start="2026-10-16T01:14:56.827576" elapsed="5.670203">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:14:56.347933" elapsed="6.150140">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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-10-16T01:15:02.502301" elapsed="0.000538"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:15:02.501256" elapsed="0.001699"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:02.505059" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:02.504853" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:02.504813" elapsed="0.000389"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:02.509541" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:02.509332" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:02.509296" elapsed="0.000386"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:02.511792" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:02.511012" elapsed="0.000839"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:02.512827" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:02.512180" elapsed="0.000700"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:02.512971" elapsed="0.000060"/>
</return>
<msg time="2026-10-16T01:15:02.513248" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:02.510156" elapsed="0.003141"/>
</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-10-16T01:15:02.518160" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:02.518035" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:02.518010" elapsed="0.000244"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:02.519963" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:02.519839" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:02.519815" elapsed="0.000243"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:02.520754" 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-10-16T01:15:02.520365" elapsed="0.000427"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:02.521297" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:02.521039" elapsed="0.000294"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:02.559786" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:02.522228" elapsed="0.037857"/>
</kw>
<msg time="2026-10-16T01:15:02.560451" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:02.560510" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:02.521586" elapsed="0.038962"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:02.650389" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:02.561389" elapsed="0.089404"/>
</kw>
<msg time="2026-10-16T01:15:02.651052" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:02.651098" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:02.560828" elapsed="0.090306"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:02.651612" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:02.651257" elapsed="0.000434"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:02.651219" elapsed="0.000520"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:02.652424" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:02.651941" elapsed="0.000594"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:02.653135" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:02.652922" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:02.652582" elapsed="0.000652"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:02.653271" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:02.656007" 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-10-16T01:15:02.657804" elapsed="0.000491"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:02.659519" elapsed="0.000565"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:15:02.654240" elapsed="0.005913"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:02.653641" elapsed="0.006627"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:02.519405" elapsed="0.140941"/>
</kw>
<msg time="2026-10-16T01:15:02.660431" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:02.660485" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:02.518484" elapsed="0.142039"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:02.660680" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-10-16T01:15:02.660592" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:02.660575" 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 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-10-16T01:15:02.661126" 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-10-16T01:15:02.661443" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:02.661525" 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-10-16T01:15:02.517585" elapsed="0.144029"/>
</kw>
<msg time="2026-10-16T01:15:02.661788" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:02.661833" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:02.514070" elapsed="0.147802"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:02.662240" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:02.662013" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:02.661995" elapsed="0.000317"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:15:02.513763" elapsed="0.148572"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:02.664925" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:02.664837" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:02.664819" elapsed="0.000169"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:02.666109" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:02.666009" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:02.665993" elapsed="0.000186"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:02.666625" 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-10-16T01:15:02.666326" elapsed="0.000324"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:02.667017" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:02.666839" elapsed="0.000203"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:02.709187" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:02.667621" elapsed="0.041749"/>
</kw>
<msg time="2026-10-16T01:15:02.709569" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:02.709612" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:02.667195" elapsed="0.042452"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:02.796786" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:02.710303" elapsed="0.086787"/>
</kw>
<msg time="2026-10-16T01:15:02.797317" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:02.797360" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:02.709856" elapsed="0.087540"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:02.797882" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:02.797531" elapsed="0.000430"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:02.797490" elapsed="0.000503"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:02.798648" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:02.798184" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:02.799030" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:02.798826" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:02.798809" elapsed="0.000315"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:02.799160" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:02.802132" 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-10-16T01:15:02.803894" elapsed="0.000482"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:02.805581" elapsed="0.000553"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:15:02.800110" elapsed="0.006092"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:02.799532" elapsed="0.006789"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:02.665752" elapsed="0.140712"/>
</kw>
<msg time="2026-10-16T01:15:02.806564" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:02.806605" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:02.665135" elapsed="0.141505"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:02.806813" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:15:02.806725" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:02.806692" elapsed="0.000200"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:15:02.807220" 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-10-16T01:15:02.807618" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:02.807683" elapsed="0.000125"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:15:02.664507" elapsed="0.143379"/>
</kw>
<msg time="2026-10-16T01:15:02.807971" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:02.808010" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:02.662618" elapsed="0.145427"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:02.808331" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:02.808113" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:02.808097" elapsed="0.000306"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:15:02.662461" elapsed="0.145964"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:02.811048" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:02.810962" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:02.810944" elapsed="0.000167"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:02.812208" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:02.812123" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:02.812107" elapsed="0.000164"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:02.812663" 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-10-16T01:15:02.812414" elapsed="0.000274"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:02.813039" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:02.812866" elapsed="0.000197"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:02.860687" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:02.813673" elapsed="0.047214"/>
</kw>
<msg time="2026-10-16T01:15:02.861059" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:02.861100" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:02.813232" elapsed="0.047903"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:02.974935" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:02.861786" elapsed="0.113426"/>
</kw>
<msg time="2026-10-16T01:15:02.975429" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:02.975471" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:02.861298" elapsed="0.114225"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:02.976042" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:02.975735" elapsed="0.000386"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:02.975673" elapsed="0.000477"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:02.976807" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:02.976336" elapsed="0.000560"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:02.977154" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:02.976957" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:02.976941" elapsed="0.000340"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:02.977318" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:02.980035" 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-10-16T01:15:02.981806" elapsed="0.000480"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:02.983495" elapsed="0.000796"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:15:02.978231" elapsed="0.006130"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:02.977670" elapsed="0.006822"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:02.811867" elapsed="0.172705"/>
</kw>
<msg time="2026-10-16T01:15:02.984654" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:02.984694" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:02.811256" elapsed="0.173490"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:02.984901" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:15:02.984816" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:02.984800" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:15:02.985313" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:02.985635" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:02.985779" 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-10-16T01:15:02.810640" elapsed="0.175230"/>
</kw>
<msg time="2026-10-16T01:15:02.985955" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:02.985995" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:02.808717" elapsed="0.177313"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:02.986313" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:02.986095" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:02.986080" elapsed="0.000305"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:15:02.808563" elapsed="0.177844"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:15:02.513404" elapsed="0.473035"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:15:02.508660" elapsed="0.477851"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:15:02.504233" elapsed="0.482336"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:02.503283" elapsed="0.483334"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:15:02.500252" elapsed="0.486419"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:02.990237" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:02.990001" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:02.989984" elapsed="0.000328"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:02.990657" 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-10-16T01:15:02.990769" 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-10-16T01:15:02.990520" elapsed="0.000274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:02.991268" level="INFO">Attempting to execute command "sudo ovs-vsctl del-br br-s1" on remote system "10.30.171.104" 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-10-16T01:15:02.990979" elapsed="0.000332"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:02.991816" level="INFO">${conn_id} = 67</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-10-16T01:15:02.991498" elapsed="0.000343"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:15:02.992664" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:15:02.992748" 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-10-16T01:15:02.992383" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:02.992917" elapsed="0.000286"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:15:02.993988" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:15:03.412562" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:14:06 UTC 2026

  System load:  0.12               Processes:             111
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:14:57 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:15:02.993756" elapsed="0.419013"/>
</kw>
<msg time="2026-10-16T01:15:03.412861" 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-10-16T01:15:02.993362" elapsed="0.419594"/>
</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-10-16T01:15:02.992031" elapsed="0.421044"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:15:03.413621" level="INFO">Executing command 'sudo ovs-vsctl del-br br-s1'.</msg>
<msg time="2026-10-16T01:15:03.497499" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:15:03.497789" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:15:03.497880" 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-10-16T01:15:03.413372" elapsed="0.084556"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:03.498297" elapsed="0.000530"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:03.500011" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:03.499355" 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-10-16T01:15:03.500537" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:03.500263" elapsed="0.000383"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:03.500214" elapsed="0.000512"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:15:03.501028" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-10-16T01:15:03.500843" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:03.500810" elapsed="0.000394"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:15:03.501274" elapsed="0.000028"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:03.502957" elapsed="0.000674"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:15:03.504071" elapsed="0.000322"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:03.504870" elapsed="0.000206"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:15:03.501996" elapsed="0.003189"/>
</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-10-16T01:15:02.989563" elapsed="0.515780"/>
</kw>
<msg time="2026-10-16T01:15:03.505450" 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-10-16T01:15:02.989032" elapsed="0.516547"/>
</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-10-16T01:15:02.988592" elapsed="0.517180"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:15:03.506920" 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-10-16T01:15:03.506206" elapsed="0.000770"/>
</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-10-16T01:15:03.514424" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:03.513664" elapsed="0.000815"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:03.515469" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:03.514865" elapsed="0.000682"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:03.515641" elapsed="0.000086"/>
</return>
<msg time="2026-10-16T01:15:03.515960" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:03.512855" elapsed="0.003156"/>
</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-10-16T01:15:03.521961" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:15:03.521305" elapsed="0.000711"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:15:03.522108" elapsed="0.000057"/>
</return>
<msg time="2026-10-16T01:15:03.522377" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:15:03.520566" elapsed="0.001861"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:03.525119" 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-10-16T01:15:03.524587" elapsed="0.000626"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:03.526163" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:03.525649" elapsed="0.000603"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:15:03.533269" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:15:03.533385" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:15:03.533627" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:15:03.527332" elapsed="0.007105">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:03.526811" elapsed="0.007817">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:15:03.535069" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:03.534726" elapsed="0.000473"/>
</branch>
<status status="FAIL" start="2026-10-16T01:15:03.526349" elapsed="0.008972">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:15:03.536148" elapsed="0.000055"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:03.536420" elapsed="0.000123"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:03.536345" elapsed="0.000261"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:03.536309" elapsed="0.000343"/>
</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-10-16T01:15:03.536990" elapsed="0.000044"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:15:03.537131" elapsed="0.000031"/>
</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-10-16T01:15:03.523167" elapsed="0.014180">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:03.537467" elapsed="0.000053"/>
</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-10-16T01:15:03.519603" elapsed="0.018077">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:15:03.538173" elapsed="0.000049"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:15:03.516406" elapsed="0.021921">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:15:03.516126" elapsed="0.022317">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:15:03.511736" elapsed="0.026919">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:15:04.546059" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:04.545035" elapsed="0.001095"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:04.547175" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:04.546488" elapsed="0.000743"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:04.547328" elapsed="0.000080"/>
</return>
<msg time="2026-10-16T01:15:04.547675" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:04.544161" elapsed="0.003597"/>
</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-10-16T01:15:04.553963" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:15:04.553100" elapsed="0.000937"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:15:04.554158" elapsed="0.000075"/>
</return>
<msg time="2026-10-16T01:15:04.554542" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:15:04.552308" elapsed="0.002313"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:04.558264" 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-10-16T01:15:04.557457" elapsed="0.000950"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:04.560533" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:04.559117" elapsed="0.001560"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:15:04.568234" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:15:04.568355" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:15:04.568733" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:15:04.561586" elapsed="0.008220">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:04.560913" elapsed="0.009132">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:15:04.570687" elapsed="0.000112"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:04.570155" elapsed="0.000773"/>
</branch>
<status status="FAIL" start="2026-10-16T01:15:04.560853" elapsed="0.010208">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:15:04.572275" elapsed="0.000080"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:04.572652" elapsed="0.000044"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:04.572549" elapsed="0.000268"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:04.572479" elapsed="0.000386"/>
</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-10-16T01:15:04.573183" elapsed="0.000045"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:15:04.573323" elapsed="0.000030"/>
</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-10-16T01:15:04.555399" elapsed="0.018182">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:04.573771" elapsed="0.000045"/>
</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-10-16T01:15:04.551334" elapsed="0.022660">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:15:04.574470" elapsed="0.000080"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:15:04.548155" elapsed="0.026530">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:15:04.547878" elapsed="0.026998">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:15:04.542826" elapsed="0.032279">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:15:05.582785" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:05.581789" elapsed="0.001070"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:05.583908" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:05.583223" elapsed="0.000739"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:05.584065" elapsed="0.000089"/>
</return>
<msg time="2026-10-16T01:15:05.584397" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:05.580895" elapsed="0.003552"/>
</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-10-16T01:15:05.590480" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:15:05.589862" elapsed="0.000697"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:15:05.590652" elapsed="0.000086"/>
</return>
<msg time="2026-10-16T01:15:05.590961" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:15:05.589095" elapsed="0.001919"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:05.594078" 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-10-16T01:15:05.593499" elapsed="0.000679"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:05.595832" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:05.594817" elapsed="0.001111"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:15:05.603216" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:15:05.603337" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:15:05.603602" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:15:05.596624" elapsed="0.007920">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:05.596083" elapsed="0.008669">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:15:05.605181" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:05.604830" elapsed="0.000483"/>
</branch>
<status status="FAIL" start="2026-10-16T01:15:05.596038" elapsed="0.009326">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:15:05.606169" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:05.606440" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:05.606367" elapsed="0.000182"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:05.606332" elapsed="0.000265"/>
</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-10-16T01:15:05.606936" elapsed="0.000045"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:15:05.607077" elapsed="0.000030"/>
</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-10-16T01:15:05.591955" elapsed="0.015338">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:05.607453" 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-10-16T01:15:05.588109" elapsed="0.019560">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:15:05.608166" elapsed="0.000050"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:15:05.584936" elapsed="0.023383">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:15:05.584618" elapsed="0.023821">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:15:05.579474" elapsed="0.029176">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:15:06.616385" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:06.615404" elapsed="0.001053"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:06.617500" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:06.616873" elapsed="0.000701"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:06.617678" elapsed="0.000117"/>
</return>
<msg time="2026-10-16T01:15:06.618040" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:06.614546" elapsed="0.003682"/>
</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-10-16T01:15:06.624182" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:15:06.623521" elapsed="0.000717"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:15:06.624331" elapsed="0.000056"/>
</return>
<msg time="2026-10-16T01:15:06.624642" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:15:06.622809" elapsed="0.001886"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:06.627421" 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-10-16T01:15:06.626906" elapsed="0.000639"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:06.629050" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:06.628062" elapsed="0.001083"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:15:06.636625" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:15:06.636798" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:15:06.637040" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:15:06.629883" elapsed="0.008080">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:06.629297" elapsed="0.008838">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:15:06.638609" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:06.638207" elapsed="0.000568"/>
</branch>
<status status="FAIL" start="2026-10-16T01:15:06.629255" elapsed="0.009573">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:15:06.639604" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:06.639904" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:06.639829" elapsed="0.000162"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:06.639793" elapsed="0.000243"/>
</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-10-16T01:15:06.640344" elapsed="0.000043"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:15:06.640483" elapsed="0.000030"/>
</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-10-16T01:15:06.625433" elapsed="0.015318">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:06.640874" 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-10-16T01:15:06.621828" elapsed="0.019236">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:15:06.641557" elapsed="0.000050"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:15:06.618655" elapsed="0.023087">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:15:06.618354" elapsed="0.023511">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:15:06.613078" elapsed="0.029046">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:15:07.649790" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:07.648730" elapsed="0.001134"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:07.650919" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:07.650233" elapsed="0.000741"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:07.651076" elapsed="0.000090"/>
</return>
<msg time="2026-10-16T01:15:07.651405" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:07.647852" elapsed="0.003603"/>
</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-10-16T01:15:07.657366" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:15:07.656766" elapsed="0.000655"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:15:07.657513" elapsed="0.000082"/>
</return>
<msg time="2026-10-16T01:15:07.657861" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:15:07.656015" elapsed="0.001898"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:07.660582" 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-10-16T01:15:07.660054" elapsed="0.000623"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:07.665905" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:07.661119" elapsed="0.004881"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:15:07.673513" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:15:07.673665" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:15:07.673949" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:15:07.666697" elapsed="0.008177">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:07.666153" elapsed="0.008892">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:15:07.675454" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:07.675118" elapsed="0.000489"/>
</branch>
<status status="FAIL" start="2026-10-16T01:15:07.666111" elapsed="0.009547">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:15:07.676443" elapsed="0.000051"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:07.676764" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:07.676660" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:07.676624" elapsed="0.000272"/>
</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-10-16T01:15:07.677200" elapsed="0.000043"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:15:07.677339" elapsed="0.000030"/>
</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-10-16T01:15:07.658623" elapsed="0.019121">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:07.677869" 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-10-16T01:15:07.655048" elapsed="0.023011">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:15:07.678518" elapsed="0.000071"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:15:07.651913" elapsed="0.026783">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:15:07.651601" elapsed="0.027243">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:15:07.646438" elapsed="0.032592">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:15:08.686906" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:08.685920" elapsed="0.001057"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:08.688017" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:08.687334" elapsed="0.000738"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:08.688173" elapsed="0.000081"/>
</return>
<msg time="2026-10-16T01:15:08.688492" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:08.684987" elapsed="0.003557"/>
</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-10-16T01:15:08.694443" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:15:08.693837" elapsed="0.000662"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:15:08.694619" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:15:08.694929" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:15:08.693081" elapsed="0.001900"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:08.697741" 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-10-16T01:15:08.697142" elapsed="0.000700"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:08.698805" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:08.698260" elapsed="0.000637"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:15:08.706510" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:15:08.706655" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:15:08.706923" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:15:08.699577" elapsed="0.008257">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:08.699042" elapsed="0.008965">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:15:08.708416" elapsed="0.000200"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:08.708078" elapsed="0.000666"/>
</branch>
<status status="FAIL" start="2026-10-16T01:15:08.699002" elapsed="0.009797">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:15:08.709579" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:08.709922" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:08.709846" elapsed="0.000161"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:08.709808" 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-10-16T01:15:08.710360" elapsed="0.000043"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:15:08.710499" elapsed="0.000031"/>
</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-10-16T01:15:08.695688" elapsed="0.015088">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:08.710900" elapsed="0.000031"/>
</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-10-16T01:15:08.692114" elapsed="0.018974">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:15:08.711575" elapsed="0.000051"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:15:08.688987" elapsed="0.022774">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:15:08.688693" elapsed="0.023189">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:15:08.683427" elapsed="0.028639">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<msg time="2026-10-16T01:15:08.712261" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</msg>
<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="FAIL" start="2026-10-16T01:15:03.507406" elapsed="5.205050">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<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-10-16T01:15:02.988209" elapsed="5.724488">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<doc>Delete bridge with OVS command and verify it gets deleted from all instances.</doc>
<status status="FAIL" start="2026-10-16T01:15:02.498848" elapsed="6.214212">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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-10-16T01:15:08.716400" elapsed="0.000517"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:15:08.715849" elapsed="0.001183"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:08.719134" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:08.718938" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:08.718897" elapsed="0.000378"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:08.723761" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:08.723520" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:08.723483" elapsed="0.000425"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:08.726002" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:08.725216" elapsed="0.000844"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:08.727141" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:08.726465" elapsed="0.000731"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:08.727289" elapsed="0.000059"/>
</return>
<msg time="2026-10-16T01:15:08.727592" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:08.724353" elapsed="0.003292"/>
</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-10-16T01:15:08.733494" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:08.733302" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:08.733263" elapsed="0.000405"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:08.735467" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:08.735349" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:08.735325" elapsed="0.000245"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:08.736134" 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-10-16T01:15:08.735802" elapsed="0.000367"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:08.736669" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:08.736400" elapsed="0.000336"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:08.776641" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:08.737542" elapsed="0.039317"/>
</kw>
<msg time="2026-10-16T01:15:08.777027" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:08.777069" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:08.736956" elapsed="0.040149"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:08.878153" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:08.777741" elapsed="0.100681"/>
</kw>
<msg time="2026-10-16T01:15:08.878639" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:08.878688" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:08.777272" elapsed="0.101479"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:08.879166" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:08.878859" elapsed="0.000384"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:08.878825" elapsed="0.000446"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:08.879923" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:08.879462" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:08.880278" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:08.880077" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:08.880061" elapsed="0.000310"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:08.880405" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:08.883126" 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-10-16T01:15:08.884951" elapsed="0.000512"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:08.886965" 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-10-16T01:15:08.881347" elapsed="0.006011"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:08.880796" elapsed="0.006778"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:08.734984" elapsed="0.152672"/>
</kw>
<msg time="2026-10-16T01:15:08.887761" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:08.887803" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:08.733989" elapsed="0.153852"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:08.888003" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:15:08.887917" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:08.887900" elapsed="0.000182"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:15:08.888429" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:08.888849" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:08.888915" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:15:08.732621" elapsed="0.156382"/>
</kw>
<msg time="2026-10-16T01:15:08.889092" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:08.889133" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:08.728402" elapsed="0.160767"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:08.889460" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:08.889239" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:08.889223" elapsed="0.000308"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:15:08.728093" elapsed="0.161472"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:08.892258" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:08.892172" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:08.892155" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:08.893419" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:08.893335" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:08.893319" elapsed="0.000165"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:08.893902" 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-10-16T01:15:08.893638" elapsed="0.000290"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:08.894442" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:08.894087" elapsed="0.000380"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:08.939823" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:08.895073" elapsed="0.044925"/>
</kw>
<msg time="2026-10-16T01:15:08.940175" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:08.940217" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:08.894632" elapsed="0.045621"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:09.042324" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:08.940898" elapsed="0.101611"/>
</kw>
<msg time="2026-10-16T01:15:09.042683" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:09.042750" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:08.940419" elapsed="0.102368"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:09.043104" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:09.042898" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:09.042879" elapsed="0.000322"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:09.043758" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:09.043381" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:09.044101" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:09.043903" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:09.043887" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:09.044228" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:09.046721" elapsed="0.000473"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:15:09.048409" elapsed="0.000834"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:09.050389" elapsed="0.000405"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:15:09.045038" elapsed="0.005824"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:09.044499" elapsed="0.006476"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:08.893075" elapsed="0.157978"/>
</kw>
<msg time="2026-10-16T01:15:09.051134" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:09.051173" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:08.892469" elapsed="0.158740"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:09.051363" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:15:09.051278" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:09.051261" elapsed="0.000182"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:15:09.051798" 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-10-16T01:15:09.052109" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:09.052174" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:15:08.891874" elapsed="0.160385"/>
</kw>
<msg time="2026-10-16T01:15:09.052341" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:09.052381" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:08.889852" elapsed="0.162564"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:09.052841" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:09.052482" elapsed="0.000413"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:09.052466" elapsed="0.000460"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:15:08.889693" elapsed="0.163263"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:09.055923" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:09.055825" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:09.055805" elapsed="0.000188"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:09.057194" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:09.057109" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:09.057093" elapsed="0.000165"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:09.057749" 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-10-16T01:15:09.057468" elapsed="0.000308"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:09.058112" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:09.057937" elapsed="0.000200"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:09.103148" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:09.058745" elapsed="0.044604"/>
</kw>
<msg time="2026-10-16T01:15:09.103517" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:09.103573" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:09.058289" elapsed="0.045320"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:09.194008" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:09.104250" elapsed="0.089945"/>
</kw>
<msg time="2026-10-16T01:15:09.194355" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:09.194395" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:09.103796" elapsed="0.090635"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:09.194758" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:09.194502" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:09.194484" elapsed="0.000373"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:09.195391" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:09.195038" elapsed="0.000434"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:09.195773" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:09.195534" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:09.195517" elapsed="0.000356"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:09.195904" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:09.198448" 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-10-16T01:15:09.200237" elapsed="0.000528"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:09.202152" elapsed="0.000310"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:15:09.196767" elapsed="0.005763"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:09.196210" elapsed="0.006460"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:09.056848" elapsed="0.145920"/>
</kw>
<msg time="2026-10-16T01:15:09.202851" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:09.202891" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:09.056159" elapsed="0.146765"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:09.203080" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:15:09.202994" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:09.202977" elapsed="0.000182"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:15:09.203496" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:09.203949" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:09.204015" 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-10-16T01:15:09.055460" elapsed="0.148644"/>
</kw>
<msg time="2026-10-16T01:15:09.204187" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:09.204228" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:09.053314" elapsed="0.150949"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:09.204554" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:09.204333" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:09.204317" elapsed="0.000327"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:15:09.053113" elapsed="0.151552"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:15:08.727785" elapsed="0.476929"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:15:08.722694" elapsed="0.482086"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:15:08.718307" elapsed="0.486536"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:08.717358" elapsed="0.487534"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:15:08.715032" elapsed="0.489919"/>
</kw>
<kw name="Create Sample Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:15:09.209232" 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-10-16T01:15:09.207973" elapsed="0.001299">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-10-16T01:15:08.713649" elapsed="0.495809">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-10-16T01:15:09.211156" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:15:09.210906" elapsed="0.000506"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:09.212349" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:09.212262" elapsed="0.000132"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:09.212245" elapsed="0.000170"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:09.214349" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:09.214265" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:09.214248" elapsed="0.000163"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:09.215350" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:09.215018" elapsed="0.000358"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:09.215838" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:09.215527" elapsed="0.000335"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:09.215903" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:15:09.216029" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:09.214641" elapsed="0.001410"/>
</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-10-16T01:15:09.218645" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:09.218546" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:09.218529" 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-10-16T01:15:09.219844" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:09.219759" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:09.219742" elapsed="0.000166"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:09.220273" 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-10-16T01:15:09.220049" elapsed="0.000248"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:09.220682" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:09.220492" elapsed="0.000232"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:09.259689" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:09.221315" elapsed="0.038576"/>
</kw>
<msg time="2026-10-16T01:15:09.260074" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:09.260115" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:09.220880" elapsed="0.039269"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:09.340841" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:09.260783" elapsed="0.080306"/>
</kw>
<msg time="2026-10-16T01:15:09.341294" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:09.341335" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:09.260314" elapsed="0.081057"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:09.341832" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:09.341487" elapsed="0.000424"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:09.341448" elapsed="0.000494"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:09.342583" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:09.342134" elapsed="0.000540"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:09.342951" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:09.342754" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:09.342737" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:09.343082" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:09.345820" elapsed="0.000494"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:15:09.347652" elapsed="0.000518"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:09.349399" elapsed="0.000530"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:15:09.344033" elapsed="0.005968"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:09.343441" elapsed="0.006679"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:09.219460" elapsed="0.130738"/>
</kw>
<msg time="2026-10-16T01:15:09.350287" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:09.350327" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:09.218883" elapsed="0.131482"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:09.350523" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:15:09.350437" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:09.350419" elapsed="0.000200"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:15:09.351002" 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-10-16T01:15:09.351317" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:09.351459" 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-10-16T01:15:09.218258" elapsed="0.133295"/>
</kw>
<msg time="2026-10-16T01:15:09.351663" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:09.351841" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:09.216397" elapsed="0.135485"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:09.352183" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:09.351954" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:09.351938" elapsed="0.000317"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:15:09.216260" elapsed="0.136019"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:09.355035" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:09.354950" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:09.354932" elapsed="0.000167"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:09.356225" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:09.356142" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:09.356126" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:09.356677" 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-10-16T01:15:09.356430" elapsed="0.000289"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:09.357057" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:09.356879" elapsed="0.000202"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:09.399406" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:09.357655" elapsed="0.041944"/>
</kw>
<msg time="2026-10-16T01:15:09.399807" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:09.399849" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:09.357232" elapsed="0.042654"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:09.493009" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:09.400492" elapsed="0.092769"/>
</kw>
<msg time="2026-10-16T01:15:09.493467" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:09.493510" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:09.400052" elapsed="0.093496"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:09.493991" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:09.493670" elapsed="0.000399"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:09.493634" elapsed="0.000464"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:09.494745" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:09.494288" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:09.495098" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:09.494898" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:09.494881" elapsed="0.000311"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:09.495225" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:09.497939" elapsed="0.000485"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:15:09.499944" elapsed="0.000510"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:09.501885" 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-10-16T01:15:09.496166" elapsed="0.006113"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:09.495585" elapsed="0.006813"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:09.355882" elapsed="0.146597"/>
</kw>
<msg time="2026-10-16T01:15:09.502588" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:09.502631" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:09.355252" elapsed="0.147416"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:09.502917" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-16T01:15:09.502813" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:09.502795" 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-10-16T01:15:09.503361" 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-10-16T01:15:09.503689" elapsed="0.000046"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:09.503778" 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-10-16T01:15:09.354627" elapsed="0.149243"/>
</kw>
<msg time="2026-10-16T01:15:09.503961" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:09.504009" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:09.352558" elapsed="0.151487"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:09.504338" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:09.504116" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:09.504100" elapsed="0.000309"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:15:09.352410" elapsed="0.152022"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:09.507261" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:09.507174" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:09.507157" elapsed="0.000167"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:09.508428" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:09.508344" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:09.508327" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:09.508914" 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-10-16T01:15:09.508648" elapsed="0.000291"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:09.509276" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:09.509098" elapsed="0.000203"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:09.552127" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:09.509913" elapsed="0.042391"/>
</kw>
<msg time="2026-10-16T01:15:09.552468" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:09.552510" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:09.509454" elapsed="0.043091"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:09.640403" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:09.553177" elapsed="0.087495"/>
</kw>
<msg time="2026-10-16T01:15:09.640865" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:09.640908" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:09.552750" elapsed="0.088195"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:09.641229" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:09.641018" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:09.641000" elapsed="0.000326"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:09.641900" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:09.641511" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:09.642241" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:09.642042" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:09.642025" elapsed="0.000311"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:09.642367" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:09.644939" elapsed="0.000479"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:15:09.646803" elapsed="0.000447"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:09.648614" 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-10-16T01:15:09.643206" elapsed="0.005806"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:09.642668" elapsed="0.006459"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:09.508088" elapsed="0.141116"/>
</kw>
<msg time="2026-10-16T01:15:09.649286" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:09.649325" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:09.507472" elapsed="0.141889"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:09.649517" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:15:09.649431" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:09.649414" elapsed="0.000198"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:15:09.650036" 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-10-16T01:15:09.650343" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:09.650408" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:15:09.506868" elapsed="0.143627"/>
</kw>
<msg time="2026-10-16T01:15:09.650593" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:09.650635" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:09.504845" elapsed="0.145825"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:09.650980" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:09.650760" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:09.650743" elapsed="0.000309"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:15:09.504578" elapsed="0.146496"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:15:09.216104" elapsed="0.434998"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:15:09.213976" elapsed="0.437190"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:15:09.212004" elapsed="0.439264"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:09.211557" elapsed="0.439763"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:15:09.210519" elapsed="0.440861"/>
</kw>
<kw name="Create Sample Port And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:15:09.655661" 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-10-16T01:15:09.654369" elapsed="0.001349">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-10-16T01:15:09.209943" elapsed="0.445949">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-10-16T01:15:09.657281" elapsed="0.000199"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:15:09.657039" elapsed="0.000490"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:09.658440" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:09.658353" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:09.658336" elapsed="0.000168"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:09.660416" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:09.660332" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:09.660316" elapsed="0.000162"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:09.661414" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:09.661085" elapsed="0.000354"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:09.661904" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:09.661606" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:09.661970" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:15:09.662096" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:09.660726" elapsed="0.001392"/>
</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-10-16T01:15:09.664684" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:09.664600" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:09.664582" elapsed="0.000180"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:09.665866" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:09.665783" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:09.665766" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:09.666291" 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-10-16T01:15:09.666068" elapsed="0.000247"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:09.666658" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:09.666474" elapsed="0.000208"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:09.705578" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:09.667259" elapsed="0.038565"/>
</kw>
<msg time="2026-10-16T01:15:09.706025" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:09.706067" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:09.666855" elapsed="0.039249"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:09.801545" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:09.706841" elapsed="0.094940"/>
</kw>
<msg time="2026-10-16T01:15:09.802023" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:09.802064" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:09.706319" elapsed="0.095780"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:09.802431" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:09.802191" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:09.802165" elapsed="0.000375"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:09.803095" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:09.802747" elapsed="0.000436"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:09.803438" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:09.803243" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:09.803227" elapsed="0.000306"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:09.803581" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:09.806246" 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-10-16T01:15:09.808020" elapsed="0.000498"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:09.809925" 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-10-16T01:15:09.804478" elapsed="0.005831"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:09.803957" elapsed="0.006470"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:09.665486" elapsed="0.145019"/>
</kw>
<msg time="2026-10-16T01:15:09.810609" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:09.810651" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:09.664913" elapsed="0.145773"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:09.810922" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:15:09.810835" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:09.810817" elapsed="0.000183"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:15:09.811351" 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-10-16T01:15:09.811684" elapsed="0.000039"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:09.811767" 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-10-16T01:15:09.664298" elapsed="0.147559"/>
</kw>
<msg time="2026-10-16T01:15:09.811947" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:09.811988" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:09.662469" elapsed="0.149555"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:09.812320" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:09.812092" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:09.812077" elapsed="0.000319"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:15:09.662322" elapsed="0.150095"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:09.815149" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:09.815065" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:09.815048" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:09.816346" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:09.816263" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:09.816246" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:09.816824" 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-10-16T01:15:09.816551" elapsed="0.000298"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:09.817190" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:09.817012" elapsed="0.000201"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:09.862158" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:09.817811" elapsed="0.044530"/>
</kw>
<msg time="2026-10-16T01:15:09.862500" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:09.862542" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:09.817365" elapsed="0.045226"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:09.969472" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:09.863198" elapsed="0.106543"/>
</kw>
<msg time="2026-10-16T01:15:09.969931" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:09.969973" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:09.862775" elapsed="0.107234"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:09.970357" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:09.970101" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:09.970074" elapsed="0.000381"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:09.971071" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:09.970660" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:09.971410" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:09.971215" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:09.971199" elapsed="0.000304"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:09.971536" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:09.974225" 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-10-16T01:15:09.976020" elapsed="0.000479"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:09.977784" 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-10-16T01:15:09.972446" elapsed="0.005716"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:09.971918" elapsed="0.006362"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:09.816007" elapsed="0.162350"/>
</kw>
<msg time="2026-10-16T01:15:09.978445" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:09.978485" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:09.815356" elapsed="0.163165"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:09.978948" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-10-16T01:15:09.978608" elapsed="0.000401"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:09.978591" elapsed="0.000441"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:15:09.979453" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:09.979791" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:09.979856" 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-10-16T01:15:09.814762" elapsed="0.165181"/>
</kw>
<msg time="2026-10-16T01:15:09.980041" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:09.980081" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:09.812805" elapsed="0.167312"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:09.980408" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:09.980187" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:09.980171" elapsed="0.000308"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:15:09.812541" elapsed="0.167960"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:09.985418" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:09.985332" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:09.985315" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:09.986595" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:09.986493" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:09.986477" elapsed="0.000182"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:09.987066" 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-10-16T01:15:09.986824" elapsed="0.000266"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:09.987423" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:09.987249" elapsed="0.000197"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:10.031196" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:09.988048" elapsed="0.043350"/>
</kw>
<msg time="2026-10-16T01:15:10.031604" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:10.031647" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:09.987613" elapsed="0.044071"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:10.140081" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:10.032301" elapsed="0.108019"/>
</kw>
<msg time="2026-10-16T01:15:10.140516" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:10.140559" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:10.031874" elapsed="0.108734"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:10.141009" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:10.140732" elapsed="0.000351"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:10.140673" elapsed="0.000440"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:10.141734" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:10.141301" elapsed="0.000529"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:10.142094" elapsed="0.000094"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:10.141892" elapsed="0.000351"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:10.141875" elapsed="0.000392"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:10.142301" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:10.145055" elapsed="0.000493"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:15:10.146867" elapsed="0.000500"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:10.148790" 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-10-16T01:15:10.143241" elapsed="0.005936"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:10.142664" elapsed="0.006631"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:09.986239" elapsed="0.163135"/>
</kw>
<msg time="2026-10-16T01:15:10.149459" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:10.149498" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:09.985643" elapsed="0.163891"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:10.149782" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-10-16T01:15:10.149620" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:10.149602" 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-10-16T01:15:10.150211" 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-10-16T01:15:10.150520" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:10.150602" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:15:09.985029" elapsed="0.165664"/>
</kw>
<msg time="2026-10-16T01:15:10.150800" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:10.150843" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:09.980835" elapsed="0.170044"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:10.151176" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:10.150949" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:10.150932" elapsed="0.000316"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:15:09.980643" elapsed="0.170629"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:15:09.662171" elapsed="0.489136"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:15:09.660043" elapsed="0.491327"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:15:09.658101" elapsed="0.493324"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:09.657690" elapsed="0.493779"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:15:09.656677" elapsed="0.494843"/>
</kw>
<kw name="Modify the destination IP of Sample Port" owner="ClusterOvsdb">
<msg time="2026-10-16T01:15:10.154758" 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-10-16T01:15:10.153466" elapsed="0.001330">Variable '${original_owner}' not found.</status>
</kw>
<doc>Modify the dst ip of existing port in Owner.</doc>
<status status="FAIL" start="2026-10-16T01:15:09.656141" elapsed="0.498821">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-10-16T01:15:10.156304" elapsed="0.000201"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:15:10.156060" elapsed="0.000494"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:10.157515" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:10.157428" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:10.157411" elapsed="0.000183"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:10.159467" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:10.159386" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:10.159370" elapsed="0.000159"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:10.160452" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:10.160125" elapsed="0.000352"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:10.160942" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:10.160645" elapsed="0.000321"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:10.161007" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:15:10.161131" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:10.159769" elapsed="0.001385"/>
</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-10-16T01:15:10.163727" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:10.163628" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:10.163610" elapsed="0.000180"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:10.164901" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:10.164817" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:10.164798" elapsed="0.000166"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:10.165338" 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-10-16T01:15:10.165108" elapsed="0.000254"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:10.165731" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:10.165523" elapsed="0.000233"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:10.204152" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:10.166324" elapsed="0.038007"/>
</kw>
<msg time="2026-10-16T01:15:10.204491" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:10.204531" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:10.165912" elapsed="0.038655"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:10.299672" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:10.205194" elapsed="0.094701"/>
</kw>
<msg time="2026-10-16T01:15:10.300067" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:10.300110" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:10.204768" elapsed="0.095379"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:10.300434" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:10.300219" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:10.300201" elapsed="0.000330"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:10.301185" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:10.300742" elapsed="0.000550"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:10.301643" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:10.301383" elapsed="0.000379"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:10.301354" elapsed="0.000520"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:10.301917" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:10.304665" 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-10-16T01:15:10.306469" elapsed="0.000576"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:10.308389" 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-10-16T01:15:10.302875" elapsed="0.005934"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:10.302271" elapsed="0.006657"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:10.164512" elapsed="0.144497"/>
</kw>
<msg time="2026-10-16T01:15:10.309104" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:10.309145" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:10.163939" elapsed="0.145244"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:10.309339" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:15:10.309253" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:10.309236" elapsed="0.000182"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:15:10.309859" 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-10-16T01:15:10.310173" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:10.310237" 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-10-16T01:15:10.163328" elapsed="0.146998"/>
</kw>
<msg time="2026-10-16T01:15:10.310415" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:10.310456" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:10.161504" elapsed="0.148991"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:10.310820" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:10.310565" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:10.310549" elapsed="0.000344"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:15:10.161362" elapsed="0.149553"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:10.313665" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:10.313560" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:10.313542" 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-10-16T01:15:10.314853" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:10.314766" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:10.314749" elapsed="0.000167"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:10.315293" 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-10-16T01:15:10.315059" elapsed="0.000259"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:10.315667" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:10.315478" elapsed="0.000213"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:10.363603" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:10.316287" elapsed="0.047529"/>
</kw>
<msg time="2026-10-16T01:15:10.363994" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:10.364036" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:10.315865" elapsed="0.048206"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:10.448262" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:10.364772" elapsed="0.083676"/>
</kw>
<msg time="2026-10-16T01:15:10.448623" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:10.448665" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:10.364296" elapsed="0.084433"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:10.449009" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:10.448804" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:10.448786" elapsed="0.000317"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:10.449636" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:10.449285" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:10.449994" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:10.449798" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:10.449782" elapsed="0.000305"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:10.450119" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:10.452600" 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-10-16T01:15:10.454317" elapsed="0.000492"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:10.456176" elapsed="0.000305"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:15:10.450939" elapsed="0.005607"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:10.450400" elapsed="0.006278"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:10.314471" elapsed="0.142303"/>
</kw>
<msg time="2026-10-16T01:15:10.456856" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:10.456897" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:10.313892" elapsed="0.143041"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:10.457087" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:15:10.457002" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:10.456985" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:15:10.457487" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:10.457904" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:10.457971" 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-10-16T01:15:10.313259" elapsed="0.144800"/>
</kw>
<msg time="2026-10-16T01:15:10.458142" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:10.458182" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:10.311183" elapsed="0.147035"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:10.458506" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:10.458285" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:10.458268" elapsed="0.000323"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:15:10.311041" elapsed="0.147613"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:10.461334" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:10.461247" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:10.461229" elapsed="0.000169"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:10.462499" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:10.462416" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:10.462399" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:10.462967" 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-10-16T01:15:10.462743" elapsed="0.000249"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:10.463326" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:10.463155" elapsed="0.000196"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:10.507121" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:10.463963" elapsed="0.043340"/>
</kw>
<msg time="2026-10-16T01:15:10.507464" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:10.507506" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:10.463504" elapsed="0.044038"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:10.586545" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:10.508200" elapsed="0.078647"/>
</kw>
<msg time="2026-10-16T01:15:10.587057" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:10.587098" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:10.507745" elapsed="0.079389"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:10.587543" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:10.587251" elapsed="0.000383"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:10.587212" elapsed="0.000453"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:10.588342" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:10.587878" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:10.588751" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:10.588495" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:10.588476" elapsed="0.000387"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:10.588900" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:10.591613" 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-10-16T01:15:10.593411" elapsed="0.000570"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:10.595336" 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-10-16T01:15:10.589837" elapsed="0.005919"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:10.589254" elapsed="0.006622"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:10.462162" elapsed="0.133795"/>
</kw>
<msg time="2026-10-16T01:15:10.596046" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:10.596087" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:10.461547" elapsed="0.134577"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:10.596366" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-16T01:15:10.596277" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:10.596259" elapsed="0.000188"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:15:10.596901" 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-10-16T01:15:10.597216" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:10.597280" 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-10-16T01:15:10.460951" elapsed="0.136420"/>
</kw>
<msg time="2026-10-16T01:15:10.597461" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:10.597503" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:10.458928" elapsed="0.138614"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:10.597872" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:10.597629" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:10.597612" elapsed="0.000333"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:15:10.458788" elapsed="0.139179"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:15:10.161208" elapsed="0.436796"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:15:10.159099" elapsed="0.438970"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:15:10.157131" elapsed="0.440999"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:10.156741" elapsed="0.441439"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:15:10.155716" elapsed="0.442522"/>
</kw>
<kw name="Verify Sample Port Is Modified" owner="ClusterOvsdb">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:15:10.600829" 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-10-16T01:15:10.600444" elapsed="0.000411"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:15:10.605513" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:15:10.604115" elapsed="0.001437">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:15:11.615967" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:15:11.612792" elapsed="0.003296">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:15:12.625973" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:15:12.622957" elapsed="0.003116">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:15:13.636475" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:15:13.633408" elapsed="0.003166">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:15:14.646431" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:15:14.643412" elapsed="0.003118">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:15:15.657176" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:15:15.654140" elapsed="0.003136">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<msg time="2026-10-16T01:15:15.657504" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: Variable '${ovsdb_uuid}' not found.</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-10-16T01:15:10.601058" elapsed="5.056796">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: Variable '${ovsdb_uuid}' not found.</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-10-16T01:15:10.600071" elapsed="5.058046">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: Variable '${ovsdb_uuid}' not found.</status>
</kw>
<doc>Verify port is modified in all instances.</doc>
<status status="FAIL" start="2026-10-16T01:15:10.155209" elapsed="5.503214">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: Variable '${ovsdb_uuid}' not found.</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-10-16T01:15:15.661890" elapsed="0.000554"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:15:15.661265" elapsed="0.001295"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:15.664856" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:15.664544" elapsed="0.000418"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:15.664496" elapsed="0.000516"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:15.669277" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:15.669089" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:15.669051" elapsed="0.000367"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:15.671529" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:15.670773" elapsed="0.000812"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:15.672594" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:15.671985" elapsed="0.000685"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:15.672791" elapsed="0.000064"/>
</return>
<msg time="2026-10-16T01:15:15.673082" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:15.669929" elapsed="0.003205"/>
</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-10-16T01:15:15.678941" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:15.678743" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:15.678676" elapsed="0.000407"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:15.681731" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:15.681491" elapsed="0.000346"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:15.681454" elapsed="0.000429"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:15.682786" 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-10-16T01:15:15.682208" elapsed="0.000637"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:15.683605" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:15.683209" elapsed="0.000481"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:15.728803" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:15.685063" elapsed="0.044068"/>
</kw>
<msg time="2026-10-16T01:15:15.729428" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:15.729487" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:15.684082" elapsed="0.045456"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:15.809729" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:15.730799" elapsed="0.079372"/>
</kw>
<msg time="2026-10-16T01:15:15.810483" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:15.810531" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:15.730024" elapsed="0.080547"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:15.811184" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:15.810760" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:15.810688" elapsed="0.000613"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:15.812077" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:15.811496" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:15.812435" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:15.812234" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:15.812216" elapsed="0.000316"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:15.812573" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:15.815450" 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-10-16T01:15:15.817289" elapsed="0.000541"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:15.819103" 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-10-16T01:15:15.813600" elapsed="0.005901"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:15.813012" elapsed="0.006607"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:15.680919" elapsed="0.139023"/>
</kw>
<msg time="2026-10-16T01:15:15.820042" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:15.820086" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:15.679414" elapsed="0.140710"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:15.820289" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-10-16T01:15:15.820199" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:15.820182" elapsed="0.000189"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:15:15.820747" 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-10-16T01:15:15.821071" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:15.821139" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:15:15.678047" elapsed="0.143185"/>
</kw>
<msg time="2026-10-16T01:15:15.821329" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:15.821371" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:15.673965" elapsed="0.147449"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:15.821767" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:15.821490" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:15.821473" elapsed="0.000369"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:15:15.673599" elapsed="0.148360"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:15.824715" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:15.824598" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:15.824581" 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-10-16T01:15:15.825887" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:15.825801" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:15.825784" elapsed="0.000167"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:15.826331" 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-10-16T01:15:15.826095" elapsed="0.000262"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:15.826721" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:15.826518" elapsed="0.000230"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:15.871874" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:15.827320" elapsed="0.044729"/>
</kw>
<msg time="2026-10-16T01:15:15.872209" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:15.872251" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:15.826903" elapsed="0.045383"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:15.951325" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:15.872918" elapsed="0.078585"/>
</kw>
<msg time="2026-10-16T01:15:15.951674" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:15.951735" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:15.872452" elapsed="0.079320"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:15.952056" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:15.951846" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:15.951827" elapsed="0.000325"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:15.952694" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:15.952335" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:15.953050" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:15.952852" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:15.952836" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:15.953177" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:15.955678" 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-10-16T01:15:15.957443" elapsed="0.000499"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:15.959302" elapsed="0.000308"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:15:15.953986" elapsed="0.005703"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:15.953456" elapsed="0.006368"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:15.825509" elapsed="0.134393"/>
</kw>
<msg time="2026-10-16T01:15:15.959987" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:15.960027" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:15.824929" elapsed="0.135134"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:15.960261" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-16T01:15:15.960176" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:15.960158" elapsed="0.000182"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:15:15.960673" elapsed="0.000105"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:15.961065" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:15.961130" 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-10-16T01:15:15.824289" elapsed="0.136929"/>
</kw>
<msg time="2026-10-16T01:15:15.961303" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:15.961344" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:15.822249" elapsed="0.139131"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:15.961678" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:15.961450" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:15.961433" elapsed="0.000332"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:15:15.822104" elapsed="0.139683"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:15.964532" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:15.964446" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:15.964428" elapsed="0.000168"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:15.965725" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:15.965605" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:15.965589" elapsed="0.000201"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:15.966161" 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-10-16T01:15:15.965932" elapsed="0.000255"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:15.966513" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:15.966344" elapsed="0.000194"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:16.017035" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:15.967131" elapsed="0.050079"/>
</kw>
<msg time="2026-10-16T01:15:16.017370" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:16.017412" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:15.966716" elapsed="0.050733"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:16.077312" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:16.018074" elapsed="0.059416"/>
</kw>
<msg time="2026-10-16T01:15:16.077646" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:16.077721" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:16.017613" elapsed="0.060146"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:16.078040" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:16.077833" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:16.077814" elapsed="0.000320"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:16.078676" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:16.078315" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:16.079075" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:16.078877" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:16.078860" elapsed="0.000311"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:16.079204" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:16.081897" 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-10-16T01:15:16.083573" elapsed="0.000488"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:16.085414" 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-10-16T01:15:16.080022" elapsed="0.005798"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:16.079492" 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-10-16T01:15:15.965349" elapsed="0.120665"/>
</kw>
<msg time="2026-10-16T01:15:16.086098" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:16.086139" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:15.964770" elapsed="0.121406"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:16.086330" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:15:16.086245" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:16.086228" elapsed="0.000181"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:15:16.086822" 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-10-16T01:15:16.087135" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:16.087201" 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-10-16T01:15:15.964149" elapsed="0.123140"/>
</kw>
<msg time="2026-10-16T01:15:16.087374" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:16.087415" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:15.962037" elapsed="0.125415"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:16.087770" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:16.087520" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:16.087504" elapsed="0.000340"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:15:15.961899" elapsed="0.125967"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:15:15.673260" elapsed="0.414635"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:15:15.668380" elapsed="0.419576"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:15:15.663942" elapsed="0.424074"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:15.662949" elapsed="0.425115"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:15:15.660325" elapsed="0.427798"/>
</kw>
<kw name="Delete Sample Port And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:15:16.092257" 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-10-16T01:15:16.091009" elapsed="0.001284">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-10-16T01:15:15.659197" elapsed="0.433239">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-10-16T01:15:16.093985" elapsed="0.000211"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:15:16.093738" 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-10-16T01:15:16.095229" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:16.095141" elapsed="0.000132"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:16.095124" elapsed="0.000170"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:16.097168" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:16.097085" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:16.097068" elapsed="0.000163"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:16.098153" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:16.097820" elapsed="0.000359"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:16.098603" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:16.098330" elapsed="0.000297"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:16.098681" elapsed="0.000041"/>
</return>
<msg time="2026-10-16T01:15:16.098825" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:16.097437" elapsed="0.001412"/>
</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-10-16T01:15:16.101381" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:16.101297" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:16.101280" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:16.102543" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:16.102458" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:16.102442" elapsed="0.000165"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:16.103019" 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-10-16T01:15:16.102786" elapsed="0.000259"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:16.103376" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:16.103205" elapsed="0.000196"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:16.142769" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:16.104006" elapsed="0.038936"/>
</kw>
<msg time="2026-10-16T01:15:16.143101" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:16.143163" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:16.103559" elapsed="0.039641"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:16.229033" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:16.143823" elapsed="0.085406"/>
</kw>
<msg time="2026-10-16T01:15:16.229399" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:16.229441" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:16.143366" elapsed="0.086110"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:16.229823" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:16.229563" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:16.229539" elapsed="0.000385"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:16.230480" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:16.230110" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:16.230916" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:16.230626" elapsed="0.000362"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:16.230610" elapsed="0.000402"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:16.231045" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:16.233634" 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-10-16T01:15:16.235380" elapsed="0.000507"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:16.237266" 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-10-16T01:15:16.231926" elapsed="0.005721"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:16.231357" elapsed="0.006437"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:16.102202" elapsed="0.135672"/>
</kw>
<msg time="2026-10-16T01:15:16.237959" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:16.237998" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:16.101592" elapsed="0.136443"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:16.238194" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:15:16.238103" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:16.238086" elapsed="0.000185"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:15:16.238604" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:16.239001" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:16.239067" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:15:16.101005" elapsed="0.138149"/>
</kw>
<msg time="2026-10-16T01:15:16.239240" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:16.239280" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:16.099180" elapsed="0.140135"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:16.239605" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:16.239382" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:16.239367" elapsed="0.000323"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:15:16.099041" elapsed="0.140685"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:16.243943" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:16.243856" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:16.243838" elapsed="0.000168"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:16.245300" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:16.245216" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:16.245200" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:16.245762" 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-10-16T01:15:16.245504" elapsed="0.000283"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:16.246120" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:16.245946" elapsed="0.000198"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:16.303609" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:16.246735" elapsed="0.057138"/>
</kw>
<msg time="2026-10-16T01:15:16.304063" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:16.304105" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:16.246296" elapsed="0.057900"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:16.439207" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:16.305769" elapsed="0.133848"/>
</kw>
<msg time="2026-10-16T01:15:16.439975" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:16.440019" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:16.305140" elapsed="0.134918"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:16.440743" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:16.440245" elapsed="0.000585"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:16.440168" elapsed="0.000702"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:16.441685" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:16.441065" elapsed="0.000744"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:16.442073" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:16.441872" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:16.441855" elapsed="0.000315"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:16.442210" elapsed="0.000055"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:16.445140" 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-10-16T01:15:16.446967" elapsed="0.000516"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:16.448707" elapsed="0.000393"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:15:16.443279" elapsed="0.005907"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:16.442630" elapsed="0.006683"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:16.244957" elapsed="0.204440"/>
</kw>
<msg time="2026-10-16T01:15:16.449487" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:16.449528" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:16.244152" elapsed="0.205413"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:16.449793" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-10-16T01:15:16.449640" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:16.449623" elapsed="0.000272"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:15:16.450259" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:16.450585" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:16.450653" 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-10-16T01:15:16.243497" elapsed="0.207445"/>
</kw>
<msg time="2026-10-16T01:15:16.451035" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:16.451077" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:16.239988" elapsed="0.211130"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:16.451414" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:16.451192" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:16.451175" elapsed="0.000374"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:15:16.239846" elapsed="0.211726"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:16.454535" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:16.454450" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:16.454433" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:16.455959" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:16.455635" elapsed="0.000367"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:16.455619" elapsed="0.000404"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:16.456415" 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-10-16T01:15:16.456168" elapsed="0.000272"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:16.456842" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:16.456601" elapsed="0.000272"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:16.501862" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:16.457487" elapsed="0.044781"/>
</kw>
<msg time="2026-10-16T01:15:16.502628" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:16.502787" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:16.457062" elapsed="0.045808"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:16.608441" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:16.504292" elapsed="0.104334"/>
</kw>
<msg time="2026-10-16T01:15:16.608814" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:16.608856" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:16.503256" elapsed="0.105635"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:16.609198" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:16.608977" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:16.608951" elapsed="0.000348"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:16.609868" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:16.609489" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:16.610214" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:16.610017" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:16.610000" elapsed="0.000306"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:16.610340" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:16.612988" elapsed="0.000486"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:15:16.614743" elapsed="0.000487"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:16.616582" 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-10-16T01:15:16.611241" elapsed="0.005755"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:16.610715" elapsed="0.006395"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:16.455380" elapsed="0.161813"/>
</kw>
<msg time="2026-10-16T01:15:16.617373" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:16.617417" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:16.454801" elapsed="0.162653"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:16.617616" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-10-16T01:15:16.617529" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:16.617511" 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 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-10-16T01:15:16.618123" 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-10-16T01:15:16.618429" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:16.618493" 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-10-16T01:15:16.454135" elapsed="0.164447"/>
</kw>
<msg time="2026-10-16T01:15:16.618682" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:16.618739" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:16.451954" elapsed="0.166823"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:16.619069" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:16.618848" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:16.618831" elapsed="0.000310"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:15:16.451792" elapsed="0.167371"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:15:16.098897" elapsed="0.520300"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:15:16.096790" elapsed="0.522469"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:15:16.094873" elapsed="0.524441"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:16.094435" elapsed="0.524927"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:15:16.093370" elapsed="0.526044"/>
</kw>
<kw name="Delete Sample Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:15:16.623692" 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-10-16T01:15:16.622423" elapsed="0.001323">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-10-16T01:15:16.092825" elapsed="0.531082">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-10-16T01:15:16.625427" elapsed="0.000304"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:15:16.625169" elapsed="0.000630"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:16.626895" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:16.626769" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:16.626739" 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-10-16T01:15:16.629266" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:16.629167" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:16.629149" elapsed="0.000189"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:16.630509" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:16.630108" elapsed="0.000431"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:16.631013" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:16.630721" elapsed="0.000317"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:16.631080" elapsed="0.000040"/>
</return>
<msg time="2026-10-16T01:15:16.631226" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:16.629571" elapsed="0.001678"/>
</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-10-16T01:15:16.634174" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:16.634087" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:16.634070" elapsed="0.000168"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:16.635443" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:16.635357" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:16.635340" elapsed="0.000168"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:16.635939" 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-10-16T01:15:16.635657" elapsed="0.000307"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:16.636318" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:16.636133" elapsed="0.000209"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:16.673212" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:16.636949" elapsed="0.036497"/>
</kw>
<msg time="2026-10-16T01:15:16.673623" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:16.673680" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:16.636496" elapsed="0.037237"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:16.728945" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:16.674338" elapsed="0.054778"/>
</kw>
<msg time="2026-10-16T01:15:16.729273" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:16.729315" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:16.673904" elapsed="0.055446"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:16.729636" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:16.729423" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:16.729404" elapsed="0.000380"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:16.730340" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:16.729983" elapsed="0.000437"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:16.730726" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:16.730482" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:16.730465" elapsed="0.000364"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:16.730860" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:16.733467" 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-10-16T01:15:16.735285" elapsed="0.000550"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:16.737232" 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-10-16T01:15:16.731731" elapsed="0.005896"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:16.731180" elapsed="0.006612"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:16.635097" elapsed="0.102777"/>
</kw>
<msg time="2026-10-16T01:15:16.737959" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:16.738000" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:16.634391" elapsed="0.103645"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:16.738245" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:15:16.738154" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:16.738136" 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-10-16T01:15:16.738804" 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-10-16T01:15:16.739122" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:16.739187" 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-10-16T01:15:16.633792" elapsed="0.105486"/>
</kw>
<msg time="2026-10-16T01:15:16.739364" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:16.739404" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:16.631797" elapsed="0.107642"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:16.739776" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:16.739508" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:16.739492" elapsed="0.000361"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:15:16.631623" elapsed="0.108252"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:16.742525" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:16.742440" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:16.742423" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:16.743758" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:16.743601" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:16.743585" elapsed="0.000242"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:16.744442" 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-10-16T01:15:16.744192" elapsed="0.000276"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:16.744851" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:16.744632" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:16.788092" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:16.745456" elapsed="0.042811"/>
</kw>
<msg time="2026-10-16T01:15:16.788452" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:16.788494" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:16.745033" elapsed="0.043497"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:16.850592" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:16.789184" elapsed="0.061616"/>
</kw>
<msg time="2026-10-16T01:15:16.850955" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:16.851010" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:16.788757" elapsed="0.062304"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:16.851354" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:16.851145" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:16.851116" elapsed="0.000332"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:16.852000" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:16.851630" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:16.852379" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:16.852178" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:16.852161" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:16.852506" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:16.854987" elapsed="0.000467"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:15:16.856650" elapsed="0.000510"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:16.858488" 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-10-16T01:15:16.853334" elapsed="0.005553"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:16.852835" elapsed="0.006166"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:16.743341" elapsed="0.115738"/>
</kw>
<msg time="2026-10-16T01:15:16.859161" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:16.859200" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:16.742766" elapsed="0.116470"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:16.859389" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:15:16.859304" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:16.859287" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:15:16.859844" 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-10-16T01:15:16.860152" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:16.860216" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:15:16.742139" elapsed="0.118161"/>
</kw>
<msg time="2026-10-16T01:15:16.860383" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:16.860424" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:16.740140" elapsed="0.120319"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:16.860868" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:16.860526" elapsed="0.000393"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:16.860510" elapsed="0.000431"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:15:16.740000" elapsed="0.120963"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:16.863479" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:16.863395" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:16.863377" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:16.864641" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:16.864558" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:16.864542" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:16.865105" 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-10-16T01:15:16.864882" elapsed="0.000247"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:16.865456" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:16.865287" elapsed="0.000192"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:16.905732" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:16.866065" elapsed="0.039842"/>
</kw>
<msg time="2026-10-16T01:15:16.906061" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:16.906143" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:16.865629" elapsed="0.040553"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:16.963105" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:16.906802" elapsed="0.056473"/>
</kw>
<msg time="2026-10-16T01:15:16.963432" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:16.963473" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:16.906345" elapsed="0.057164"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:16.963826" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:16.963580" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:16.963561" elapsed="0.000362"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:16.964440" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:16.964102" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:16.964802" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:16.964574" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:16.964555" elapsed="0.000343"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:16.964928" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:16.967359" 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-10-16T01:15:16.969051" elapsed="0.000448"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:16.970677" 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-10-16T01:15:16.965714" elapsed="0.005359"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:16.965197" elapsed="0.005990"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:16.864303" elapsed="0.106961"/>
</kw>
<msg time="2026-10-16T01:15:16.971345" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:16.971386" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:16.863723" elapsed="0.107698"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:16.971573" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:15:16.971489" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:16.971472" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:15:16.972000" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:16.972298" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:16.972362" 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-10-16T01:15:16.863100" elapsed="0.109347"/>
</kw>
<msg time="2026-10-16T01:15:16.972530" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:16.972569" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:16.861213" elapsed="0.111392"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:16.972918" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:16.972686" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:16.972655" elapsed="0.000372"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:15:16.861077" elapsed="0.111972"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:15:16.631448" elapsed="0.341629"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:15:16.628854" elapsed="0.344284"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:15:16.626418" elapsed="0.346776"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:16.625956" elapsed="0.347282"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:15:16.624808" elapsed="0.348483"/>
</kw>
<kw name="Kill_Single_Member" owner="ClusterManagement">
<msg time="2026-10-16T01:15:16.975247" 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-10-16T01:15:16.973537" elapsed="0.001750">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 the variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:16.975483" elapsed="0.000020"/>
</kw>
<doc>Kill Owner Instance and verify it is dead</doc>
<status status="FAIL" start="2026-10-16T01:15:16.624301" elapsed="0.351351">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-10-16T01:15:16.978569" elapsed="0.000604"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:15:16.977630" elapsed="0.001641"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:16.980479" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:16.980338" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:16.980303" elapsed="0.000264"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:16.982718" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:16.982604" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:16.982587" elapsed="0.000197"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:16.983750" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:16.983363" elapsed="0.000420"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:16.984209" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:16.983936" elapsed="0.000297"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:16.984274" elapsed="0.000042"/>
</return>
<msg time="2026-10-16T01:15:16.984421" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:16.983001" elapsed="0.001443"/>
</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-10-16T01:15:16.987161" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:16.987073" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:16.987055" elapsed="0.000169"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:16.988362" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:16.988278" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:16.988261" elapsed="0.000165"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:16.988873" 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-10-16T01:15:16.988577" elapsed="0.000322"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:16.989249" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:16.989067" elapsed="0.000207"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:17.037887" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:16.989913" elapsed="0.048150"/>
</kw>
<msg time="2026-10-16T01:15:17.038246" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:17.038288" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:16.989427" elapsed="0.048967"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:17.106068" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:17.039023" elapsed="0.067217"/>
</kw>
<msg time="2026-10-16T01:15:17.106396" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:17.106436" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:17.038562" elapsed="0.067910"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:17.106797" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:17.106542" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:17.106524" elapsed="0.000370"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:17.107417" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:17.107075" elapsed="0.000417"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:17.107801" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:17.107552" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:17.107536" elapsed="0.000360"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:17.107927" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:17.110423" 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-10-16T01:15:17.112163" elapsed="0.000496"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:17.114119" elapsed="0.000311"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:15:17.108782" elapsed="0.005717"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:17.108231" elapsed="0.006383"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:16.988022" elapsed="0.126702"/>
</kw>
<msg time="2026-10-16T01:15:17.114816" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:17.114857" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:16.987371" elapsed="0.127523"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:17.115058" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-10-16T01:15:17.114968" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:17.114948" elapsed="0.000193"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:15:17.115491" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:17.115901" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:17.115966" 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-10-16T01:15:16.986766" elapsed="0.129288"/>
</kw>
<msg time="2026-10-16T01:15:17.116140" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:17.116180" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:16.984847" elapsed="0.131373"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:17.116558" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:17.116288" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:17.116272" elapsed="0.000359"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:15:16.984689" elapsed="0.131965"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:17.119381" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:17.119296" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:17.119279" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:17.120541" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:17.120458" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:17.120441" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:17.121009" 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-10-16T01:15:17.120778" elapsed="0.000256"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:17.121365" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:17.121193" elapsed="0.000196"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:17.165388" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:17.121987" elapsed="0.043821"/>
</kw>
<msg time="2026-10-16T01:15:17.165973" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:17.166015" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:17.121540" elapsed="0.044511"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:17.249155" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:17.166652" elapsed="0.082680"/>
</kw>
<msg time="2026-10-16T01:15:17.249487" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:17.249528" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:17.166217" elapsed="0.083347"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:17.249872" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:17.249633" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:17.249615" elapsed="0.000352"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:17.250481" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:17.250147" elapsed="0.000415"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:17.250850" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:17.250625" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:17.250609" elapsed="0.000334"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:17.250974" elapsed="0.000024"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:17.253438" 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-10-16T01:15:17.255168" elapsed="0.000449"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:17.256854" elapsed="0.000308"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:15:17.251792" elapsed="0.005435"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:17.251261" elapsed="0.006087"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:17.120202" elapsed="0.137221"/>
</kw>
<msg time="2026-10-16T01:15:17.257539" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:17.257579" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:17.119590" elapsed="0.138025"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:17.258060" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:15:17.257971" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:17.257681" elapsed="0.000457"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:15:17.258450" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:17.258785" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:17.258850" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:15:17.118989" elapsed="0.139946"/>
</kw>
<msg time="2026-10-16T01:15:17.259019" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:17.259059" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:17.116978" elapsed="0.142115"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:17.259394" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:17.259160" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:17.259144" elapsed="0.000322"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:15:17.116838" elapsed="0.142649"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:17.262058" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:17.261974" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:17.261957" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:17.263216" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:17.263133" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:17.263117" elapsed="0.000161"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:17.263640" 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-10-16T01:15:17.263420" elapsed="0.000245"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:17.264189" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:17.264019" elapsed="0.000194"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:17.306155" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:17.264808" elapsed="0.041520"/>
</kw>
<msg time="2026-10-16T01:15:17.306502" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:17.306544" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:17.264363" elapsed="0.042217"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:17.378910" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:17.307229" elapsed="0.072236"/>
</kw>
<msg time="2026-10-16T01:15:17.380153" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:17.380252" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:17.306801" elapsed="0.073534"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:17.381221" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:17.380545" elapsed="0.000843"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:17.380485" elapsed="0.000962"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:17.382964" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:17.382023" elapsed="0.001119"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:17.383779" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:17.383282" elapsed="0.000658"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:17.383245" elapsed="0.000748"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:17.384067" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:17.389954" elapsed="0.001131"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:15:17.394073" elapsed="0.001097"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:17.398119" elapsed="0.000769"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:15:17.386062" elapsed="0.012991"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:17.384818" elapsed="0.014505"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:17.262880" elapsed="0.136619"/>
</kw>
<msg time="2026-10-16T01:15:17.399738" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:17.399834" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:17.262267" elapsed="0.137649"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:17.400266" elapsed="0.000054"/>
</return>
<status status="PASS" start="2026-10-16T01:15:17.400072" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:17.400034" elapsed="0.000408"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:15:17.401276" elapsed="0.000054"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:17.402246" elapsed="0.000054"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:17.402397" elapsed="0.000033"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:15:17.261656" elapsed="0.140939"/>
</kw>
<msg time="2026-10-16T01:15:17.402842" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:17.402934" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:17.259822" elapsed="0.143191"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:17.403666" elapsed="0.000094"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:17.403168" elapsed="0.000661"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:17.403132" elapsed="0.000758"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:15:17.259601" elapsed="0.144340"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:15:16.984508" elapsed="0.419499"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:15:16.982303" elapsed="0.421826"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:15:16.979983" elapsed="0.424267"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:16.979436" elapsed="0.424911"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:15:16.976618" elapsed="0.427845"/>
</kw>
<kw name="Check Ovsdb Shards Status After Cluster Event" owner="ClusterOvsdb">
<msg time="2026-10-16T01:15:17.408424" 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-10-16T01:15:17.404949" elapsed="0.003556">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-10-16T01:15:16.976057" elapsed="0.432786">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-10-16T01:15:17.412958" elapsed="0.000306"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:15:17.412367" elapsed="0.000967"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:17.414747" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:17.414590" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:17.414567" 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-10-16T01:15:17.417455" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:17.417337" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:17.417295" elapsed="0.000248"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:17.418881" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:17.418347" elapsed="0.000571"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:17.419518" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:17.419130" elapsed="0.000422"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:17.419609" elapsed="0.000035"/>
</return>
<msg time="2026-10-16T01:15:17.419820" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:17.417857" elapsed="0.001996"/>
</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-10-16T01:15:17.423359" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:17.423242" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:17.423219" 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-10-16T01:15:17.425017" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:17.424901" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:17.424877" elapsed="0.000228"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:17.425619" 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-10-16T01:15:17.425304" elapsed="0.000349"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:17.426156" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:17.425917" elapsed="0.000273"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:17.464433" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:17.427010" elapsed="0.037602"/>
</kw>
<msg time="2026-10-16T01:15:17.464827" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:17.464868" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:17.426402" elapsed="0.038501"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:17.570581" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:17.465493" elapsed="0.105320"/>
</kw>
<msg time="2026-10-16T01:15:17.570976" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:17.571017" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:17.465065" elapsed="0.105988"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:17.571334" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:17.571126" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:17.571107" elapsed="0.000322"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:17.572003" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:17.571614" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:17.572391" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:17.572192" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:17.572176" elapsed="0.000310"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:17.572518" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:17.575073" elapsed="0.000477"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:15:17.576881" elapsed="0.000466"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:17.578631" 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-10-16T01:15:17.573341" elapsed="0.005689"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:17.572840" elapsed="0.006306"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:17.424487" elapsed="0.154737"/>
</kw>
<msg time="2026-10-16T01:15:17.579305" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:17.579345" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:17.423656" elapsed="0.155725"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:17.579532" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:15:17.579448" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:17.579431" elapsed="0.000181"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:15:17.579958" 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-10-16T01:15:17.580253" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:17.580323" 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-10-16T01:15:17.422840" elapsed="0.157569"/>
</kw>
<msg time="2026-10-16T01:15:17.580493" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:17.580532" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:17.420324" elapsed="0.160243"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:17.580898" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:17.580634" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:17.580618" elapsed="0.000352"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:15:17.420124" elapsed="0.160867"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:17.585193" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:17.585108" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:17.585091" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:17.586496" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:17.586413" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:17.586396" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:17.586963" 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-10-16T01:15:17.586733" elapsed="0.000255"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:17.587317" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:17.587148" elapsed="0.000194"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:17.629404" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:17.587937" elapsed="0.041644"/>
</kw>
<msg time="2026-10-16T01:15:17.629834" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:17.629877" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:17.587493" elapsed="0.042420"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:17.757848" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:17.630499" elapsed="0.127547"/>
</kw>
<msg time="2026-10-16T01:15:17.758210" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:17.758251" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:17.630078" elapsed="0.128209"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:17.758581" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:17.758364" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:17.758343" elapsed="0.000389"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:17.759274" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:17.758923" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:17.759628" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:17.759428" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:17.759411" elapsed="0.000339"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:17.759782" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:17.762910" 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-10-16T01:15:17.764651" elapsed="0.000530"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:17.766540" 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-10-16T01:15:17.760589" elapsed="0.006379"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:17.760073" elapsed="0.007016"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:17.586156" elapsed="0.181012"/>
</kw>
<msg time="2026-10-16T01:15:17.767256" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:17.767297" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:17.585403" elapsed="0.181931"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:17.767496" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-10-16T01:15:17.767406" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:17.767388" elapsed="0.000191"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:15:17.768033" 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-10-16T01:15:17.768346" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:17.768411" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:15:17.584812" elapsed="0.183688"/>
</kw>
<msg time="2026-10-16T01:15:17.768586" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:17.768628" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:17.581242" elapsed="0.187424"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:17.769036" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:17.768812" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:17.768794" elapsed="0.000313"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:15:17.581103" elapsed="0.188041"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:17.771898" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:17.771812" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:17.771794" elapsed="0.000169"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:17.773067" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:17.772982" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:17.772965" elapsed="0.000166"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:17.773512" 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-10-16T01:15:17.773278" elapsed="0.000258"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:17.773902" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:17.773726" elapsed="0.000201"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:17.813804" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:17.774491" elapsed="0.039495"/>
</kw>
<msg time="2026-10-16T01:15:17.814146" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:17.814186" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:17.774079" elapsed="0.040143"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:17.931268" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:17.814844" elapsed="0.116618"/>
</kw>
<msg time="2026-10-16T01:15:17.931626" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:17.931668" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:17.814387" elapsed="0.117348"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:17.932022" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:17.931810" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:17.931791" elapsed="0.000328"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:17.932654" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:17.932303" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:17.933034" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:17.932838" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:17.932821" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:17.933159" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:17.935669" 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-10-16T01:15:17.937437" elapsed="0.000489"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:17.939121" 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-10-16T01:15:17.933995" elapsed="0.005507"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:17.933460" elapsed="0.006201"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:17.772721" elapsed="0.167291"/>
</kw>
<msg time="2026-10-16T01:15:17.940098" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:17.940138" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:17.772112" elapsed="0.168062"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:17.940330" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:15:17.940243" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:17.940226" elapsed="0.000182"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:15:17.940758" 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-10-16T01:15:17.941064" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:17.941128" 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-10-16T01:15:17.771483" elapsed="0.169731"/>
</kw>
<msg time="2026-10-16T01:15:17.941300" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:17.941340" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:17.769412" elapsed="0.171963"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:17.941663" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:17.941443" elapsed="0.000350"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:17.941427" elapsed="0.000389"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:15:17.769274" elapsed="0.172563"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:15:17.419923" elapsed="0.521943"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:15:17.416912" elapsed="0.525014"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:15:17.414231" elapsed="0.527747"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:17.413536" elapsed="0.528487"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:15:17.411552" elapsed="0.530521"/>
</kw>
<kw name="Get Ovsdb Entity Owner Status For One Device" owner="ClusterOvsdb">
<msg time="2026-10-16T01:15:17.946025" level="FAIL">Variable '${ovsdb_uuid}' 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-10-16T01:15:17.944806" elapsed="0.001256">Variable '${ovsdb_uuid}' 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-10-16T01:15:17.946241" elapsed="0.000020"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${new_owner}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:17.946444" elapsed="0.000019"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${new_candidate}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:17.946632" elapsed="0.000017"/>
</kw>
<doc>Check Entity Owner Status and identify owner and candidate.</doc>
<status status="FAIL" start="2026-10-16T01:15:17.410011" elapsed="0.536848">Variable '${ovsdb_uuid}' 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-10-16T01:15:17.949042" elapsed="0.000320"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:15:17.948493" elapsed="0.000921"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:17.950360" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:17.950274" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:17.950257" elapsed="0.000166"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:17.952318" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:17.952235" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:17.952218" elapsed="0.000200"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:17.953343" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:17.953011" elapsed="0.000357"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:17.953817" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:17.953518" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:17.953883" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:15:17.954009" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:17.952625" elapsed="0.001408"/>
</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-10-16T01:15:17.956584" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:17.956499" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:17.956481" elapsed="0.000167"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:17.957802" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:17.957670" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:17.957653" elapsed="0.000212"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:17.958239" 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-10-16T01:15:17.958009" elapsed="0.000255"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:17.958596" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:17.958425" elapsed="0.000195"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:17.996595" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:17.959261" elapsed="0.037570"/>
</kw>
<msg time="2026-10-16T01:15:17.997020" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:17.997062" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:17.958827" elapsed="0.038271"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:18.079243" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:17.997730" elapsed="0.081866"/>
</kw>
<msg time="2026-10-16T01:15:18.079918" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:18.079963" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:17.997268" elapsed="0.082731"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:18.080532" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:18.080148" elapsed="0.000464"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:18.080094" elapsed="0.000552"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:18.081389" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:18.080872" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:18.081948" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:18.081540" elapsed="0.000481"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:18.081522" elapsed="0.000522"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:18.082082" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:18.084883" elapsed="0.000497"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:15:18.086784" elapsed="0.000495"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:18.088495" elapsed="0.000613"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:15:18.083084" elapsed="0.006098"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:18.082473" elapsed="0.006830"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:17.957411" elapsed="0.131975"/>
</kw>
<msg time="2026-10-16T01:15:18.089481" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:18.089523" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:17.956823" elapsed="0.132735"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:18.089770" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-10-16T01:15:18.089635" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:18.089616" elapsed="0.000262"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:15:18.090289" 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-10-16T01:15:18.090612" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:18.090690" elapsed="0.000104"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:15:17.956210" elapsed="0.134665"/>
</kw>
<msg time="2026-10-16T01:15:18.090968" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:18.091009" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:17.954376" elapsed="0.136669"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:18.091340" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:18.091117" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:18.091101" elapsed="0.000310"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:15:17.954238" elapsed="0.137195"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:18.094258" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:18.094171" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:18.094153" elapsed="0.000169"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:18.095439" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:18.095355" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:18.095339" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:18.095922" 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-10-16T01:15:18.095646" elapsed="0.000302"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:18.096294" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:18.096109" elapsed="0.000211"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:18.137331" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:18.096922" elapsed="0.040708"/>
</kw>
<msg time="2026-10-16T01:15:18.137928" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:18.137971" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:18.096474" elapsed="0.041533"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:18.229065" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:18.138904" elapsed="0.090594"/>
</kw>
<msg time="2026-10-16T01:15:18.229820" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:18.229865" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:18.138283" elapsed="0.091618"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:18.230409" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:18.230048" elapsed="0.000439"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:18.229996" elapsed="0.000526"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:18.231236" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:18.230738" elapsed="0.000583"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:18.231580" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:18.231383" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:18.231365" elapsed="0.000321"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:18.231749" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:18.234517" 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-10-16T01:15:18.236338" elapsed="0.000584"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:18.238268" 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-10-16T01:15:18.232757" elapsed="0.005898"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:18.232134" elapsed="0.006672"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:18.095097" elapsed="0.143792"/>
</kw>
<msg time="2026-10-16T01:15:18.238979" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:18.239021" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:18.094471" elapsed="0.144587"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:18.239217" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:15:18.239130" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:18.239113" elapsed="0.000182"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:15:18.239645" 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-10-16T01:15:18.240067" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:18.240132" 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-10-16T01:15:18.093840" elapsed="0.146383"/>
</kw>
<msg time="2026-10-16T01:15:18.240315" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:18.240357" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:18.091745" elapsed="0.148650"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:18.240715" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:18.240468" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:18.240451" elapsed="0.000338"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:15:18.091573" elapsed="0.149238"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:18.243563" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:18.243479" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:18.243461" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:18.244798" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:18.244692" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:18.244661" elapsed="0.000200"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:18.245242" 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-10-16T01:15:18.245004" elapsed="0.000264"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:18.245603" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:18.245428" elapsed="0.000199"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:18.285693" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:18.246222" elapsed="0.039777"/>
</kw>
<msg time="2026-10-16T01:15:18.286198" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:18.286246" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:18.245807" elapsed="0.040475"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:18.370783" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:18.286952" elapsed="0.084017"/>
</kw>
<msg time="2026-10-16T01:15:18.371132" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:18.371174" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:18.286473" elapsed="0.084737"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:18.371492" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:18.371283" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:18.371263" elapsed="0.000325"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:18.372172" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:18.371824" elapsed="0.000431"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:18.372517" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:18.372317" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:18.372301" elapsed="0.000310"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:18.372642" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:18.375165" 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-10-16T01:15:18.376905" elapsed="0.000456"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:18.378561" elapsed="0.000553"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:15:18.373462" elapsed="0.005721"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:18.372949" elapsed="0.006351"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:18.244421" elapsed="0.134958"/>
</kw>
<msg time="2026-10-16T01:15:18.379462" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:18.379503" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:18.243835" elapsed="0.135703"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:18.379722" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:15:18.379607" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:18.379591" 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-10-16T01:15:18.380228" 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-10-16T01:15:18.380533" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:18.380598" 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-10-16T01:15:18.243168" elapsed="0.137618"/>
</kw>
<msg time="2026-10-16T01:15:18.380877" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:18.380918" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:18.241089" elapsed="0.139865"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:18.381246" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:18.381022" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:18.381006" elapsed="0.000312"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:15:18.240948" elapsed="0.140391"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:15:17.954089" elapsed="0.427279"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:15:17.951943" elapsed="0.429487"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:15:17.950012" elapsed="0.431479"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:17.949560" elapsed="0.431979"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:15:17.948117" elapsed="0.433477"/>
</kw>
<kw name="Create Sample Bridge Manually And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:15:18.384500" 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-10-16T01:15:18.383218" elapsed="0.001319">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-10-16T01:15:17.947451" elapsed="0.437259">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-10-16T01:15:18.386902" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:15:18.386523" elapsed="0.000657"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:18.388179" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:18.388092" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:18.388075" elapsed="0.000167"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:18.390144" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:18.390061" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:18.390045" elapsed="0.000162"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:18.391123" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:18.390791" elapsed="0.000358"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:18.391572" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:18.391300" elapsed="0.000296"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:18.391636" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:15:18.391794" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:18.390411" elapsed="0.001406"/>
</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-10-16T01:15:18.394335" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:18.394251" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:18.394234" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:18.395519" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:18.395434" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:18.395416" elapsed="0.000166"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:18.396012" 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-10-16T01:15:18.395761" elapsed="0.000277"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:18.396369" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:18.396198" elapsed="0.000195"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:18.446611" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:18.396994" elapsed="0.049828"/>
</kw>
<msg time="2026-10-16T01:15:18.446980" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:18.447022" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:18.396547" elapsed="0.050510"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:18.526483" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:18.447645" elapsed="0.079017"/>
</kw>
<msg time="2026-10-16T01:15:18.526857" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:18.526898" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:18.447223" elapsed="0.079711"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:18.527208" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:18.527004" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:18.526986" elapsed="0.000315"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:18.527856" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:18.527483" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:18.528190" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:18.527994" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:18.527978" elapsed="0.000305"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:18.528315" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:18.530807" elapsed="0.000473"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:15:18.532519" elapsed="0.000493"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:18.534294" 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-10-16T01:15:18.529124" elapsed="0.005562"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:18.528584" elapsed="0.006264"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:18.395142" elapsed="0.139783"/>
</kw>
<msg time="2026-10-16T01:15:18.535008" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:18.535048" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:18.394545" elapsed="0.140539"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:18.535235" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:15:18.535151" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:18.535134" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:15:18.535626" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:18.536235" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:18.536301" 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-10-16T01:15:18.393964" elapsed="0.142425"/>
</kw>
<msg time="2026-10-16T01:15:18.536472" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:18.536511" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:18.392153" elapsed="0.144393"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:18.536870" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:18.536614" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:18.536598" elapsed="0.000345"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:15:18.392015" elapsed="0.144950"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:18.539481" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:18.539390" elapsed="0.000134"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:18.539373" elapsed="0.000172"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:18.540640" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:18.540557" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:18.540540" elapsed="0.000198"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:18.541112" 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-10-16T01:15:18.540885" elapsed="0.000253"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:18.541464" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:18.541294" elapsed="0.000195"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:18.587947" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:18.547643" elapsed="0.040546"/>
</kw>
<msg time="2026-10-16T01:15:18.588385" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:18.588426" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:18.541641" elapsed="0.046820"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:18.669413" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:18.589162" elapsed="0.080442"/>
</kw>
<msg time="2026-10-16T01:15:18.669800" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:18.669841" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:18.588651" elapsed="0.081224"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:18.670217" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:18.669975" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:18.669943" elapsed="0.000376"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:18.670891" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:18.670504" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:18.671234" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:18.671038" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:18.671021" elapsed="0.000305"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:18.671363" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:18.674851" 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-10-16T01:15:18.676595" elapsed="0.000571"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:18.678531" 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-10-16T01:15:18.673006" elapsed="0.005937"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:18.672406" elapsed="0.006654"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:18.540299" elapsed="0.138843"/>
</kw>
<msg time="2026-10-16T01:15:18.679234" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:18.679275" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:18.539718" elapsed="0.139593"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:18.679469" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-10-16T01:15:18.679382" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:18.679365" elapsed="0.000187"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:15:18.679995" 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-10-16T01:15:18.680309" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:18.680372" 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-10-16T01:15:18.539097" elapsed="0.141364"/>
</kw>
<msg time="2026-10-16T01:15:18.680551" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:18.680592" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:18.537214" elapsed="0.143414"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:18.680952" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:18.680727" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:18.680694" elapsed="0.000331"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:15:18.537077" elapsed="0.143971"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:18.683866" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:18.683779" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:18.683759" elapsed="0.000170"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:18.685045" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:18.684955" elapsed="0.000131"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:18.684938" elapsed="0.000169"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:18.685481" 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-10-16T01:15:18.685248" elapsed="0.000258"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:18.685869" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:18.685677" elapsed="0.000216"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:18.729149" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:18.686454" elapsed="0.042874"/>
</kw>
<msg time="2026-10-16T01:15:18.729499" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:18.729541" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:18.686044" elapsed="0.043534"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:18.808620" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:18.730207" elapsed="0.078676"/>
</kw>
<msg time="2026-10-16T01:15:18.809042" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:18.809083" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:18.729776" elapsed="0.079342"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:18.809393" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:18.809189" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:18.809171" elapsed="0.000316"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:18.810043" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:18.809684" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:18.810379" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:18.810183" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:18.810167" elapsed="0.000304"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:18.810501" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:18.813089" elapsed="0.000473"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:15:18.814837" elapsed="0.000452"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:18.816474" elapsed="0.000550"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:15:18.811329" elapsed="0.005761"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:18.810833" elapsed="0.006373"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:18.684654" elapsed="0.132629"/>
</kw>
<msg time="2026-10-16T01:15:18.817365" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:18.817405" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:18.684076" elapsed="0.133365"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:18.817593" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:15:18.817509" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:18.817492" elapsed="0.000193"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:15:18.818019" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:18.818322" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:18.818386" 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-10-16T01:15:18.683387" elapsed="0.135085"/>
</kw>
<msg time="2026-10-16T01:15:18.818554" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:18.818598" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:18.681316" elapsed="0.137318"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:18.819038" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:18.818808" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:18.818791" elapsed="0.000318"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:15:18.681177" elapsed="0.137953"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:15:18.391869" elapsed="0.427289"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:15:18.389770" elapsed="0.429445"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:15:18.387836" elapsed="0.431470"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:18.387328" elapsed="0.432026"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:15:18.386027" elapsed="0.433381"/>
</kw>
<kw name="Add Sample Port To The Manual Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:15:18.828981" 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-10-16T01:15:18.821014" elapsed="0.008517">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-10-16T01:15:18.385388" elapsed="0.444884">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-10-16T01:15:18.832894" elapsed="0.000289"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:15:18.832599" elapsed="0.000640"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:18.834406" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:18.834272" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:18.834246" elapsed="0.000236"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:18.836942" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:18.836859" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:18.836843" elapsed="0.000161"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:18.838056" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:18.837565" elapsed="0.000520"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:18.838511" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:18.838237" elapsed="0.000299"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:18.838576" elapsed="0.000032"/>
</return>
<msg time="2026-10-16T01:15:18.838756" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:18.837212" elapsed="0.001567"/>
</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-10-16T01:15:18.841350" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:18.841267" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:18.841250" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:18.842541" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:18.842460" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:18.842443" elapsed="0.000160"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:18.843016" 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-10-16T01:15:18.842785" elapsed="0.000256"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:18.843381" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:18.843206" elapsed="0.000208"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:18.880904" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:18.844018" elapsed="0.037070"/>
</kw>
<msg time="2026-10-16T01:15:18.881251" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:18.881292" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:18.843572" elapsed="0.037756"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:18.946603" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:18.881957" elapsed="0.064853"/>
</kw>
<msg time="2026-10-16T01:15:18.946968" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:18.947093" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:18.881492" elapsed="0.065639"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:18.947408" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:18.947203" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:18.947185" elapsed="0.000319"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:18.948056" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:18.947711" elapsed="0.000422"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:18.948390" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:18.948194" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:18.948177" elapsed="0.000306"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:18.948514" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:18.951071" elapsed="0.000487"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:15:18.952845" elapsed="0.000486"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:18.954756" 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-10-16T01:15:18.949346" elapsed="0.005796"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:18.948847" elapsed="0.006412"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:18.842206" elapsed="0.113130"/>
</kw>
<msg time="2026-10-16T01:15:18.955417" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:18.955457" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:18.841560" elapsed="0.113937"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:18.955648" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-10-16T01:15:18.955565" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:18.955549" elapsed="0.000267"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:15:18.956148" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:18.956449" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:18.956513" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:15:18.840978" elapsed="0.115623"/>
</kw>
<msg time="2026-10-16T01:15:18.956719" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:18.956770" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:18.839122" elapsed="0.117684"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:18.957095" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:18.956873" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:18.956857" elapsed="0.000313"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:15:18.838984" elapsed="0.118208"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:18.961165" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:18.961081" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:18.961064" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:18.962336" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:18.962253" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:18.962237" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:18.962839" 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-10-16T01:15:18.962573" elapsed="0.000291"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:18.963189" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:18.963021" elapsed="0.000192"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:19.019620" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:18.963851" elapsed="0.055995"/>
</kw>
<msg time="2026-10-16T01:15:19.020003" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:19.020044" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:18.963364" elapsed="0.056714"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:19.091201" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:19.020675" elapsed="0.070703"/>
</kw>
<msg time="2026-10-16T01:15:19.091538" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:19.091579" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:19.020241" elapsed="0.071372"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:19.091930" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:19.091720" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:19.091680" elapsed="0.000345"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:19.092539" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:19.092204" elapsed="0.000412"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:19.092907" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:19.092691" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:19.092674" elapsed="0.000327"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:19.093033" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:19.095483" 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-10-16T01:15:19.097215" elapsed="0.000526"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:19.099438" elapsed="0.000950"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:15:19.093830" elapsed="0.006755"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:19.093301" elapsed="0.007637"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:18.961998" elapsed="0.139159"/>
</kw>
<msg time="2026-10-16T01:15:19.101371" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:19.101467" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:18.961373" elapsed="0.140177"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:19.102033" elapsed="0.000073"/>
</return>
<status status="PASS" start="2026-10-16T01:15:19.101791" elapsed="0.000394"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:19.101738" elapsed="0.000502"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:15:19.103227" elapsed="0.000063"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:19.104099" elapsed="0.000052"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:19.104246" elapsed="0.000033"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:15:18.960790" elapsed="0.143650"/>
</kw>
<msg time="2026-10-16T01:15:19.104633" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:19.104801" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:18.957438" elapsed="0.147445"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:19.105558" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:19.105039" elapsed="0.000651"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:19.105003" elapsed="0.000825"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:15:18.957304" elapsed="0.148574"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:19.111991" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:19.111795" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:19.111756" elapsed="0.000376"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:19.114873" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:19.114619" elapsed="0.000348"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:19.114581" elapsed="0.000434"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:19.115901" 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-10-16T01:15:19.115338" elapsed="0.000619"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:19.116782" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:19.116315" elapsed="0.000523"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:19.165126" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:19.118186" elapsed="0.047855"/>
</kw>
<msg time="2026-10-16T01:15:19.166357" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:19.166417" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:19.117179" elapsed="0.049287"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:19.233171" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:19.167631" elapsed="0.065724"/>
</kw>
<msg time="2026-10-16T01:15:19.233520" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:19.233561" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:19.166875" elapsed="0.066721"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:19.233980" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:19.233736" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:19.233677" elapsed="0.000408"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:19.234619" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:19.234271" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:19.234989" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:19.234791" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:19.234774" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:19.235119" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:19.237856" elapsed="0.000487"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:15:19.239590" elapsed="0.000517"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:19.241298" 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-10-16T01:15:19.236107" elapsed="0.005790"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:19.235463" elapsed="0.006572"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:19.114041" elapsed="0.128077"/>
</kw>
<msg time="2026-10-16T01:15:19.242205" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:19.242245" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:19.112460" elapsed="0.129821"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:19.242438" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:15:19.242352" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:19.242336" elapsed="0.000194"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:15:19.242895" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:19.243212" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:19.243276" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:15:19.111058" elapsed="0.132305"/>
</kw>
<msg time="2026-10-16T01:15:19.243451" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:19.243491" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:19.106454" elapsed="0.137072"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:19.243856" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:19.243595" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:19.243579" elapsed="0.000350"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:15:19.106137" elapsed="0.137813"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:15:18.838833" elapsed="0.405150"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:15:18.836539" elapsed="0.407500"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:15:18.833978" elapsed="0.410115"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:18.833392" elapsed="0.410743"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:15:18.832177" elapsed="0.412007"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:19.246625" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:19.246372" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:19.246171" elapsed="0.000563"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:19.247062" 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-10-16T01:15:19.247153" 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-10-16T01:15:19.246928" elapsed="0.000249"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:19.247664" level="INFO">Attempting to execute command "ip tuntap add mode tap vport1" on remote system "10.30.171.104" 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-10-16T01:15:19.247364" elapsed="0.000648"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:19.248536" level="INFO">${conn_id} = 105</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-10-16T01:15:19.248229" elapsed="0.000331"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:15:19.249394" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:15:19.249463" 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-10-16T01:15:19.249133" elapsed="0.000352"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:19.249630" elapsed="0.000313"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:15:19.250729" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:15:19.940533" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:15:19 UTC 2026

  System load:  0.06               Processes:             111
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:15:03 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:15:19.250471" elapsed="0.690203"/>
</kw>
<msg time="2026-10-16T01:15:19.940774" 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-10-16T01:15:19.250104" elapsed="0.690762"/>
</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-10-16T01:15:19.248782" elapsed="0.692198"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:15:19.941523" level="INFO">Executing command 'ip tuntap add mode tap vport1'.</msg>
<msg time="2026-10-16T01:15:19.954588" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-10-16T01:15:19.954767" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:15:19.954823" 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-10-16T01:15:19.941291" elapsed="0.013563"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:19.955068" elapsed="0.000278"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:19.956030" 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-10-16T01:15:19.955659" elapsed="0.000429"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:15:19.956331" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:19.956186" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:19.956158" elapsed="0.000266"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:15:19.956602" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-10-16T01:15:19.956490" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:19.956472" elapsed="0.000274"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:15:19.956791" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:19.957784" 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-10-16T01:15:19.958439" elapsed="0.000194"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:19.958863" 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-10-16T01:15:19.957193" elapsed="0.001858"/>
</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-10-16T01:15:19.245761" elapsed="0.713386"/>
</kw>
<msg time="2026-10-16T01:15:19.959213" 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-10-16T01:15:19.245190" elapsed="0.714085"/>
</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-10-16T01:15:19.244773" elapsed="0.714599"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:19.962240" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:19.961915" elapsed="0.000398"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:19.961890" elapsed="0.000455"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:19.962815" 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-10-16T01:15:19.962942" 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-10-16T01:15:19.962608" elapsed="0.000368"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:19.963633" level="INFO">Attempting to execute command "ip tuntap add mode tap vport2" on remote system "10.30.171.104" 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-10-16T01:15:19.963234" elapsed="0.000493"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:19.964380" 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-10-16T01:15:19.963971" elapsed="0.000442"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:15:19.965549" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:15:19.965662" 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-10-16T01:15:19.965208" elapsed="0.000487"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:19.965918" elapsed="0.000396"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:15:19.967404" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:15:20.342217" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:15:19 UTC 2026

  System load:  0.06               Processes:             111
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:15:19 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:15:19.967083" elapsed="0.375315"/>
</kw>
<msg time="2026-10-16T01:15:20.342489" 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-10-16T01:15:19.966535" elapsed="0.376046"/>
</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-10-16T01:15:19.964694" elapsed="0.378060"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:15:20.343388" level="INFO">Executing command 'ip tuntap add mode tap vport2'.</msg>
<msg time="2026-10-16T01:15:20.355765" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-10-16T01:15:20.355886" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:15:20.355924" 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-10-16T01:15:20.343108" elapsed="0.012837"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:20.356102" elapsed="0.000212"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:20.357008" 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-10-16T01:15:20.356588" elapsed="0.000470"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:15:20.357297" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:20.357154" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:20.357124" elapsed="0.000255"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:15:20.357512" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:15:20.357430" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:20.357416" elapsed="0.000173"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:15:20.357622" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:20.358503" elapsed="0.000392"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:15:20.359106" elapsed="0.000163"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:20.359409" elapsed="0.000162"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:15:20.358044" elapsed="0.001740"/>
</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-10-16T01:15:19.961292" elapsed="0.398606"/>
</kw>
<msg time="2026-10-16T01:15:20.359955" 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-10-16T01:15:19.960234" elapsed="0.399771"/>
</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-10-16T01:15:19.959613" elapsed="0.400468"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:20.362321" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:20.362077" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:20.362059" elapsed="0.000338"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:20.362783" 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-10-16T01:15:20.362904" 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-10-16T01:15:20.362590" elapsed="0.000347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:20.363427" level="INFO">Attempting to execute command "ifconfig vport1 up" on remote system "10.30.171.104" 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-10-16T01:15:20.363140" elapsed="0.000329"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:20.364029" 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-10-16T01:15:20.363666" elapsed="0.000388"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:15:20.364951" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:15:20.365021" 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-10-16T01:15:20.364601" elapsed="0.000442"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:20.365190" elapsed="0.000284"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:15:20.366331" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:15:20.720774" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:15:19 UTC 2026

  System load:  0.06               Processes:             111
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:15:20 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:15:20.366097" elapsed="0.354806"/>
</kw>
<msg time="2026-10-16T01:15:20.720975" 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-10-16T01:15:20.365652" elapsed="0.355391"/>
</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-10-16T01:15:20.364247" elapsed="0.356895"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:15:20.721606" level="INFO">Executing command 'ifconfig vport1 up'.</msg>
<msg time="2026-10-16T01:15:20.734462" level="INFO">Command exited with return code 255.</msg>
<msg time="2026-10-16T01:15:20.734612" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:15:20.734689" 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-10-16T01:15:20.721400" elapsed="0.013348"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:20.734970" elapsed="0.000276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:20.735966" 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-10-16T01:15:20.735565" elapsed="0.000536"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:15:20.736360" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:20.736204" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:20.736175" elapsed="0.000283"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:15:20.736661" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-10-16T01:15:20.736527" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:20.736506" elapsed="0.000292"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:15:20.736843" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:20.737855" elapsed="0.000409"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:15:20.738523" elapsed="0.000475"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:20.739202" elapsed="0.000127"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:15:20.737254" elapsed="0.002143"/>
</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-10-16T01:15:20.361564" elapsed="0.377931"/>
</kw>
<msg time="2026-10-16T01:15:20.739563" 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-10-16T01:15:20.360742" elapsed="0.378901"/>
</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-10-16T01:15:20.360264" elapsed="0.379502"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:20.742322" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:20.741995" elapsed="0.000400"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:20.741969" elapsed="0.000460"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:20.742908" 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-10-16T01:15:20.743036" 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-10-16T01:15:20.742732" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:20.743766" level="INFO">Attempting to execute command "ifconfig vport2 up" on remote system "10.30.171.104" 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-10-16T01:15:20.743327" elapsed="0.000499"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:20.744477" 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-10-16T01:15:20.744069" elapsed="0.000441"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:15:20.745665" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:15:20.745784" 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-10-16T01:15:20.745302" elapsed="0.000513"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:20.746020" elapsed="0.000395"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:15:20.747507" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:15:21.144733" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:15:19 UTC 2026

  System load:  0.06               Processes:             111
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:15:20 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:15:20.747186" elapsed="0.397677"/>
</kw>
<msg time="2026-10-16T01:15:21.145008" 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-10-16T01:15:20.746655" elapsed="0.398428"/>
</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-10-16T01:15:20.744812" elapsed="0.400409"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:15:21.145762" level="INFO">Executing command 'ifconfig vport2 up'.</msg>
<msg time="2026-10-16T01:15:21.159105" level="INFO">Command exited with return code 255.</msg>
<msg time="2026-10-16T01:15:21.159222" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:15:21.159262" 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-10-16T01:15:21.145509" elapsed="0.013774"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:21.159443" elapsed="0.000240"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:21.160236" 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-10-16T01:15:21.159956" elapsed="0.000322"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:15:21.160480" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:21.160360" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:21.160334" elapsed="0.000219"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:15:21.160714" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:15:21.160602" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:21.160588" elapsed="0.000206"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:15:21.160824" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:21.161837" elapsed="0.000295"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:15:21.162316" elapsed="0.000148"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:21.162604" 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-10-16T01:15:21.161385" elapsed="0.001418"/>
</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-10-16T01:15:20.741370" elapsed="0.421515"/>
</kw>
<msg time="2026-10-16T01:15:21.162941" 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-10-16T01:15:20.740606" elapsed="0.422387"/>
</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-10-16T01:15:20.740018" elapsed="0.423059"/>
</kw>
<doc>Create Tap Device vport1 and vport2 to add to the bridge br-s1 using OVS command.</doc>
<status status="PASS" start="2026-10-16T01:15:19.244388" elapsed="1.918753"/>
</kw>
<doc>Create tap devices to add to the bridge in ovs</doc>
<status status="PASS" start="2026-10-16T01:15:18.831079" elapsed="2.332188"/>
</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-10-16T01:15:21.164856" elapsed="0.000203"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:15:21.164553" 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-10-16T01:15:21.166082" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:21.165966" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:21.165948" 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-10-16T01:15:21.168165" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:21.168075" elapsed="0.000132"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:21.168059" elapsed="0.000169"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:21.169260" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:21.168870" elapsed="0.000415"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:21.169755" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:21.169442" elapsed="0.000337"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:21.169819" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:15:21.169988" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:21.168430" elapsed="0.001582"/>
</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-10-16T01:15:21.172643" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:21.172545" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:21.172528" 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-10-16T01:15:21.173861" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:21.173777" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:21.173760" elapsed="0.000166"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:21.174309" 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-10-16T01:15:21.174074" elapsed="0.000260"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:21.174689" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:21.174497" elapsed="0.000232"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:21.214378" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:21.175303" elapsed="0.039257"/>
</kw>
<msg time="2026-10-16T01:15:21.214774" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:21.214819" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:21.174886" elapsed="0.039973"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:21.302248" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:21.215509" elapsed="0.086927"/>
</kw>
<msg time="2026-10-16T01:15:21.302603" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:21.302662" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:21.215036" elapsed="0.087682"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:21.303006" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:21.302793" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:21.302773" elapsed="0.000329"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:21.303644" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:21.303285" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:21.304008" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:21.303810" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:21.303793" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:21.304132" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:21.306721" elapsed="0.000486"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:15:21.308465" elapsed="0.000504"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:21.310186" 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-10-16T01:15:21.304993" elapsed="0.005571"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:21.304431" elapsed="0.006450"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:21.173483" elapsed="0.137480"/>
</kw>
<msg time="2026-10-16T01:15:21.311087" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:21.311126" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:21.172871" elapsed="0.138291"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:21.311319" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:15:21.311233" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:21.311215" elapsed="0.000182"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:15:21.311752" 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-10-16T01:15:21.312057" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:21.312122" 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-10-16T01:15:21.172253" elapsed="0.139955"/>
</kw>
<msg time="2026-10-16T01:15:21.312292" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:21.312332" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:21.170373" elapsed="0.141995"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:21.312668" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:21.312435" elapsed="0.000409"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:21.312420" elapsed="0.000447"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:15:21.170231" elapsed="0.142658"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:21.315404" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:21.315319" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:21.315301" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:21.316585" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:21.316501" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:21.316485" elapsed="0.000177"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:21.317064" 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-10-16T01:15:21.316838" elapsed="0.000251"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:21.317415" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:21.317247" elapsed="0.000192"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:21.359920" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:21.318042" elapsed="0.042050"/>
</kw>
<msg time="2026-10-16T01:15:21.360264" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:21.360305" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:21.317591" elapsed="0.042749"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:21.460653" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:21.360974" elapsed="0.099884"/>
</kw>
<msg time="2026-10-16T01:15:21.461017" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:21.461057" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:21.360504" elapsed="0.100588"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:21.461369" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:21.461163" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:21.461144" elapsed="0.000354"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:21.462061" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:21.461713" elapsed="0.000434"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:21.462405" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:21.462208" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:21.462192" elapsed="0.000305"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:21.462529" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:21.465021" 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-10-16T01:15:21.466748" elapsed="0.000456"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:21.468549" 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-10-16T01:15:21.463340" elapsed="0.005610"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:21.462842" elapsed="0.006221"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:21.316245" elapsed="0.152895"/>
</kw>
<msg time="2026-10-16T01:15:21.469222" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:21.469262" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:21.315631" elapsed="0.153667"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:21.469472" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:15:21.469386" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:21.469369" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:15:21.469959" 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-10-16T01:15:21.470261" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:21.470325" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:15:21.315025" elapsed="0.155385"/>
</kw>
<msg time="2026-10-16T01:15:21.470494" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:21.470533" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:21.313140" elapsed="0.157428"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:21.470884" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:21.470651" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:21.470634" elapsed="0.000321"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:15:21.313002" elapsed="0.157974"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:21.473588" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:21.473502" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:21.473484" elapsed="0.000180"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:21.474778" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:21.474673" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:21.474656" elapsed="0.000184"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:21.475202" 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-10-16T01:15:21.474981" elapsed="0.000246"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:21.475554" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:21.475385" elapsed="0.000236"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:21.516649" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:21.476212" elapsed="0.040643"/>
</kw>
<msg time="2026-10-16T01:15:21.517014" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:21.517056" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:21.475796" elapsed="0.041296"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:21.618628" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:21.517723" elapsed="0.101424"/>
</kw>
<msg time="2026-10-16T01:15:21.619391" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:21.619434" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:21.517260" elapsed="0.102209"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:21.619965" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:21.619598" elapsed="0.000445"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:21.619553" elapsed="0.000522"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:21.620812" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:21.620263" elapsed="0.000633"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:21.621158" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:21.620959" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:21.620942" elapsed="0.000311"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:21.621288" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:21.624074" 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-10-16T01:15:21.625898" elapsed="0.000495"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:21.627785" 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-10-16T01:15:21.622254" elapsed="0.005914"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:21.621674" elapsed="0.006613"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:21.474405" elapsed="0.153960"/>
</kw>
<msg time="2026-10-16T01:15:21.628454" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:21.628494" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:21.473830" elapsed="0.154700"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:21.628776" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-10-16T01:15:21.628601" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:21.628584" elapsed="0.000276"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:15:21.629212" 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-10-16T01:15:21.629528" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:21.629594" 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-10-16T01:15:21.473204" elapsed="0.156513"/>
</kw>
<msg time="2026-10-16T01:15:21.629875" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:21.629916" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:21.471225" elapsed="0.158725"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:21.630241" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:21.630021" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:21.630005" elapsed="0.000306"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:15:21.471087" elapsed="0.159247"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:15:21.170072" elapsed="0.460298"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:15:21.167786" elapsed="0.462645"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:15:21.165678" elapsed="0.464809"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:21.165256" elapsed="0.465276"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:15:21.164200" elapsed="0.466387"/>
</kw>
<kw name="Add Sample Tap Device To The Manual Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:15:21.633680" 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-10-16T01:15:21.632358" elapsed="0.001393">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-10-16T01:15:21.163583" elapsed="0.470358">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-10-16T01:15:21.635472" elapsed="0.000240"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:15:21.635228" 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-10-16T01:15:21.636681" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:21.636557" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:21.636539" 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-10-16T01:15:21.638715" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:21.638597" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:21.638580" elapsed="0.000199"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:21.639760" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:21.639374" elapsed="0.000412"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:21.640207" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:21.639937" elapsed="0.000294"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:21.640271" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:15:21.640401" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:21.638982" elapsed="0.001442"/>
</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-10-16T01:15:21.643184" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:21.643099" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:21.643082" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:21.644413" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:21.644330" elapsed="0.000135"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:21.644313" elapsed="0.000181"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:21.644953" 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-10-16T01:15:21.644673" elapsed="0.000316"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:21.645344" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:21.645165" elapsed="0.000203"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:21.683231" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:21.646015" elapsed="0.037399"/>
</kw>
<msg time="2026-10-16T01:15:21.683577" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:21.683636" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:21.645560" elapsed="0.038113"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:21.792439" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:21.684330" elapsed="0.108315"/>
</kw>
<msg time="2026-10-16T01:15:21.792863" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:21.792905" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:21.683895" elapsed="0.109045"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:21.793233" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:21.793019" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:21.792997" elapsed="0.000333"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:21.793936" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:21.793510" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:21.794284" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:21.794081" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:21.794064" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:21.794408" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:21.797115" 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-10-16T01:15:21.798970" elapsed="0.000474"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:21.800898" elapsed="0.000311"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:15:21.795325" elapsed="0.005952"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:21.794776" elapsed="0.006618"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:21.644073" elapsed="0.157397"/>
</kw>
<msg time="2026-10-16T01:15:21.801554" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:21.801593" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:21.643419" elapsed="0.158234"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:21.801897" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:15:21.801800" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:21.801778" elapsed="0.000198"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:15:21.802299" 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-10-16T01:15:21.802626" elapsed="0.000030"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:21.802863" elapsed="0.000021"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:15:21.642808" elapsed="0.160165"/>
</kw>
<msg time="2026-10-16T01:15:21.803106" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:21.803146" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:21.640842" elapsed="0.162339"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:21.803467" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:21.803250" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:21.803234" elapsed="0.000304"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:15:21.640670" elapsed="0.162889"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:21.808218" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:21.808130" elapsed="0.000131"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:21.808112" elapsed="0.000170"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:21.809433" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:21.809348" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:21.809331" elapsed="0.000165"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:21.809951" 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-10-16T01:15:21.809673" elapsed="0.000304"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:21.810311" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:21.810139" elapsed="0.000196"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:21.855833" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:21.811001" elapsed="0.045022"/>
</kw>
<msg time="2026-10-16T01:15:21.856181" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:21.856223" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:21.810489" elapsed="0.045769"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:21.952450" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:21.856944" elapsed="0.095725"/>
</kw>
<msg time="2026-10-16T01:15:21.952879" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:21.952920" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:21.856421" elapsed="0.096535"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:21.953235" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:21.953028" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:21.953009" elapsed="0.000320"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:21.953958" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:21.953510" elapsed="0.000537"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:21.954304" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:21.954108" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:21.954091" elapsed="0.000306"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:21.954430" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:21.957057" elapsed="0.000478"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:15:21.958877" elapsed="0.000455"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:21.960843" elapsed="0.000310"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:15:21.955290" elapsed="0.005930"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:21.954785" elapsed="0.006551"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:21.809091" elapsed="0.152322"/>
</kw>
<msg time="2026-10-16T01:15:21.961494" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:21.961535" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:21.808431" elapsed="0.153140"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:21.961863" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-10-16T01:15:21.961668" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:21.961647" elapsed="0.000315"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:15:21.962276" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:21.962570" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:21.962664" 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-10-16T01:15:21.807828" elapsed="0.154967"/>
</kw>
<msg time="2026-10-16T01:15:21.962887" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:21.962927" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:21.803893" elapsed="0.159069"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:21.963247" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:21.963030" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:21.963014" elapsed="0.000304"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:15:21.803725" elapsed="0.159615"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:21.965962" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:21.965877" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:21.965859" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:21.967125" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:21.967042" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:21.967025" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:21.967551" 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-10-16T01:15:21.967329" elapsed="0.000247"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:21.967937" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:21.967767" elapsed="0.000194"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:22.009166" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:21.968526" elapsed="0.040851"/>
</kw>
<msg time="2026-10-16T01:15:22.009563" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:22.009627" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:21.968114" elapsed="0.041560"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:22.097317" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:22.010406" elapsed="0.087123"/>
</kw>
<msg time="2026-10-16T01:15:22.097738" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:22.097855" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:22.009923" elapsed="0.087970"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:22.098255" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:22.097995" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:22.097961" elapsed="0.000398"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:22.098952" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:22.098544" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:22.099296" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:22.099097" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:22.099081" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:22.099425" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:22.102202" 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-10-16T01:15:22.104068" elapsed="0.000484"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:22.105963" 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-10-16T01:15:22.100348" elapsed="0.006001"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:22.099808" elapsed="0.006660"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:21.966786" elapsed="0.139762"/>
</kw>
<msg time="2026-10-16T01:15:22.106653" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:22.106760" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:21.966173" elapsed="0.140627"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:22.106960" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:15:22.106872" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:22.106854" elapsed="0.000185"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:15:22.107379" 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-10-16T01:15:22.107753" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:22.107831" 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-10-16T01:15:21.965552" elapsed="0.142392"/>
</kw>
<msg time="2026-10-16T01:15:22.108034" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:22.108076" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:21.963586" elapsed="0.144526"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:22.108403" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:22.108182" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:22.108166" elapsed="0.000309"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:15:21.963450" elapsed="0.145046"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:15:21.640479" elapsed="0.468053"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:15:21.638294" elapsed="0.470297"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:15:21.636301" elapsed="0.472380"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:21.635912" elapsed="0.472976"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:15:21.634889" elapsed="0.474057"/>
</kw>
<kw name="Delete Sample Bridge Manually And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:15:22.111965" 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-10-16T01:15:22.110627" elapsed="0.001377">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-10-16T01:15:21.634295" elapsed="0.477868">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-10-16T01:15:22.113775" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:15:22.113464" 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-10-16T01:15:22.114978" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:22.114893" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:22.114875" elapsed="0.000167"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:22.116977" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:22.116874" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:22.116854" elapsed="0.000197"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:22.118016" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:22.117632" elapsed="0.000410"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:22.118469" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:22.118195" elapsed="0.000298"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:22.118535" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:15:22.118679" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:22.117253" elapsed="0.001463"/>
</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-10-16T01:15:22.121430" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:22.121345" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:22.121327" elapsed="0.000167"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:22.122647" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:22.122546" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:22.122529" elapsed="0.000203"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:22.123111" 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-10-16T01:15:22.122878" elapsed="0.000258"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:22.123471" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:22.123298" elapsed="0.000197"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:22.164219" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:22.124135" elapsed="0.040264"/>
</kw>
<msg time="2026-10-16T01:15:22.164559" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:22.164618" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:22.123683" elapsed="0.040972"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:22.258177" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:22.165271" elapsed="0.093249"/>
</kw>
<msg time="2026-10-16T01:15:22.258831" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:22.258876" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:22.164845" elapsed="0.094182"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:22.259480" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:22.259153" elapsed="0.000404"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:22.259112" elapsed="0.000475"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:22.260330" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:22.259866" elapsed="0.000549"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:22.260748" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:22.260477" elapsed="0.000355"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:22.260460" elapsed="0.000396"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:22.260894" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:22.263726" 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-10-16T01:15:22.265566" elapsed="0.000571"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:22.267373" elapsed="0.000598"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:15:22.261887" elapsed="0.006159"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:22.261252" elapsed="0.006910"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:22.122291" elapsed="0.145951"/>
</kw>
<msg time="2026-10-16T01:15:22.268332" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:22.268373" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:22.121674" elapsed="0.146736"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:22.268569" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-10-16T01:15:22.268482" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:22.268464" 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-10-16T01:15:22.269066" 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-10-16T01:15:22.269400" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:22.269465" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:15:22.121049" elapsed="0.148506"/>
</kw>
<msg time="2026-10-16T01:15:22.269675" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:22.269840" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:22.119067" elapsed="0.150817"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:22.270181" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:22.269958" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:22.269941" elapsed="0.000312"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:15:22.118926" elapsed="0.151350"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:22.273097" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:22.273012" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:22.272993" elapsed="0.000167"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:22.274294" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:22.274211" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:22.274194" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:22.274841" 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-10-16T01:15:22.274538" elapsed="0.000330"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:22.275216" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:22.275034" elapsed="0.000206"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:22.332820" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:22.275935" elapsed="0.057065"/>
</kw>
<msg time="2026-10-16T01:15:22.333178" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:22.333220" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:22.275408" elapsed="0.057848"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:22.444255" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:22.333931" elapsed="0.110516"/>
</kw>
<msg time="2026-10-16T01:15:22.444636" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:22.444690" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:22.333423" elapsed="0.111342"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:22.445077" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:22.444862" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:22.444836" elapsed="0.000339"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:22.445770" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:22.445359" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:22.446126" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:22.445930" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:22.445913" elapsed="0.000305"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:22.446250" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:22.448908" elapsed="0.000478"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:15:22.450692" elapsed="0.000501"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:22.452616" elapsed="0.000374"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:15:22.447113" elapsed="0.005945"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:22.446531" elapsed="0.006644"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:22.273950" elapsed="0.179302"/>
</kw>
<msg time="2026-10-16T01:15:22.453335" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:22.453374" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:22.273309" elapsed="0.180100"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:22.453564" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-10-16T01:15:22.453479" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:22.453462" 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-10-16T01:15:22.454100" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:22.454443" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:22.454509" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:15:22.272652" elapsed="0.181964"/>
</kw>
<msg time="2026-10-16T01:15:22.454746" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:22.454799" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:22.270547" elapsed="0.184298"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:22.455137" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:22.454916" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:22.454900" elapsed="0.000308"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:15:22.270406" elapsed="0.184823"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:22.458072" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:22.457986" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:22.457969" elapsed="0.000167"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:22.459281" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:22.459197" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:22.459180" elapsed="0.000165"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:22.459787" 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-10-16T01:15:22.459488" elapsed="0.000332"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:22.460171" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:22.459996" elapsed="0.000203"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:22.497676" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:22.460866" elapsed="0.037012"/>
</kw>
<msg time="2026-10-16T01:15:22.498037" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:22.498078" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:22.460354" elapsed="0.037759"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:22.580184" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:22.498733" elapsed="0.081696"/>
</kw>
<msg time="2026-10-16T01:15:22.580738" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:22.580783" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:22.498278" elapsed="0.082540"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:22.581189" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:22.580919" elapsed="0.000348"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:22.580888" elapsed="0.000407"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:22.581997" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:22.581482" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:22.582360" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:22.582159" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:22.582142" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:22.582489" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:22.585358" 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-10-16T01:15:22.587192" elapsed="0.000499"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:22.589054" 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-10-16T01:15:22.583558" elapsed="0.005885"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:22.582957" elapsed="0.006604"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:22.458939" elapsed="0.130718"/>
</kw>
<msg time="2026-10-16T01:15:22.589826" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:22.589868" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:22.458283" elapsed="0.131622"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:22.590066" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:15:22.589977" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:22.589960" elapsed="0.000185"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:15:22.590480" 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-10-16T01:15:22.590828" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:22.590893" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:15:22.457624" elapsed="0.133360"/>
</kw>
<msg time="2026-10-16T01:15:22.591072" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:22.591113" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:22.455481" elapsed="0.135668"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:22.591442" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:22.591220" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:22.591203" elapsed="0.000312"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:15:22.455343" elapsed="0.136193"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:15:22.118772" elapsed="0.472838"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:15:22.116510" elapsed="0.475320"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:15:22.114570" elapsed="0.477323"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:22.114182" elapsed="0.477757"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:15:22.113123" elapsed="0.478871"/>
</kw>
<kw name="Create Sample Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:15:22.596109" 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-10-16T01:15:22.594938" elapsed="0.001209">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-10-16T01:15:22.112528" elapsed="0.483767">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-10-16T01:15:22.597861" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:15:22.597578" 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-10-16T01:15:22.599048" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:22.598961" elapsed="0.000131"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:22.598944" elapsed="0.000169"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:22.601110" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:22.600991" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:22.600975" elapsed="0.000201"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:22.602099" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:22.601769" elapsed="0.000356"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:22.602542" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:22.602274" elapsed="0.000292"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:22.602621" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:15:22.602763" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:22.601382" elapsed="0.001404"/>
</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-10-16T01:15:22.605326" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:22.605241" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:22.605224" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:22.606482" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:22.606399" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:22.606382" elapsed="0.000164"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:22.606961" 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-10-16T01:15:22.606724" elapsed="0.000261"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:22.607319" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:22.607147" elapsed="0.000196"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:22.645140" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:22.607943" elapsed="0.037383"/>
</kw>
<msg time="2026-10-16T01:15:22.645503" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:22.645545" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:22.607496" elapsed="0.038084"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:22.723327" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:22.646278" elapsed="0.077381"/>
</kw>
<msg time="2026-10-16T01:15:22.723971" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:22.724014" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:22.645836" elapsed="0.078214"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:22.724517" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:22.724176" elapsed="0.000438"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:22.724133" elapsed="0.000521"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:22.725365" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:22.724905" elapsed="0.000546"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:22.725788" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:22.725513" elapsed="0.000351"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:22.725496" elapsed="0.000391"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:22.725924" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:22.728802" 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-10-16T01:15:22.730742" elapsed="0.000508"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:22.732499" elapsed="0.000556"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:15:22.726926" elapsed="0.006198"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:22.726279" 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-10-16T01:15:22.606143" elapsed="0.127181"/>
</kw>
<msg time="2026-10-16T01:15:22.733414" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:22.733455" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:22.605541" elapsed="0.127951"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:22.733669" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-10-16T01:15:22.733565" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:22.733548" 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-10-16T01:15:22.734111" 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-10-16T01:15:22.734425" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:22.734490" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:15:22.604953" elapsed="0.129626"/>
</kw>
<msg time="2026-10-16T01:15:22.734688" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:22.734818" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:22.603126" elapsed="0.131730"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:22.735149" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:22.734928" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:22.734912" elapsed="0.000308"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:15:22.602988" elapsed="0.132255"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:22.737996" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:22.737910" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:22.737893" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:22.739184" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:22.739101" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:22.739084" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:22.739643" 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-10-16T01:15:22.739392" elapsed="0.000276"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:22.740030" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:22.739852" elapsed="0.000202"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:22.782069" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:22.740633" elapsed="0.041642"/>
</kw>
<msg time="2026-10-16T01:15:22.782458" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:22.782499" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:22.740207" elapsed="0.042328"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:22.869440" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:22.783303" elapsed="0.086480"/>
</kw>
<msg time="2026-10-16T01:15:22.869971" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:22.870014" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:22.782813" elapsed="0.087237"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:22.870376" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:22.870142" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:22.870114" elapsed="0.000362"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:22.871088" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:22.870728" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:22.871438" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:22.871233" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:22.871217" elapsed="0.000315"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:22.871568" elapsed="0.000060"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:22.874277" 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-10-16T01:15:22.876097" elapsed="0.000499"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:22.877937" 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-10-16T01:15:22.872516" elapsed="0.005802"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:22.871992" elapsed="0.006442"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:22.738844" elapsed="0.139671"/>
</kw>
<msg time="2026-10-16T01:15:22.878618" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:22.878661" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:22.738206" elapsed="0.140562"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:22.878931" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:15:22.878844" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:22.878827" elapsed="0.000182"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:15:22.879346" 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-10-16T01:15:22.879675" elapsed="0.000038"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:22.879758" 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-10-16T01:15:22.737571" elapsed="0.142276"/>
</kw>
<msg time="2026-10-16T01:15:22.879941" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:22.879982" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:22.735516" elapsed="0.144503"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:22.880312" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:22.880090" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:22.880074" elapsed="0.000310"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:15:22.735375" elapsed="0.145031"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:22.883171" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:22.883086" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:22.883069" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:22.884382" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:22.884298" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:22.884281" elapsed="0.000164"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:22.884864" 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-10-16T01:15:22.884602" elapsed="0.000287"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:22.885224" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:22.885049" elapsed="0.000199"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:22.922724" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:22.885843" elapsed="0.037061"/>
</kw>
<msg time="2026-10-16T01:15:22.923062" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:22.923103" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:22.885400" elapsed="0.037739"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:23.025524" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:22.923781" elapsed="0.102006"/>
</kw>
<msg time="2026-10-16T01:15:23.025980" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:23.026022" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:22.923302" elapsed="0.102755"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:23.026412" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:23.026155" elapsed="0.000332"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:23.026124" elapsed="0.000390"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:23.027124" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:23.026733" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:23.027463" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:23.027268" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:23.027252" elapsed="0.000304"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:23.027606" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:23.030231" 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-10-16T01:15:23.031996" elapsed="0.000475"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:23.033848" 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-10-16T01:15:23.028496" elapsed="0.005734"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:23.027967" elapsed="0.006380"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:22.884041" elapsed="0.150385"/>
</kw>
<msg time="2026-10-16T01:15:23.034513" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:23.034553" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:22.883425" elapsed="0.151179"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:23.034839" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:15:23.034676" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:23.034659" elapsed="0.000260"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:15:23.035305" 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-10-16T01:15:23.035627" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:23.035692" 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-10-16T01:15:22.882782" elapsed="0.153017"/>
</kw>
<msg time="2026-10-16T01:15:23.035886" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:23.035927" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:22.880689" elapsed="0.155278"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:23.036258" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:23.036037" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:23.036021" elapsed="0.000309"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:15:22.880533" elapsed="0.155819"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:15:22.602839" elapsed="0.433545"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:15:22.600680" elapsed="0.435759"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:15:22.598679" elapsed="0.437816"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:22.598271" elapsed="0.438270"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:15:22.597228" elapsed="0.439382"/>
</kw>
<kw name="Create Sample Port And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:15:23.040860" 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-10-16T01:15:23.039658" elapsed="0.001241">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-10-16T01:15:22.596672" elapsed="0.444373">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-10-16T01:15:23.042514" elapsed="0.000272"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:15:23.042272" elapsed="0.000575"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:23.043841" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:23.043753" elapsed="0.000131"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:23.043735" elapsed="0.000169"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:23.045802" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:23.045712" elapsed="0.000132"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:23.045682" elapsed="0.000183"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:23.046787" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:23.046425" elapsed="0.000387"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:23.047232" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:23.046964" elapsed="0.000292"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:23.047297" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:15:23.047423" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:23.046072" elapsed="0.001373"/>
</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-10-16T01:15:23.050085" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:23.050000" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:23.049983" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:23.051283" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:23.051168" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:23.051152" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:23.051772" 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-10-16T01:15:23.051494" elapsed="0.000303"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:23.052145" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:23.051963" elapsed="0.000206"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:23.088149" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:23.052782" elapsed="0.035542"/>
</kw>
<msg time="2026-10-16T01:15:23.088484" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:23.088526" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:23.052321" elapsed="0.036240"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:23.195196" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:23.089314" elapsed="0.106132"/>
</kw>
<msg time="2026-10-16T01:15:23.195662" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:23.195728" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:23.088832" elapsed="0.106934"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:23.196139" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:23.195868" elapsed="0.000344"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:23.195835" elapsed="0.000405"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:23.196920" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:23.196426" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:23.197309" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:23.197105" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:23.197088" elapsed="0.000316"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:23.197439" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:23.200104" elapsed="0.000493"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:15:23.201948" elapsed="0.000481"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:23.203783" 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-10-16T01:15:23.198349" elapsed="0.005818"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:23.197815" elapsed="0.006469"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:23.050905" elapsed="0.153456"/>
</kw>
<msg time="2026-10-16T01:15:23.204445" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:23.204486" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:23.050294" elapsed="0.154228"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:23.204773" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-16T01:15:23.204623" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:23.204600" 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 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-10-16T01:15:23.205182" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:23.205544" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:23.205636" 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-10-16T01:15:23.049711" elapsed="0.156310"/>
</kw>
<msg time="2026-10-16T01:15:23.206111" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:23.206152" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:23.047894" elapsed="0.158294"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:23.206477" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:23.206257" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:23.206241" elapsed="0.000308"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:15:23.047665" elapsed="0.158906"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:23.210854" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:23.210745" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:23.210722" 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-10-16T01:15:23.212074" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:23.211990" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:23.211973" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:23.212509" 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-10-16T01:15:23.212280" elapsed="0.000254"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:23.212947" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:23.212769" elapsed="0.000203"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:23.256527" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:23.213550" elapsed="0.043192"/>
</kw>
<msg time="2026-10-16T01:15:23.256911" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:23.256955" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:23.213130" elapsed="0.043862"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:23.361544" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:23.257639" elapsed="0.104249"/>
</kw>
<msg time="2026-10-16T01:15:23.362116" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:23.362159" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:23.257184" elapsed="0.105011"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:23.362647" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:23.362314" elapsed="0.000426"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:23.362277" elapsed="0.000495"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:23.363411" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:23.362963" elapsed="0.000540"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:23.363806" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:23.363564" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:23.363547" elapsed="0.000355"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:23.363938" elapsed="0.000098"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:23.366638" 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-10-16T01:15:23.368404" elapsed="0.000531"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:23.370375" 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-10-16T01:15:23.364912" elapsed="0.005887"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:23.364337" elapsed="0.006582"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:23.211722" elapsed="0.159281"/>
</kw>
<msg time="2026-10-16T01:15:23.371096" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:23.371139" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:23.211077" elapsed="0.160098"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:23.371348" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-10-16T01:15:23.371253" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:23.371234" 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-10-16T01:15:23.371910" 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-10-16T01:15:23.372235" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:23.372301" 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-10-16T01:15:23.210374" elapsed="0.162016"/>
</kw>
<msg time="2026-10-16T01:15:23.372479" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:23.372520" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:23.206927" elapsed="0.165631"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:23.372885" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:23.372644" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:23.372628" elapsed="0.000330"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:15:23.206755" elapsed="0.166225"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:23.375770" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:23.375669" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:23.375652" elapsed="0.000181"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:23.376935" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:23.376851" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:23.376834" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:23.377379" 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-10-16T01:15:23.377140" elapsed="0.000264"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:23.377778" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:23.377564" elapsed="0.000239"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:23.417418" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:23.378371" elapsed="0.039239"/>
</kw>
<msg time="2026-10-16T01:15:23.417797" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:23.417839" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:23.377955" elapsed="0.039920"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:23.510994" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:23.418459" elapsed="0.092725"/>
</kw>
<msg time="2026-10-16T01:15:23.511340" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:23.511382" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:23.418036" elapsed="0.093382"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:23.511734" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:23.511489" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:23.511470" elapsed="0.000360"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:23.512349" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:23.512011" elapsed="0.000425"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:23.512728" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:23.512496" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:23.512480" elapsed="0.000343"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:23.512855" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:23.515344" 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-10-16T01:15:23.517085" elapsed="0.000456"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:23.519026" 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-10-16T01:15:23.513658" elapsed="0.005772"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:23.513145" elapsed="0.006402"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:23.376558" elapsed="0.143095"/>
</kw>
<msg time="2026-10-16T01:15:23.519759" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:23.519801" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:23.375979" elapsed="0.143858"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:23.519992" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:15:23.519906" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:23.519890" elapsed="0.000186"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:15:23.520413" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:23.520840" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:23.520909" 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-10-16T01:15:23.375339" elapsed="0.145658"/>
</kw>
<msg time="2026-10-16T01:15:23.521081" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:23.521121" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:23.373250" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:23.521444" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:23.521225" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:23.521210" elapsed="0.000306"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:15:23.373111" elapsed="0.148477"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:15:23.047498" elapsed="0.474124"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:15:23.045391" elapsed="0.476288"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:15:23.043380" elapsed="0.478370"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:23.042991" elapsed="0.478804"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:15:23.041936" elapsed="0.479912"/>
</kw>
<kw name="Modify the destination IP of Sample Port" owner="ClusterOvsdb">
<msg time="2026-10-16T01:15:23.524758" 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-10-16T01:15:23.523548" elapsed="0.001248">Variable '${new_owner}' not found.</status>
</kw>
<doc>Modify the dst ip of existing port in Owner.</doc>
<status status="FAIL" start="2026-10-16T01:15:23.041381" elapsed="0.483566">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-10-16T01:15:23.526449" elapsed="0.000220"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:15:23.526205" 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-10-16T01:15:23.527633" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:23.527532" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:23.527515" 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-10-16T01:15:23.529658" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:23.529559" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:23.529542" elapsed="0.000197"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:23.530644" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:23.530300" elapsed="0.000370"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:23.531106" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:23.530836" elapsed="0.000294"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:23.531171" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:15:23.531297" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:23.529945" elapsed="0.001374"/>
</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-10-16T01:15:23.533928" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:23.533844" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:23.533826" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:23.535101" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:23.535018" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:23.535001" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:23.535534" 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-10-16T01:15:23.535308" elapsed="0.000250"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:23.535925" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:23.535752" elapsed="0.000198"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:23.575942" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:23.536511" elapsed="0.039612"/>
</kw>
<msg time="2026-10-16T01:15:23.576282" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:23.576323" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:23.536102" elapsed="0.040256"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:23.653751" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:23.576995" elapsed="0.076982"/>
</kw>
<msg time="2026-10-16T01:15:23.654136" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:23.654177" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:23.576522" elapsed="0.077691"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:23.654492" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:23.654285" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:23.654266" elapsed="0.000334"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:23.655144" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:23.654802" elapsed="0.000423"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:23.655483" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:23.655286" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:23.655270" elapsed="0.000323"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:23.655625" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:23.658114" elapsed="0.000488"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:15:23.659852" elapsed="0.000458"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:23.661678" 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-10-16T01:15:23.656416" elapsed="0.005654"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:23.655923" elapsed="0.006262"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:23.534760" elapsed="0.127502"/>
</kw>
<msg time="2026-10-16T01:15:23.662344" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:23.662383" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:23.534138" elapsed="0.128281"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:23.662586" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:15:23.662487" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:23.662470" elapsed="0.000195"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:15:23.663064" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:23.663364" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:23.663427" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:15:23.533522" elapsed="0.129991"/>
</kw>
<msg time="2026-10-16T01:15:23.663611" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:23.663652" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:23.531675" elapsed="0.132014"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:23.663993" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:23.663774" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:23.663758" elapsed="0.000307"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:15:23.531520" elapsed="0.132567"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:23.666738" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:23.666634" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:23.666617" elapsed="0.000187"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:23.667997" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:23.667883" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:23.667854" elapsed="0.000207"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:23.668432" 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-10-16T01:15:23.668206" elapsed="0.000251"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:23.669031" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:23.668853" elapsed="0.000202"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:23.709249" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:23.669634" elapsed="0.039794"/>
</kw>
<msg time="2026-10-16T01:15:23.709622" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:23.709664" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:23.669209" elapsed="0.040512"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:23.787048" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:23.710327" elapsed="0.076906"/>
</kw>
<msg time="2026-10-16T01:15:23.787392" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:23.787433" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:23.709890" elapsed="0.077579"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:23.787794" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:23.787544" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:23.787523" elapsed="0.000369"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:23.788413" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:23.788074" elapsed="0.000423"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:23.788845" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:23.788559" elapsed="0.000363"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:23.788542" elapsed="0.000404"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:23.788978" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:23.791494" 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-10-16T01:15:23.793249" elapsed="0.000500"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:23.795134" elapsed="0.000308"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:15:23.789825" elapsed="0.005684"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:23.789260" elapsed="0.006385"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:23.667583" elapsed="0.128156"/>
</kw>
<msg time="2026-10-16T01:15:23.795825" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:23.795865" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:23.666985" elapsed="0.128916"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:23.796056" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:15:23.795970" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:23.795953" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:15:23.796451" elapsed="0.000063"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:23.796930" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:23.796997" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:15:23.666325" elapsed="0.130760"/>
</kw>
<msg time="2026-10-16T01:15:23.797169" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:23.797209" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:23.664332" elapsed="0.132913"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:23.797533" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:23.797314" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:23.797299" elapsed="0.000322"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:15:23.664197" elapsed="0.133445"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:23.800227" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:23.800143" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:23.800125" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:23.801386" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:23.801303" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:23.801286" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:23.801852" 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-10-16T01:15:23.801603" elapsed="0.000274"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:23.802210" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:23.802038" elapsed="0.000196"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:23.840044" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:23.802847" elapsed="0.037392"/>
</kw>
<msg time="2026-10-16T01:15:23.840435" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:23.840477" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:23.802390" elapsed="0.038122"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:23.910751" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:23.841206" elapsed="0.069725"/>
</kw>
<msg time="2026-10-16T01:15:23.911084" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:23.911125" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:23.840746" elapsed="0.070415"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:23.911448" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:23.911237" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:23.911216" elapsed="0.000327"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:23.912108" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:23.911763" elapsed="0.000428"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:23.912450" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:23.912252" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:23.912235" elapsed="0.000367"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:23.912635" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:23.915162" 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-10-16T01:15:23.916902" elapsed="0.000457"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:23.918553" 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-10-16T01:15:23.913448" elapsed="0.005539"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:23.912944" elapsed="0.006161"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:23.801046" elapsed="0.118137"/>
</kw>
<msg time="2026-10-16T01:15:23.919267" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:23.919306" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:23.800436" elapsed="0.118906"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:23.919495" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:15:23.919411" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:23.919394" elapsed="0.000196"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:15:23.920126" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:23.920431" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:23.920495" 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-10-16T01:15:23.799848" elapsed="0.120751"/>
</kw>
<msg time="2026-10-16T01:15:23.920687" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:23.920744" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:23.797912" elapsed="0.122869"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:23.921069" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:23.920850" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:23.920834" elapsed="0.000306"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:15:23.797774" elapsed="0.123388"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:15:23.531372" elapsed="0.389819"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:15:23.529264" elapsed="0.391986"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:15:23.527276" elapsed="0.394027"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:23.526883" elapsed="0.394466"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:15:23.525863" elapsed="0.395540"/>
</kw>
<kw name="Verify Sample Port Is Modified" owner="ClusterOvsdb">
<msg time="2026-10-16T01:15:23.924359" 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-10-16T01:15:23.923096" elapsed="0.001301">Variable '${new_cluster_list}' not found.</status>
</kw>
<doc>Verify port is modified in all instances.</doc>
<status status="FAIL" start="2026-10-16T01:15:23.525290" elapsed="0.399249">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-10-16T01:15:23.926086" elapsed="0.000203"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:15:23.925841" elapsed="0.000498"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:23.927245" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:23.927159" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:23.927142" 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-10-16T01:15:23.929240" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:23.929157" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:23.929140" elapsed="0.000163"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:23.930217" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:23.929892" elapsed="0.000350"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:23.930683" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:23.930392" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:23.930763" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:15:23.930891" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:23.929507" elapsed="0.001406"/>
</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-10-16T01:15:23.933512" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:23.933429" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:23.933411" elapsed="0.000179"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:23.934682" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:23.934598" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:23.934580" elapsed="0.000187"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:23.935136" 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-10-16T01:15:23.934911" elapsed="0.000250"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:23.935490" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:23.935319" elapsed="0.000195"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:23.972093" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:23.936117" elapsed="0.036172"/>
</kw>
<msg time="2026-10-16T01:15:23.972449" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:23.972490" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:23.935683" elapsed="0.036842"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:24.036302" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:23.973153" elapsed="0.063439"/>
</kw>
<msg time="2026-10-16T01:15:24.036841" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:24.036884" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:23.972720" elapsed="0.064200"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:24.037350" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:24.037037" elapsed="0.000388"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:24.036998" elapsed="0.000458"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:24.038115" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:24.037667" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:24.038451" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:24.038255" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:24.038238" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:24.038599" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:24.041493" 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-10-16T01:15:24.043284" elapsed="0.000579"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:24.045219" 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-10-16T01:15:24.039525" elapsed="0.006103"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:24.038975" elapsed="0.006790"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:23.934327" elapsed="0.111520"/>
</kw>
<msg time="2026-10-16T01:15:24.045936" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:24.045976" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:23.933753" elapsed="0.112261"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:24.046172" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:15:24.046085" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:24.046068" elapsed="0.000183"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:15:24.046607" 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-10-16T01:15:24.047003" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:24.047069" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:15:23.933142" elapsed="0.114015"/>
</kw>
<msg time="2026-10-16T01:15:24.047245" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:24.047286" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:23.931248" elapsed="0.116075"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:24.047627" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:24.047393" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:24.047377" elapsed="0.000339"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:15:23.931110" elapsed="0.116630"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:24.050424" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:24.050339" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:24.050322" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:24.051605" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:24.051506" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:24.051489" elapsed="0.000178"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:24.052071" 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-10-16T01:15:24.051840" elapsed="0.000256"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:24.052433" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:24.052257" elapsed="0.000201"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:24.091583" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:24.053060" elapsed="0.038719"/>
</kw>
<msg time="2026-10-16T01:15:24.091949" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:24.091991" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:24.052624" elapsed="0.039402"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:24.159668" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:24.092628" elapsed="0.067283"/>
</kw>
<msg time="2026-10-16T01:15:24.160069" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:24.160111" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:24.092190" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:24.160418" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:24.160216" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:24.160198" elapsed="0.000314"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:24.161067" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:24.160726" elapsed="0.000417"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:24.161399" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:24.161203" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:24.161187" elapsed="0.000303"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:24.161522" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:24.164140" 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-10-16T01:15:24.165901" elapsed="0.000454"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:24.167814" 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-10-16T01:15:24.162333" elapsed="0.005864"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:24.161839" elapsed="0.006474"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:24.051251" elapsed="0.117139"/>
</kw>
<msg time="2026-10-16T01:15:24.168471" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:24.168511" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:24.050650" elapsed="0.117897"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:24.168795" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-16T01:15:24.168631" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:24.168614" elapsed="0.000261"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:15:24.169189" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:24.169483" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:24.169570" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:15:24.050034" elapsed="0.119626"/>
</kw>
<msg time="2026-10-16T01:15:24.169759" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:24.169799" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:24.048008" elapsed="0.121826"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:24.170118" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:24.169902" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:24.169887" elapsed="0.000302"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:15:24.047869" elapsed="0.122341"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:24.172821" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:24.172734" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:24.172715" elapsed="0.000169"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:24.174032" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:24.173949" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:24.173932" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:24.174460" 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-10-16T01:15:24.174238" elapsed="0.000247"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:24.174853" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:24.174664" elapsed="0.000213"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:24.211383" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:24.175464" elapsed="0.036134"/>
</kw>
<msg time="2026-10-16T01:15:24.211834" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:24.211876" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:24.175030" elapsed="0.036882"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:24.285021" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:24.212546" elapsed="0.072662"/>
</kw>
<msg time="2026-10-16T01:15:24.285370" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:24.285411" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:24.212091" elapsed="0.073355"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:24.285857" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:24.285528" elapsed="0.000409"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:24.285503" elapsed="0.000462"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:24.286494" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:24.286148" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:24.286950" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:24.286668" elapsed="0.000370"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:24.286648" elapsed="0.000414"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:24.287095" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:24.289680" 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-10-16T01:15:24.291542" elapsed="0.000577"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:24.293421" elapsed="0.000575"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:15:24.287955" elapsed="0.006112"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:24.287402" elapsed="0.006782"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:24.173669" elapsed="0.120594"/>
</kw>
<msg time="2026-10-16T01:15:24.294365" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:24.294436" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:24.173071" elapsed="0.121405"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:24.294674" elapsed="0.000050"/>
</return>
<status status="PASS" start="2026-10-16T01:15:24.294550" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:24.294532" 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-10-16T01:15:24.295155" 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-10-16T01:15:24.295510" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:24.295596" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:15:24.172407" elapsed="0.123281"/>
</kw>
<msg time="2026-10-16T01:15:24.295909" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:24.295949" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:24.170452" elapsed="0.125532"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:24.296279" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:24.296053" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:24.296037" elapsed="0.000314"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:15:24.170318" elapsed="0.126055"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:15:23.930965" elapsed="0.365439"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:15:23.928865" elapsed="0.367598"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:15:23.926905" elapsed="0.369614"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:23.926484" elapsed="0.370099"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:15:23.925458" elapsed="0.371190"/>
</kw>
<kw name="Start_Single_Member" owner="ClusterManagement">
<msg time="2026-10-16T01:15:24.298413" 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-10-16T01:15:24.296886" elapsed="0.001567">Variable '${original_owner}' not found.</status>
</kw>
<doc>Start Owner Instance and verify it is active</doc>
<status status="FAIL" start="2026-10-16T01:15:23.924983" elapsed="0.373641">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-10-16T01:15:24.300326" elapsed="0.000249"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:15:24.300024" elapsed="0.000610"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:24.301540" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:24.301454" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:24.301437" 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-10-16T01:15:24.303834" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:24.303716" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:24.303677" elapsed="0.000236"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:24.304998" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:24.304536" elapsed="0.000488"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:24.305484" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:24.305178" elapsed="0.000337"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:24.305575" elapsed="0.000035"/>
</return>
<msg time="2026-10-16T01:15:24.305756" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:24.304161" elapsed="0.001625"/>
</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-10-16T01:15:24.308442" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:24.308355" elapsed="0.000131"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:24.308338" elapsed="0.000169"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:24.309970" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:24.309884" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:24.309867" elapsed="0.000201"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:24.310519" 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-10-16T01:15:24.310219" elapsed="0.000327"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:24.311017" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:24.310798" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:24.352716" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:24.311658" elapsed="0.041344"/>
</kw>
<msg time="2026-10-16T01:15:24.353244" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:24.353288" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:24.311203" elapsed="0.042120"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:24.442472" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:24.354232" elapsed="0.088510"/>
</kw>
<msg time="2026-10-16T01:15:24.442945" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:24.442988" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:24.353629" elapsed="0.089395"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:24.443421" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:24.443138" elapsed="0.000356"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:24.443101" elapsed="0.000425"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:24.444204" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:24.443802" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:24.444543" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:24.444347" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:24.444331" elapsed="0.000322"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:24.444690" elapsed="0.000072"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:24.447401" 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-10-16T01:15:24.449261" elapsed="0.000531"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:24.451036" 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-10-16T01:15:24.445650" elapsed="0.005768"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:24.445081" elapsed="0.006452"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:24.309393" elapsed="0.142237"/>
</kw>
<msg time="2026-10-16T01:15:24.451960" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:24.452003" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:24.308737" elapsed="0.143303"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:24.452199" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-16T01:15:24.452113" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:24.452096" elapsed="0.000183"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:15:24.452661" 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-10-16T01:15:24.453073" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:24.453139" 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-10-16T01:15:24.308059" elapsed="0.145170"/>
</kw>
<msg time="2026-10-16T01:15:24.453318" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:24.453358" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:24.306147" elapsed="0.147246"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:24.453765" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:24.453462" elapsed="0.000356"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:24.453446" elapsed="0.000395"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:15:24.306007" elapsed="0.147856"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:24.458014" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:24.457928" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:24.457911" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:24.459187" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:24.459104" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:24.459087" elapsed="0.000164"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:24.459712" 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-10-16T01:15:24.459396" elapsed="0.000344"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:24.460077" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:24.459901" elapsed="0.000200"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:24.500270" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:24.460678" elapsed="0.039773"/>
</kw>
<msg time="2026-10-16T01:15:24.500913" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:24.500956" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:24.460253" elapsed="0.040738"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:24.578089" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:24.501595" elapsed="0.076802"/>
</kw>
<msg time="2026-10-16T01:15:24.578653" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:24.578725" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:24.501155" elapsed="0.077610"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:24.579216" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:24.578886" elapsed="0.000407"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:24.578849" elapsed="0.000474"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:24.580005" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:24.579514" elapsed="0.000576"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:24.580348" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:24.580151" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:24.580133" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:24.580477" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:24.583425" 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-10-16T01:15:24.585236" elapsed="0.000602"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:24.587194" 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-10-16T01:15:24.581538" elapsed="0.006053"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:24.580939" elapsed="0.006789"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:24.458846" elapsed="0.128964"/>
</kw>
<msg time="2026-10-16T01:15:24.587896" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:24.587937" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:24.458224" elapsed="0.129750"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:24.588130" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:15:24.588044" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:24.588028" elapsed="0.000181"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:15:24.588563" 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-10-16T01:15:24.588925" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:24.588990" 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-10-16T01:15:24.457611" elapsed="0.131467"/>
</kw>
<msg time="2026-10-16T01:15:24.589166" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:24.589207" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:24.454135" elapsed="0.135109"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:24.589639" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:24.589313" elapsed="0.000379"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:24.589297" elapsed="0.000436"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:15:24.453995" elapsed="0.135761"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:24.592589" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:24.592486" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:24.592469" elapsed="0.000185"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:15:24.593796" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:24.593682" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:24.593665" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:15:24.594239" 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-10-16T01:15:24.594004" elapsed="0.000261"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:15:24.594635" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:15:24.594440" elapsed="0.000220"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:15:24.632000" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:15:24.595250" elapsed="0.036939"/>
</kw>
<msg time="2026-10-16T01:15:24.632369" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:15:24.632411" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:24.594836" elapsed="0.037610"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:15:24.701200" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:24.633139" elapsed="0.068306"/>
</kw>
<msg time="2026-10-16T01:15:24.701622" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:15:24.701664" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:24.632648" elapsed="0.069080"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:24.702022" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:24.701809" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:24.701786" elapsed="0.000333"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:24.702664" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:15:24.702299" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:24.703029" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:24.702831" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:24.702815" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:15:24.703154" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:24.705666" 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-10-16T01:15:24.707397" elapsed="0.000501"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:15:24.709283" 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-10-16T01:15:24.703991" elapsed="0.005682"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:15:24.703432" elapsed="0.006378"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:15:24.593403" elapsed="0.116485"/>
</kw>
<msg time="2026-10-16T01:15:24.709971" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:24.710010" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:24.592823" elapsed="0.117223"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:15:24.710198" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:15:24.710114" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:24.710097" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:15:24.710613" 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-10-16T01:15:24.711010" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:15:24.711076" 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-10-16T01:15:24.592183" elapsed="0.118980"/>
</kw>
<msg time="2026-10-16T01:15:24.711248" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:15:24.711289" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:24.590032" elapsed="0.121293"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:24.711631" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:24.711393" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:24.711377" elapsed="0.000344"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:15:24.589889" elapsed="0.121855"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:15:24.305848" elapsed="0.405926"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:15:24.303340" elapsed="0.408491"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:15:24.301197" elapsed="0.410723"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:15:24.300800" elapsed="0.411168"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:15:24.299582" elapsed="0.412440"/>
</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-10-16T01:15:24.721038" elapsed="0.000191"/>
</kw>
<msg time="2026-10-16T01:15:24.721273" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:24.720473" elapsed="0.000848"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:15:24.720081" elapsed="0.001309"/>
</kw>
<msg time="2026-10-16T01:15:24.721430" 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-10-16T01:15:24.717218" elapsed="0.004251"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:15:24.716855" elapsed="0.004679"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:24.722018" 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-10-16T01:15:24.721787" elapsed="0.000272"/>
</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-10-16T01:15:24.725093" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:24.724675" elapsed="0.000449"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:24.725615" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:24.725303" elapsed="0.000343"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:24.725713" elapsed="0.000035"/>
</return>
<msg time="2026-10-16T01:15:24.725855" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:24.724234" elapsed="0.001644"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:15:24.726027" elapsed="0.000171"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:24.726732" 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-10-16T01:15:24.726365" elapsed="0.000400"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:24.727142" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:24.726913" elapsed="0.000253"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:24.727528" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:24.727304" elapsed="0.000272"/>
</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-10-16T01:15:24.731436" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:15:24.730859" elapsed="0.000625"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:15:24.731540" elapsed="0.000092"/>
</return>
<msg time="2026-10-16T01:15:24.731895" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:15:24.729399" elapsed="0.002564"/>
</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-10-16T01:15:24.749654" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:24.749280" elapsed="0.000435"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:15:24.751262" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:15:24.750246" elapsed="0.001101">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:24.751436" 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-10-16T01:15:24.749913" elapsed="0.001547"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:24.752089" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:24.751678" elapsed="0.000438"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:15:24.752412" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:15:24.752597" 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-10-16T01:15:24.752283" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:24.753065" 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-10-16T01:15:24.752837" elapsed="0.000270"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:24.754361" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:24.753914" elapsed="0.000489"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:15:24.754895" 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-10-16T01:15:24.754593" elapsed="0.000327"/>
</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-10-16T01:15:24.755239" 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-10-16T01:15:24.755429" 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-10-16T01:15:24.755655" elapsed="0.000027"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:15:24.755105" elapsed="0.000636"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:15:24.754973" elapsed="0.000807"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:15:24.755842" elapsed="0.000043"/>
</return>
<msg time="2026-10-16T01:15:24.756007" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:15:24.753483" elapsed="0.002548"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:24.753189" elapsed="0.002872"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:24.756234" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:24.756088" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:24.753164" elapsed="0.003142"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:15:24.756963" 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-10-16T01:15:24.756461" elapsed="0.000529"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:15:24.757035" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:15:24.748728" elapsed="0.008407"/>
</kw>
<msg time="2026-10-16T01:15:24.757185" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:24.744062" elapsed="0.013171"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:24.761284" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:24.765087" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:24.768940" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:24.769123" elapsed="0.000020"/>
</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-10-16T01:15:24.769301" 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-10-16T01:15:24.769664" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:24.769504" elapsed="0.000231"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:24.769491" 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-10-16T01:15:24.769919" 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-10-16T01:15:24.770098" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:24.770258" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:15:24.769465" elapsed="0.000841"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:15:24.769372" elapsed="0.000959"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:24.770484" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:24.770569" elapsed="0.000016"/>
</return>
<msg time="2026-10-16T01:15:24.770682" 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-10-16T01:15:24.743337" elapsed="0.027385"/>
</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-10-16T01:15:24.771968" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:24.771727" elapsed="0.000306">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:24.772119" 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-10-16T01:15:24.771319" elapsed="0.000824"/>
</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-10-16T01:15:24.772428" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:24.772208" elapsed="0.000273"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:15:24.773007" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:24.772730" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:24.772505" elapsed="0.000560"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:24.772190" elapsed="0.000896"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:24.773611" 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-10-16T01:15:24.773245" elapsed="0.000391"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:15:24.773683" elapsed="0.000045"/>
</return>
<msg time="2026-10-16T01:15:24.773830" 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-manganese/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-10-16T01:15:24.771003" elapsed="0.002850"/>
</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-10-16T01:15:24.775072" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:24.774871" elapsed="0.000261">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:24.775218" 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-10-16T01:15:24.774471" elapsed="0.000769"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:15:24.775413" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:15:24.775304" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:24.775287" elapsed="0.000204"/>
</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-10-16T01:15:24.775659" 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-10-16T01:15:24.775851" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:24.775911" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:15:24.776037" 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-manganese/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-10-16T01:15:24.774107" elapsed="0.001953"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:24.777570" 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-10-16T01:15:24.777321" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:24.778124" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:24.777892" elapsed="0.000275"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:15:24.784389" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:15:24.784462" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:15:24.784613" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:24.778476" elapsed="0.006597">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:24.778230" elapsed="0.006928">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:24.785342" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:24.785189" elapsed="0.000212"/>
</branch>
<status status="FAIL" start="2026-10-16T01:15:24.778213" elapsed="0.007210">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:24.785885" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:24.786010" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:24.785977" elapsed="0.000073"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:24.785960" elapsed="0.000110"/>
</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-10-16T01:15:24.786211" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:15:24.786275" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:15:24.776337" elapsed="0.010057">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:24.786504" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:15:24.736056" elapsed="0.050638">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:15:24.787145" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:24.786917" elapsed="0.000313"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:24.786866" elapsed="0.000405"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:24.787358" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:15:24.734152" elapsed="0.053375">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:24.732170" elapsed="0.055501">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:15:24.732152" elapsed="0.055630">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:24.788048" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:15:24.788404" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:24.788821" elapsed="0.000028"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:15:24.789217" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:15:24.789679" elapsed="0.000043"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:24.790029" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:24.790386" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:15:24.790658" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:15:24.728836" elapsed="0.061951">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:15:24.790853" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:15:24.727999" elapsed="0.062946">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:24.791167" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:24.791026" elapsed="0.000192"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:24.791375" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:24.791239" elapsed="0.000185"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:24.791616" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:24.791445" elapsed="0.000231"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:24.791010" elapsed="0.000858"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:15:24.727845" elapsed="0.064079">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:15:24.727628" elapsed="0.064352">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:24.792032" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:15:24.723634" elapsed="0.068493">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:24.792344" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:24.792588" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:24.792424" elapsed="0.000226"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:24.792409" elapsed="0.000269"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:24.792842" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:24.793014" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:24.793072" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:15:24.722938" elapsed="0.070232">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:15:24.722738" elapsed="0.070496">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:15:24.722611" elapsed="0.070674">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:15:24.722266" elapsed="0.071106">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:24.793612" elapsed="0.000028"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:15:24.713159" elapsed="0.080611">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:15:25.803205" elapsed="0.000212"/>
</kw>
<msg time="2026-10-16T01:15:25.803487" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:25.802608" elapsed="0.000959"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:15:25.802192" elapsed="0.001452"/>
</kw>
<msg time="2026-10-16T01:15:25.803686" 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-10-16T01:15:25.799227" elapsed="0.004520"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:15:25.798836" elapsed="0.004980"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:25.804292" 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-10-16T01:15:25.804059" elapsed="0.000275"/>
</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-10-16T01:15:25.807364" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:25.807025" elapsed="0.000364"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:25.807946" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:25.807644" elapsed="0.000326"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:25.808016" elapsed="0.000030"/>
</return>
<msg time="2026-10-16T01:15:25.808235" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:25.806627" elapsed="0.001632"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:15:25.808411" elapsed="0.000156"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:25.809074" 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-10-16T01:15:25.808766" elapsed="0.000333"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:25.809477" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:25.809248" elapsed="0.000253"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:25.809908" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:25.809663" elapsed="0.000269"/>
</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-10-16T01:15:25.813882" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:15:25.813192" elapsed="0.000752"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:15:25.814014" elapsed="0.000076"/>
</return>
<msg time="2026-10-16T01:15:25.814300" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:15:25.811732" elapsed="0.002643"/>
</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-10-16T01:15:25.831420" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:25.831116" elapsed="0.000330"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:15:25.832206" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:15:25.831979" elapsed="0.000310">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:25.832374" 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-10-16T01:15:25.831637" elapsed="0.000759"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:25.832995" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:25.832592" elapsed="0.000429"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:15:25.833304" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:15:25.833460" 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-10-16T01:15:25.833186" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:25.833927" 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-10-16T01:15:25.833691" elapsed="0.000277"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:25.835029" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:25.834797" elapsed="0.000273"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:15:25.835498" 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-10-16T01:15:25.835243" 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-10-16T01:15:25.835918" elapsed="0.000026"/>
</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-10-16T01:15:25.836109" 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-10-16T01:15:25.836289" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:15:25.835749" elapsed="0.000591"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:15:25.835596" elapsed="0.000773"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:15:25.836409" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:15:25.836558" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:15:25.834417" elapsed="0.002214"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:25.834028" elapsed="0.002643"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:25.836915" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:25.836720" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:25.834011" elapsed="0.002991"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:15:25.837580" 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-10-16T01:15:25.837161" elapsed="0.000445"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:15:25.837650" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:15:25.830594" elapsed="0.007179"/>
</kw>
<msg time="2026-10-16T01:15:25.837821" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:25.826242" elapsed="0.011626"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:25.841893" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:25.845768" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:25.849823" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:25.850003" elapsed="0.000020"/>
</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-10-16T01:15:25.850181" elapsed="0.000019"/>
</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-10-16T01:15:25.850519" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:25.850378" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:25.850365" elapsed="0.000260"/>
</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-10-16T01:15:25.850848" elapsed="0.000027"/>
</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-10-16T01:15:25.851048" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:25.851209" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:15:25.850339" elapsed="0.000918"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:15:25.850250" elapsed="0.001030"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:25.851428" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:25.851495" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:15:25.851636" 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-10-16T01:15:25.825535" elapsed="0.026131"/>
</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-10-16T01:15:25.852930" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:25.852717" elapsed="0.000273">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:25.853073" 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-10-16T01:15:25.852357" elapsed="0.000738"/>
</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-10-16T01:15:25.853380" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:25.853158" elapsed="0.000274"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:15:25.853996" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:25.853667" elapsed="0.000354"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:25.853455" elapsed="0.000598"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:25.853141" elapsed="0.000933"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:25.854598" 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-10-16T01:15:25.854232" elapsed="0.000396"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:15:25.854685" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:15:25.854860" 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-manganese/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-10-16T01:15:25.852051" elapsed="0.002838"/>
</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-10-16T01:15:25.856116" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:25.855886" elapsed="0.000290">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:25.856259" 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-10-16T01:15:25.855450" elapsed="0.000832"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:15:25.856637" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-10-16T01:15:25.856497" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:25.856329" 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-10-16T01:15:25.856929" elapsed="0.000020"/>
</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-10-16T01:15:25.857102" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:25.857161" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:15:25.857286" 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-manganese/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-10-16T01:15:25.855142" elapsed="0.002167"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:25.858554" 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-10-16T01:15:25.858312" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:25.859109" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:25.858878" elapsed="0.000272"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:15:25.864233" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:15:25.864289" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:15:25.864423" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:25.859436" elapsed="0.005408">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:25.859211" elapsed="0.005714">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:25.865106" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:25.864955" elapsed="0.000209"/>
</branch>
<status status="FAIL" start="2026-10-16T01:15:25.859194" elapsed="0.005991">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:25.865515" elapsed="0.000044"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:25.865678" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:25.865637" elapsed="0.000111"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:25.865617" elapsed="0.000158"/>
</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-10-16T01:15:25.865958" elapsed="0.000026"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:15:25.866039" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:15:25.857602" elapsed="0.008552">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:25.866222" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:15:25.818212" elapsed="0.048134">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:15:25.866830" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:25.866514" elapsed="0.000401"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:25.866464" elapsed="0.000490"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:25.867039" elapsed="0.000034"/>
</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="FAIL" start="2026-10-16T01:15:25.816412" elapsed="0.050790">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:25.814677" elapsed="0.052624">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:15:25.814653" elapsed="0.052719">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:25.867665" elapsed="0.000031"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:15:25.868057" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:25.868364" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:15:25.868809" elapsed="0.000026"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:15:25.869237" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:25.869573" elapsed="0.000026"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:25.870013" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:15:25.870283" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:15:25.811125" elapsed="0.059262">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:15:25.870448" elapsed="0.000014"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:15:25.810293" elapsed="0.060262">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:25.870807" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:25.870640" elapsed="0.000218"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:25.871024" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:25.870881" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:25.871237" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:25.871094" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:25.870623" elapsed="0.000681"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:15:25.810144" elapsed="0.061199">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:15:25.809975" elapsed="0.061420">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:25.871444" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:15:25.806011" elapsed="0.065542">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:25.871863" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:25.872092" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:25.871944" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:25.871929" elapsed="0.000231"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:25.872285" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:25.872451" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:25.872509" elapsed="0.000028"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:15:25.805272" elapsed="0.067376">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:15:25.805056" elapsed="0.067695">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:15:25.804934" elapsed="0.067883">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:15:25.804553" elapsed="0.068373">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:25.873137" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:15:25.794407" elapsed="0.078833">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:15:26.893085" elapsed="0.000416"/>
</kw>
<msg time="2026-10-16T01:15:26.893639" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:26.891786" elapsed="0.002002"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:15:26.890833" elapsed="0.003123"/>
</kw>
<msg time="2026-10-16T01:15:26.894047" 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-10-16T01:15:26.883728" elapsed="0.010407"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:15:26.882852" elapsed="0.011431"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:26.895344" 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-10-16T01:15:26.894825" elapsed="0.000611"/>
</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-10-16T01:15:26.902397" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:26.901618" elapsed="0.000836"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:26.903467" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:26.902839" elapsed="0.000703"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:26.903639" elapsed="0.000091"/>
</return>
<msg time="2026-10-16T01:15:26.903961" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:26.900767" elapsed="0.003244"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:15:26.904349" elapsed="0.000382"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:26.905995" 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-10-16T01:15:26.905216" elapsed="0.000836"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:26.906963" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:26.906392" elapsed="0.000624"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:26.907895" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:26.907323" elapsed="0.000625"/>
</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-10-16T01:15:26.916896" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:15:26.915427" elapsed="0.001579"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:15:26.917133" elapsed="0.000133"/>
</return>
<msg time="2026-10-16T01:15:26.917994" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:15:26.911962" elapsed="0.006167"/>
</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-10-16T01:15:26.947692" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:26.947251" elapsed="0.000497"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:15:26.948753" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:15:26.948415" elapsed="0.000442">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:26.948974" 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-10-16T01:15:26.947966" elapsed="0.001040"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:26.949799" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:26.949324" elapsed="0.000511"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:15:26.950234" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:15:26.950435" 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-10-16T01:15:26.950063" elapsed="0.000405"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:26.951087" 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-10-16T01:15:26.950771" elapsed="0.000374"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:26.954381" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:26.954053" elapsed="0.000387"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:15:26.955084" 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-10-16T01:15:26.954721" elapsed="0.000397"/>
</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-10-16T01:15:26.955530" elapsed="0.000030"/>
</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-10-16T01:15:26.955819" elapsed="0.000040"/>
</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-10-16T01:15:26.956100" elapsed="0.000027"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:15:26.955334" elapsed="0.000838"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:15:26.955179" elapsed="0.001033"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:15:26.956268" elapsed="0.000036"/>
</return>
<msg time="2026-10-16T01:15:26.956449" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:15:26.953550" elapsed="0.002931"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:26.951230" elapsed="0.005311"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:26.956801" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:26.956577" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:26.951206" elapsed="0.005681"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:15:26.957437" 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-10-16T01:15:26.957042" elapsed="0.000421"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:15:26.957519" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:15:26.946526" elapsed="0.011094"/>
</kw>
<msg time="2026-10-16T01:15:26.957668" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:26.940443" elapsed="0.017286"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:26.961546" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:26.965369" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:26.969438" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:26.969677" elapsed="0.000037"/>
</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-10-16T01:15:26.969878" elapsed="0.000019"/>
</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-10-16T01:15:26.970218" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:26.970078" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:26.970064" elapsed="0.000227"/>
</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-10-16T01:15:26.970443" elapsed="0.000019"/>
</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-10-16T01:15:26.970630" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:26.970807" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:15:26.970038" elapsed="0.000819"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:15:26.969947" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:26.971028" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:26.971095" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:15:26.971200" 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-10-16T01:15:26.939536" elapsed="0.031687"/>
</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-10-16T01:15:26.972340" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:26.972139" elapsed="0.000263">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:26.972486" 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-10-16T01:15:26.971814" elapsed="0.000708"/>
</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-10-16T01:15:26.972821" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:26.972586" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:15:26.973321" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:26.973056" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:26.972897" elapsed="0.000480"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:26.972570" elapsed="0.000826"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:26.974010" 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-10-16T01:15:26.973584" elapsed="0.000451"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:15:26.974080" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:15:26.974204" 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-manganese/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-10-16T01:15:26.971482" elapsed="0.002745"/>
</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-10-16T01:15:26.975318" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:26.975128" elapsed="0.000249">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:26.975460" 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-10-16T01:15:26.974807" elapsed="0.000676"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:15:26.975715" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-10-16T01:15:26.975595" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:26.975577" elapsed="0.000219"/>
</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-10-16T01:15:26.975947" elapsed="0.000020"/>
</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-10-16T01:15:26.976119" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:26.976179" elapsed="0.034907"/>
</return>
<msg time="2026-10-16T01:15:27.011357" 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-manganese/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-10-16T01:15:26.974471" elapsed="0.036915"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:27.012870" 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-10-16T01:15:27.012563" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:27.013350" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:27.013130" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:15:27.018239" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:15:27.018292" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:15:27.018411" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:27.013740" elapsed="0.005097">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:27.013460" elapsed="0.005458">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:27.019101" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:27.018950" elapsed="0.000211"/>
</branch>
<status status="FAIL" start="2026-10-16T01:15:27.013439" elapsed="0.005744">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:27.019546" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:27.019670" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:27.019635" elapsed="0.000091"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:27.019619" elapsed="0.000129"/>
</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-10-16T01:15:27.019892" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:15:27.019954" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:15:27.011775" elapsed="0.008282">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:27.020124" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:15:26.926686" elapsed="0.093598">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:15:27.020721" elapsed="0.000077"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:27.020456" elapsed="0.000409"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:27.020406" elapsed="0.000500"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:27.020995" elapsed="0.000037"/>
</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="FAIL" start="2026-10-16T01:15:26.922879" elapsed="0.098286">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:26.918623" elapsed="0.102644">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:15:26.918570" elapsed="0.102771">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:27.021627" elapsed="0.000026"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:15:27.022013" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:27.022331" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:15:27.022765" elapsed="0.000027"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:15:27.023288" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:27.023649" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:27.024029" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:15:27.024273" elapsed="0.000019"/>
</return>
<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="FAIL" start="2026-10-16T01:15:26.910610" elapsed="0.113771">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:15:27.024446" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:15:26.908802" elapsed="0.115752">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:27.024810" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:27.024642" elapsed="0.000219"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:27.025022" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:27.024884" elapsed="0.000187"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:27.025235" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:27.025092" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:27.024624" elapsed="0.000679"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:15:26.908420" elapsed="0.116923">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:15:26.908042" elapsed="0.117357">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:27.025452" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:15:26.899303" elapsed="0.126253">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:27.025842" elapsed="0.000066"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:27.026114" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:27.025972" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:27.025956" elapsed="0.000226"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:27.026308" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:27.026476" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:27.026548" elapsed="0.000015"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:15:26.897669" elapsed="0.128974">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:15:26.897193" elapsed="0.129587">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:15:26.896933" elapsed="0.129901">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:15:26.896051" elapsed="0.130869">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:27.027137" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:15:26.874152" elapsed="0.153092">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:15:28.049221" elapsed="0.000544"/>
</kw>
<msg time="2026-10-16T01:15:28.049896" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:28.047838" elapsed="0.002184"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:15:28.046802" elapsed="0.003381"/>
</kw>
<msg time="2026-10-16T01:15:28.050274" 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-10-16T01:15:28.038997" elapsed="0.011369"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:15:28.037995" elapsed="0.012554"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:28.051764" 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-10-16T01:15:28.051133" elapsed="0.000753"/>
</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-10-16T01:15:28.059256" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:28.058375" elapsed="0.000939"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:28.060436" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:28.059777" elapsed="0.000741"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:28.060644" elapsed="0.000116"/>
</return>
<msg time="2026-10-16T01:15:28.061023" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:28.057433" elapsed="0.003641"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:15:28.061408" elapsed="0.000421"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:28.063170" 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-10-16T01:15:28.062213" elapsed="0.001019"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:28.064291" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:28.063646" elapsed="0.000700"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:28.065298" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:28.064787" elapsed="0.000564"/>
</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-10-16T01:15:28.074469" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:15:28.073545" elapsed="0.001028"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:15:28.074684" elapsed="0.000139"/>
</return>
<msg time="2026-10-16T01:15:28.075104" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:15:28.070060" elapsed="0.005123"/>
</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-10-16T01:15:28.099899" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:28.099345" elapsed="0.000593"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:15:28.101021" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:15:28.100673" elapsed="0.000452">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:28.101246" 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-10-16T01:15:28.100161" elapsed="0.001117"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:28.102065" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:28.101553" elapsed="0.000548"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:15:28.102523" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:15:28.102794" 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-10-16T01:15:28.102335" elapsed="0.000493"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:28.103416" 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-10-16T01:15:28.103102" elapsed="0.000373"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:28.104961" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:28.104546" elapsed="0.000473"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:15:28.105675" 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-10-16T01:15:28.105263" elapsed="0.000481"/>
</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-10-16T01:15:28.106174" elapsed="0.000028"/>
</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-10-16T01:15:28.106430" 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-10-16T01:15:28.106772" elapsed="0.000030"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:15:28.105990" elapsed="0.000858"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:15:28.105819" elapsed="0.001070"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:15:28.106949" elapsed="0.000039"/>
</return>
<msg time="2026-10-16T01:15:28.107137" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:15:28.104042" elapsed="0.003128"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:28.103605" elapsed="0.003605"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:28.107446" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:28.107245" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:28.103573" elapsed="0.004013"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:15:28.108437" 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-10-16T01:15:28.107883" elapsed="0.000695"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:15:28.108661" elapsed="0.000070"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:15:28.098591" elapsed="0.010251"/>
</kw>
<msg time="2026-10-16T01:15:28.108911" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:28.092260" elapsed="0.016719"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:28.114693" elapsed="0.000039"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:28.119027" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:28.123160" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:28.123347" elapsed="0.000020"/>
</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-10-16T01:15:28.123558" 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-10-16T01:15:28.124003" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:28.123848" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:28.123830" 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-10-16T01:15:28.124231" elapsed="0.000019"/>
</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-10-16T01:15:28.124405" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:28.124607" elapsed="0.000025"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:15:28.123794" elapsed="0.000877"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:15:28.123648" elapsed="0.001081"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:28.124891" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:28.124959" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:15:28.125068" 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-10-16T01:15:28.091299" elapsed="0.033793"/>
</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-10-16T01:15:28.126328" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:28.126122" elapsed="0.000274">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:28.126493" 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-10-16T01:15:28.125789" elapsed="0.000729"/>
</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-10-16T01:15:28.126814" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:28.126582" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:15:28.127330" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:28.127066" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:28.126889" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:28.126565" elapsed="0.000842"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:28.128006" 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-10-16T01:15:28.127601" elapsed="0.000430"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:15:28.128077" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:15:28.128203" 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-manganese/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-10-16T01:15:28.125360" elapsed="0.002866"/>
</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-10-16T01:15:28.129385" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:28.129193" elapsed="0.000251">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:28.129556" 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-10-16T01:15:28.128873" elapsed="0.000712"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:15:28.129792" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:15:28.129668" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:28.129646" elapsed="0.000223"/>
</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-10-16T01:15:28.130021" elapsed="0.000019"/>
</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-10-16T01:15:28.130192" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:28.130252" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:15:28.130377" 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-manganese/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-10-16T01:15:28.128472" elapsed="0.001928"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:28.131711" 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-10-16T01:15:28.131410" elapsed="0.000357"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:28.132192" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:28.131966" elapsed="0.000266"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:15:28.137998" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:15:28.138057" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:15:28.138161" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:28.132546" elapsed="0.006030">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:28.132292" elapsed="0.006448">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:28.138935" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:28.138776" elapsed="0.000218"/>
</branch>
<status status="FAIL" start="2026-10-16T01:15:28.132275" elapsed="0.006742">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:28.139366" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:28.139507" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:28.139456" elapsed="0.000103"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:28.139439" elapsed="0.000146"/>
</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-10-16T01:15:28.139764" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:15:28.139832" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:15:28.130693" elapsed="0.009244">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:28.140006" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:15:28.080939" elapsed="0.059213">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:15:28.140580" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:28.140323" elapsed="0.000360"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:28.140275" elapsed="0.000489"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:28.140863" elapsed="0.000037"/>
</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="FAIL" start="2026-10-16T01:15:28.078478" elapsed="0.062556">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:28.075498" elapsed="0.065639">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:15:28.075452" elapsed="0.065762">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:28.141468" elapsed="0.000042"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:15:28.141924" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:28.142241" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:15:28.142608" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:15:28.143078" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:28.143394" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:28.143831" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:15:28.144074" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:15:28.068476" elapsed="0.075704">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:15:28.144277" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:15:28.066838" elapsed="0.077534">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:28.144648" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:28.144454" 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="NOT RUN" start="2026-10-16T01:15:28.144902" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:28.144758" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:28.145120" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:28.144974" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:28.144438" elapsed="0.000751"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:15:28.066356" elapsed="0.078872">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:15:28.065456" elapsed="0.079829">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:28.145336" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:15:28.055921" elapsed="0.089509">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:28.145659" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:28.146004" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:28.145857" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:28.145837" elapsed="0.000236"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:28.146198" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:28.146367" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:28.146424" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:15:28.054098" elapsed="0.092445">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:15:28.053553" elapsed="0.093075">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:15:28.053262" elapsed="0.093430">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:15:28.052366" elapsed="0.094504">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:28.147098" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:15:28.028345" elapsed="0.118861">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:15:29.166372" elapsed="0.000464"/>
</kw>
<msg time="2026-10-16T01:15:29.166953" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:29.164878" elapsed="0.002337"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:15:29.163880" elapsed="0.003537"/>
</kw>
<msg time="2026-10-16T01:15:29.167537" 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-10-16T01:15:29.156939" elapsed="0.010705"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:15:29.156072" elapsed="0.011804"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:29.169096" 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-10-16T01:15:29.168423" elapsed="0.000797"/>
</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-10-16T01:15:29.176450" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:29.175684" elapsed="0.000846"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:29.177508" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:29.176891" elapsed="0.000672"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:29.177659" elapsed="0.000090"/>
</return>
<msg time="2026-10-16T01:15:29.177977" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:29.174888" elapsed="0.003138"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:15:29.178351" elapsed="0.000308"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:29.179761" 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-10-16T01:15:29.179054" elapsed="0.000764"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:29.180657" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:29.180139" elapsed="0.000597"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:29.181558" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:29.181045" elapsed="0.000566"/>
</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-10-16T01:15:29.190515" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:15:29.189028" elapsed="0.001642"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:15:29.190959" elapsed="0.000139"/>
</return>
<msg time="2026-10-16T01:15:29.191542" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:15:29.185765" elapsed="0.005902"/>
</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-10-16T01:15:29.221894" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:29.221398" elapsed="0.000541"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:15:29.223132" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:15:29.222767" elapsed="0.000473">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:29.223362" 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-10-16T01:15:29.222169" elapsed="0.001224"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:29.224108" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:29.223650" elapsed="0.000494"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:15:29.224611" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:15:29.224934" 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-10-16T01:15:29.224420" elapsed="0.000547"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:29.225572" 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-10-16T01:15:29.225239" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:29.226967" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:29.226612" elapsed="0.000411"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:15:29.227885" 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-10-16T01:15:29.227264" elapsed="0.000656"/>
</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-10-16T01:15:29.228344" elapsed="0.000029"/>
</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-10-16T01:15:29.228624" 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-10-16T01:15:29.228901" elapsed="0.000027"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:15:29.228161" elapsed="0.000813"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:15:29.227992" elapsed="0.001026"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:15:29.229080" elapsed="0.000043"/>
</return>
<msg time="2026-10-16T01:15:29.229275" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:15:29.226126" elapsed="0.003181"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:29.225756" elapsed="0.003591"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:29.229605" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:29.229382" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:29.225723" elapsed="0.003999"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:15:29.230580" 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-10-16T01:15:29.229942" elapsed="0.000675"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:15:29.230678" elapsed="0.000058"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:15:29.220675" elapsed="0.010165"/>
</kw>
<msg time="2026-10-16T01:15:29.230907" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:29.214813" elapsed="0.016159"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:29.235311" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:29.239262" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:29.243050" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:29.243261" 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-10-16T01:15:29.243442" 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-10-16T01:15:29.243818" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:29.243659" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:29.243646" 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-10-16T01:15:29.244047" elapsed="0.000018"/>
</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-10-16T01:15:29.244223" elapsed="0.000018"/>
</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-10-16T01:15:29.244382" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:15:29.243620" elapsed="0.000811"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:15:29.243529" elapsed="0.000925"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:29.244620" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:29.244688" elapsed="0.000028"/>
</return>
<msg time="2026-10-16T01:15:29.244808" 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-10-16T01:15:29.213652" elapsed="0.031180"/>
</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-10-16T01:15:29.245947" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:29.245753" elapsed="0.000254">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:29.246089" 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-10-16T01:15:29.245402" elapsed="0.000710"/>
</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-10-16T01:15:29.246391" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:29.246175" elapsed="0.000268"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:15:29.246939" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:29.246657" elapsed="0.000307"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:29.246479" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:29.246158" elapsed="0.000858"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:29.247523" 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-10-16T01:15:29.247174" elapsed="0.000373"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:15:29.247592" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:15:29.247732" 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-manganese/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-10-16T01:15:29.245106" elapsed="0.002650"/>
</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-10-16T01:15:29.248840" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:29.248633" elapsed="0.000266">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:29.248982" 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-10-16T01:15:29.248302" elapsed="0.000703"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:15:29.249168" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:15:29.249069" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:29.249051" elapsed="0.000195"/>
</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-10-16T01:15:29.249397" elapsed="0.000020"/>
</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-10-16T01:15:29.249621" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:29.249684" elapsed="0.000029"/>
</return>
<msg time="2026-10-16T01:15:29.249825" 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-manganese/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-10-16T01:15:29.248006" elapsed="0.001843"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:29.251245" 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-10-16T01:15:29.251019" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:29.251717" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:29.251484" elapsed="0.000274"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:15:29.256362" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:15:29.256418" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:15:29.256533" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:29.252044" elapsed="0.004889">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:29.251819" elapsed="0.005197">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:29.257198" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:29.257047" elapsed="0.000210"/>
</branch>
<status status="FAIL" start="2026-10-16T01:15:29.251802" elapsed="0.005476">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:29.257640" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:29.257778" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:29.257744" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:29.257727" elapsed="0.000108"/>
</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-10-16T01:15:29.257972" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:15:29.258034" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:15:29.250292" elapsed="0.007844">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:29.258202" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:15:29.199816" elapsed="0.058531">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:15:29.258777" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:29.258530" elapsed="0.000331"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:29.258480" elapsed="0.000426"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:29.258994" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:15:29.196244" elapsed="0.062948">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:29.192214" elapsed="0.067080">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:15:29.192170" elapsed="0.067198">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:29.259636" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:15:29.260005" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:29.260319" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:15:29.260687" elapsed="0.000050"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:15:29.261151" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:29.261482" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:29.261865" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:15:29.262118" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:15:29.184091" elapsed="0.078130">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:15:29.262286" elapsed="0.000014"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:15:29.182418" elapsed="0.079957">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:29.262629" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:29.262487" elapsed="0.000193"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:29.262866" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:29.262727" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:29.263080" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:29.262938" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:29.262456" elapsed="0.000692"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:15:29.182095" elapsed="0.081091">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:15:29.181729" elapsed="0.081512">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:29.263289" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:15:29.173417" elapsed="0.089965">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:29.263575" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:29.263879" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:29.263654" elapsed="0.000278"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:29.263638" elapsed="0.000316"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:29.264114" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:29.264290" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:29.264349" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:15:29.171633" elapsed="0.092811">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:15:29.171067" elapsed="0.093458">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:15:29.170811" elapsed="0.093765">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:15:29.169846" elapsed="0.094816">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:29.264951" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:15:29.148103" elapsed="0.116955">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:15:30.283325" elapsed="0.000463"/>
</kw>
<msg time="2026-10-16T01:15:30.283892" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:30.282060" elapsed="0.001937"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:15:30.281128" elapsed="0.003024"/>
</kw>
<msg time="2026-10-16T01:15:30.284243" 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-10-16T01:15:30.274655" elapsed="0.009678"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:15:30.273818" elapsed="0.010685"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:30.285567" 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-10-16T01:15:30.285036" elapsed="0.000624"/>
</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-10-16T01:15:30.292279" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:30.291496" elapsed="0.000839"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:30.293329" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:30.292694" elapsed="0.000687"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:30.293494" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:15:30.293814" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:30.290539" elapsed="0.003328"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:15:30.294198" elapsed="0.000308"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:30.295597" 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-10-16T01:15:30.294906" elapsed="0.000746"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:30.296536" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:30.296011" elapsed="0.000579"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:30.297542" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:30.296927" elapsed="0.000670"/>
</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-10-16T01:15:30.306258" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:15:30.304862" elapsed="0.001504"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:15:30.306517" elapsed="0.000138"/>
</return>
<msg time="2026-10-16T01:15:30.307131" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:15:30.301553" elapsed="0.005702"/>
</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-10-16T01:15:30.333306" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:30.332879" elapsed="0.000462"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:15:30.334323" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:15:30.334047" elapsed="0.000361">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:30.334545" 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-10-16T01:15:30.333579" elapsed="0.000997"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:30.335269" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:30.334838" elapsed="0.000467"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:15:30.335728" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:15:30.335976" 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-10-16T01:15:30.335549" elapsed="0.000462"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:30.336614" 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-10-16T01:15:30.336280" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:30.339790" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:30.339427" elapsed="0.000422"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:15:30.340475" 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-10-16T01:15:30.340103" elapsed="0.000407"/>
</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-10-16T01:15:30.340929" elapsed="0.000028"/>
</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-10-16T01:15:30.341180" 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-10-16T01:15:30.341455" elapsed="0.000028"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:15:30.340744" elapsed="0.000783"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:15:30.340572" elapsed="0.000993"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:15:30.341621" elapsed="0.000037"/>
</return>
<msg time="2026-10-16T01:15:30.341822" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:15:30.338928" elapsed="0.002927"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:30.338554" elapsed="0.003341"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:30.342135" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:30.341927" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:30.336757" elapsed="0.005476"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:15:30.343039" 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-10-16T01:15:30.342479" elapsed="0.000596"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:15:30.343136" elapsed="0.000038"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:15:30.332147" elapsed="0.011130"/>
</kw>
<msg time="2026-10-16T01:15:30.343391" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:30.326393" elapsed="0.017088"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:30.348794" elapsed="0.000036"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:30.354116" elapsed="0.000035"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:30.358744" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:30.358922" elapsed="0.000020"/>
</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-10-16T01:15:30.359099" elapsed="0.000019"/>
</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-10-16T01:15:30.359434" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:30.359295" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:30.359282" 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-10-16T01:15:30.359676" elapsed="0.000034"/>
</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-10-16T01:15:30.359869" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:30.360029" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:15:30.359256" elapsed="0.000820"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:15:30.359167" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:30.360247" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:30.360371" elapsed="0.000017"/>
</return>
<msg time="2026-10-16T01:15:30.360495" 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-10-16T01:15:30.325544" elapsed="0.034976"/>
</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-10-16T01:15:30.361628" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:30.361423" elapsed="0.000264">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:30.361823" 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-10-16T01:15:30.361101" 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-10-16T01:15:30.362129" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:30.361910" elapsed="0.000270"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:15:30.362648" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:30.362361" elapsed="0.000312"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:30.362203" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:30.361894" elapsed="0.000850"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:30.363240" 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-10-16T01:15:30.362902" elapsed="0.000363"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:15:30.363311" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:15:30.363434" 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-manganese/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-10-16T01:15:30.360805" elapsed="0.002666"/>
</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-10-16T01:15:30.364546" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:30.364345" elapsed="0.000260">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:30.364687" 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-10-16T01:15:30.364026" elapsed="0.000699"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:15:30.365055" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:15:30.364951" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:30.364773" elapsed="0.000360"/>
</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-10-16T01:15:30.365282" elapsed="0.000020"/>
</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-10-16T01:15:30.365478" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:30.365542" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:15:30.365667" 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-manganese/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-10-16T01:15:30.363729" elapsed="0.001962"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:30.366931" 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-10-16T01:15:30.366689" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:30.367377" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:30.367159" elapsed="0.000259"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:15:30.371854" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:15:30.371909" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:15:30.372010" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:30.367730" elapsed="0.004611">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:30.367492" elapsed="0.004925">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:30.372612" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:30.372460" elapsed="0.000255"/>
</branch>
<status status="FAIL" start="2026-10-16T01:15:30.367475" elapsed="0.005267">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:30.373072" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:30.373191" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:30.373158" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:30.373142" elapsed="0.000107"/>
</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-10-16T01:15:30.373383" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:15:30.373460" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:15:30.365979" elapsed="0.007585">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:30.373632" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:15:30.315292" elapsed="0.058480">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:15:30.374153" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:30.373939" elapsed="0.000295"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:30.373892" elapsed="0.000383"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:30.374357" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:15:30.311822" elapsed="0.062712">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:30.307974" elapsed="0.066660">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:15:30.307698" elapsed="0.067032">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:30.374978" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:15:30.375317" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:30.375640" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:15:30.376005" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:15:30.376426" elapsed="0.000036"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:30.376779" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:30.377121" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:15:30.377355" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:15:30.300224" elapsed="0.077244">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:15:30.377531" elapsed="0.000014"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:15:30.298426" elapsed="0.079193">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:30.377933" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:30.377792" elapsed="0.000191"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:30.378140" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:30.378005" elapsed="0.000183"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:30.378349" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:30.378210" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:30.377774" elapsed="0.000644"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:15:30.298098" elapsed="0.080370">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:15:30.297693" elapsed="0.080828">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:30.378569" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:15:30.289172" elapsed="0.089488">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:30.378924" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:30.379144" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:30.379004" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:30.378988" elapsed="0.000224"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:30.379336" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:30.379515" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:30.379574" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:15:30.287583" elapsed="0.092083">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:15:30.287131" elapsed="0.092649">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:15:30.286902" elapsed="0.092929">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:15:30.286123" elapsed="0.093793">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:30.380124" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:15:30.265620" elapsed="0.114609">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:15:31.398831" elapsed="0.000395"/>
</kw>
<msg time="2026-10-16T01:15:31.399329" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:31.397411" elapsed="0.002052"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:15:31.396490" elapsed="0.003132"/>
</kw>
<msg time="2026-10-16T01:15:31.399832" 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-10-16T01:15:31.389968" elapsed="0.009963"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:15:31.389096" elapsed="0.010989"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:31.401135" 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-10-16T01:15:31.400567" elapsed="0.000661"/>
</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-10-16T01:15:31.407834" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:31.407029" elapsed="0.000864"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:31.408902" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:31.408229" elapsed="0.000728"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:31.409052" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:15:31.409341" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:31.406185" elapsed="0.003209"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:15:31.409779" elapsed="0.000291"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:31.411174" 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-10-16T01:15:31.410463" elapsed="0.000767"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:31.412137" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:31.411585" elapsed="0.000606"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:31.413073" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:31.412526" elapsed="0.000602"/>
</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-10-16T01:15:31.421862" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:15:31.420408" elapsed="0.001564"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:15:31.422102" elapsed="0.000132"/>
</return>
<msg time="2026-10-16T01:15:31.422685" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:15:31.417166" elapsed="0.005895"/>
</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-10-16T01:15:31.447357" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:31.446930" elapsed="0.000464"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:15:31.448353" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:15:31.448090" elapsed="0.000367">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:31.448578" 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-10-16T01:15:31.447626" elapsed="0.000984"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:31.449304" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:31.448866" elapsed="0.000474"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:15:31.449772" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:15:31.449951" 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-10-16T01:15:31.449586" elapsed="0.000399"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:31.450632" 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-10-16T01:15:31.450249" elapsed="0.000444"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:31.452173" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:31.451636" elapsed="0.000596"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:15:31.452871" 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-10-16T01:15:31.452493" elapsed="0.000413"/>
</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-10-16T01:15:31.453303" elapsed="0.000029"/>
</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-10-16T01:15:31.453578" elapsed="0.000032"/>
</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-10-16T01:15:31.453851" elapsed="0.000028"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:15:31.453122" elapsed="0.000803"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:15:31.452967" elapsed="0.000997"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:15:31.454020" elapsed="0.000038"/>
</return>
<msg time="2026-10-16T01:15:31.454205" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:15:31.451148" elapsed="0.003090"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:31.450802" elapsed="0.003477"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:31.454530" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:31.454313" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:31.450777" elapsed="0.003853"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:15:31.455399" 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-10-16T01:15:31.454868" elapsed="0.000583"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:15:31.455515" elapsed="0.000037"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:15:31.446186" elapsed="0.009470"/>
</kw>
<msg time="2026-10-16T01:15:31.455743" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:31.440419" elapsed="0.015391"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:31.461090" elapsed="0.000036"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:31.466386" elapsed="0.000048"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:31.470949" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:31.471126" elapsed="0.000019"/>
</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-10-16T01:15:31.471301" 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-10-16T01:15:31.471691" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:31.471512" elapsed="0.000248"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:31.471498" elapsed="0.000285"/>
</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-10-16T01:15:31.471939" 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-10-16T01:15:31.472117" elapsed="0.000018"/>
</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-10-16T01:15:31.472276" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:15:31.471472" elapsed="0.000852"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:15:31.471369" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:31.472510" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:31.472579" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:15:31.472683" 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-10-16T01:15:31.439557" elapsed="0.033170"/>
</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-10-16T01:15:31.473825" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:31.473615" elapsed="0.000269">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:31.473966" 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-10-16T01:15:31.473284" elapsed="0.000704"/>
</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-10-16T01:15:31.474265" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:31.474051" elapsed="0.000266"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:15:31.474790" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:31.474509" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:31.474340" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:31.474034" elapsed="0.000836"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:31.475361" 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-10-16T01:15:31.475026" elapsed="0.000359"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:15:31.475445" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:15:31.475570" 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-manganese/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-10-16T01:15:31.472989" elapsed="0.002604"/>
</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-10-16T01:15:31.476668" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:31.476478" elapsed="0.000264">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:31.476826" 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-10-16T01:15:31.476147" elapsed="0.000702"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:15:31.477010" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:15:31.476912" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:31.476896" elapsed="0.000190"/>
</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-10-16T01:15:31.477236" elapsed="0.000020"/>
</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-10-16T01:15:31.477405" elapsed="0.000031"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:31.477479" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:15:31.477603" 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-manganese/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-10-16T01:15:31.475852" elapsed="0.001807"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:31.479068" 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-10-16T01:15:31.478841" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:31.479528" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:31.479295" elapsed="0.000273"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:15:31.483940" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:15:31.483991" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:15:31.484089" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:31.479867" elapsed="0.004566">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:31.479628" elapsed="0.004883">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:31.484692" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:31.484542" elapsed="0.000227"/>
</branch>
<status status="FAIL" start="2026-10-16T01:15:31.479612" elapsed="0.005179">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:31.485124" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:31.485242" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:31.485210" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:31.485194" elapsed="0.000106"/>
</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-10-16T01:15:31.485450" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:15:31.485514" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:15:31.478114" elapsed="0.007502">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:31.485683" elapsed="0.000030"/>
</return>
<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="FAIL" start="2026-10-16T01:15:31.429852" elapsed="0.055975">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:15:31.486207" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:31.485993" elapsed="0.000295"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:31.485946" elapsed="0.000382"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:31.486410" elapsed="0.000049"/>
</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="FAIL" start="2026-10-16T01:15:31.427417" elapsed="0.059170">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:31.423536" elapsed="0.063206">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:15:31.423495" elapsed="0.063325">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:31.487067" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:15:31.487410" elapsed="0.000032"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:31.487749" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:15:31.488094" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:15:31.488527" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:31.488865" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:31.489210" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:15:31.489458" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:15:31.415843" elapsed="0.073717">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:15:31.489622" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:15:31.413990" elapsed="0.075760">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:31.489974" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:31.489833" elapsed="0.000192"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:31.490182" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:31.490047" elapsed="0.000184"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:31.490392" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:31.490253" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:31.489817" elapsed="0.000659"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:15:31.413622" elapsed="0.076892">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:15:31.413223" elapsed="0.077343">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:31.490614" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:15:31.404819" elapsed="0.085912">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:31.490909" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:31.491126" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:31.490986" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:31.490971" elapsed="0.000222"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:31.491317" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:31.491496" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:31.491555" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:15:31.403192" elapsed="0.088489">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:15:31.402756" elapsed="0.089107">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:15:31.402488" elapsed="0.089425">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:15:31.401689" elapsed="0.090308">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:31.492211" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:15:31.380858" elapsed="0.111459">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:15:32.510854" elapsed="0.000391"/>
</kw>
<msg time="2026-10-16T01:15:32.511348" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:32.509586" elapsed="0.001891"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:15:32.508651" elapsed="0.002986"/>
</kw>
<msg time="2026-10-16T01:15:32.511761" 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-10-16T01:15:32.502003" elapsed="0.009852"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:15:32.501135" elapsed="0.010872"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:32.513039" 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-10-16T01:15:32.512490" elapsed="0.000643"/>
</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-10-16T01:15:32.519729" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:32.518947" elapsed="0.000843"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:32.520795" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:32.520125" elapsed="0.000725"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:32.520943" elapsed="0.000060"/>
</return>
<msg time="2026-10-16T01:15:32.521231" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:32.518112" elapsed="0.003170"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:15:32.521635" elapsed="0.000315"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:32.523043" 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-10-16T01:15:32.522318" elapsed="0.000781"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:32.523991" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:32.523448" elapsed="0.000597"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:32.524908" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:32.524353" elapsed="0.000608"/>
</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-10-16T01:15:32.533557" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:15:32.532175" elapsed="0.001638"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:15:32.533951" elapsed="0.000135"/>
</return>
<msg time="2026-10-16T01:15:32.534540" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:15:32.528966" elapsed="0.005703"/>
</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-10-16T01:15:32.559198" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:32.558769" elapsed="0.000467"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:15:32.560196" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:15:32.559928" elapsed="0.000356">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:32.560420" 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-10-16T01:15:32.559466" elapsed="0.000989"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:32.561146" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:32.560690" elapsed="0.000492"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:15:32.561576" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:15:32.561772" 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-10-16T01:15:32.561422" elapsed="0.000384"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:32.562375" 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-10-16T01:15:32.562068" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:32.563926" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:32.563372" elapsed="0.000614"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:15:32.564632" 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-10-16T01:15:32.564227" elapsed="0.000440"/>
</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-10-16T01:15:32.565082" elapsed="0.000030"/>
</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-10-16T01:15:32.565339" elapsed="0.000032"/>
</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-10-16T01:15:32.565609" elapsed="0.000027"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:15:32.564903" elapsed="0.000779"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:15:32.564750" elapsed="0.000994"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:15:32.565803" elapsed="0.000037"/>
</return>
<msg time="2026-10-16T01:15:32.565991" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:15:32.562905" elapsed="0.003119"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:32.562536" elapsed="0.003528"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:32.566297" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:32.566097" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:32.562513" elapsed="0.003882"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:15:32.567176" 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-10-16T01:15:32.566624" elapsed="0.000587"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:15:32.567273" elapsed="0.000037"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:15:32.558033" elapsed="0.009393"/>
</kw>
<msg time="2026-10-16T01:15:32.567545" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:32.552354" elapsed="0.015260"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:32.572936" elapsed="0.000035"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:32.578229" elapsed="0.000034"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:32.582829" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:32.583010" elapsed="0.000020"/>
</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-10-16T01:15:32.583188" elapsed="0.000019"/>
</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-10-16T01:15:32.583539" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:32.583384" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:32.583370" 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-10-16T01:15:32.583780" 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-10-16T01:15:32.583957" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:32.584116" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:15:32.583344" elapsed="0.000819"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:15:32.583255" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:32.584333" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:32.584411" elapsed="0.000016"/>
</return>
<msg time="2026-10-16T01:15:32.584517" 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-10-16T01:15:32.551502" elapsed="0.033039"/>
</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-10-16T01:15:32.585639" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:32.585449" elapsed="0.000264">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:32.585798" 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-10-16T01:15:32.585118" elapsed="0.000703"/>
</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-10-16T01:15:32.586099" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:32.585884" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:15:32.586649" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:32.586369" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:32.586208" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:32.585868" elapsed="0.000875"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:32.587239" 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-10-16T01:15:32.586902" elapsed="0.000361"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:15:32.587307" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:15:32.587444" 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-manganese/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-10-16T01:15:32.584818" elapsed="0.002650"/>
</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-10-16T01:15:32.588547" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:32.588347" elapsed="0.000260">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:32.588689" 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-10-16T01:15:32.588033" elapsed="0.000694"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:15:32.588889" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:15:32.588791" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:32.588774" elapsed="0.000191"/>
</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-10-16T01:15:32.589115" elapsed="0.000020"/>
</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-10-16T01:15:32.589283" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:32.589342" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:15:32.589478" 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-manganese/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-10-16T01:15:32.587725" elapsed="0.001776"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:32.590902" 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-10-16T01:15:32.590662" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:32.591345" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:32.591127" elapsed="0.000258"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:15:32.595927" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:15:32.595980" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:15:32.596075" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:32.591680" elapsed="0.004741">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:32.591459" elapsed="0.005040">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:32.596678" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:32.596529" elapsed="0.000227"/>
</branch>
<status status="FAIL" start="2026-10-16T01:15:32.591442" elapsed="0.005336">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:32.597108" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:32.597261" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:32.597228" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:32.597210" elapsed="0.000110"/>
</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-10-16T01:15:32.597471" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:15:32.597536" elapsed="0.000013"/>
</return>
<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="FAIL" start="2026-10-16T01:15:32.589954" elapsed="0.007683">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:32.597721" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:15:32.541728" elapsed="0.056121">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:15:32.598229" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:32.598015" elapsed="0.000296"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:32.597968" elapsed="0.000382"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:32.598445" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:15:32.539236" elapsed="0.059372">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:32.535174" elapsed="0.063558">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:15:32.535132" elapsed="0.063674">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:32.599052" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:15:32.599393" elapsed="0.000033"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:32.599731" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:15:32.600076" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:15:32.600506" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:32.600843" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:32.601194" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:15:32.601445" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:15:32.527612" elapsed="0.073934">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:15:32.601607" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:15:32.525811" elapsed="0.075884">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:32.601959" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:32.601817" elapsed="0.000191"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:32.602200" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:32.602030" elapsed="0.000220"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:32.602429" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:32.602272" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:32.601800" elapsed="0.000698"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:15:32.525447" elapsed="0.077090">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:15:32.525056" elapsed="0.077532">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:32.602636" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:15:32.516758" elapsed="0.085995">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:32.602931" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:32.603151" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:32.603010" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:32.602995" elapsed="0.000223"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:32.603343" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:32.603524" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:32.603582" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:15:32.515134" elapsed="0.088540">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:15:32.514668" elapsed="0.089193">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:15:32.514429" elapsed="0.089484">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:15:32.513601" elapsed="0.090393">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:32.604202" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:15:32.492957" elapsed="0.111349">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:15:33.622741" elapsed="0.000392"/>
</kw>
<msg time="2026-10-16T01:15:33.623236" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:33.621464" elapsed="0.001880"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:15:33.620522" elapsed="0.003000"/>
</kw>
<msg time="2026-10-16T01:15:33.623614" 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-10-16T01:15:33.614076" elapsed="0.009658"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:15:33.613099" elapsed="0.010786"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:33.625018" 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-10-16T01:15:33.624463" elapsed="0.000649"/>
</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-10-16T01:15:33.631622" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:33.630868" elapsed="0.000811"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:33.632686" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:33.632052" elapsed="0.000718"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:33.632865" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:15:33.633155" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:33.630035" elapsed="0.003172"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:15:33.633559" elapsed="0.000317"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:33.634976" 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-10-16T01:15:33.634248" elapsed="0.000784"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:33.635929" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:33.635361" elapsed="0.000622"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:33.636858" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:33.636297" elapsed="0.000615"/>
</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-10-16T01:15:33.645578" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:15:33.644163" elapsed="0.001526"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:15:33.645867" elapsed="0.000136"/>
</return>
<msg time="2026-10-16T01:15:33.646466" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:15:33.640915" elapsed="0.005678"/>
</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-10-16T01:15:33.670926" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:33.670462" elapsed="0.000501"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:15:33.671931" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:15:33.671638" elapsed="0.000381">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:33.672137" 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-10-16T01:15:33.671179" elapsed="0.000990"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:33.672873" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:33.672419" elapsed="0.000490"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:15:33.673289" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:15:33.673493" 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-10-16T01:15:33.673135" elapsed="0.000392"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:33.674118" 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-10-16T01:15:33.673811" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:33.677182" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:33.676853" elapsed="0.000387"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:15:33.677946" 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-10-16T01:15:33.677512" elapsed="0.000469"/>
</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-10-16T01:15:33.678373" elapsed="0.000045"/>
</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-10-16T01:15:33.678642" elapsed="0.000032"/>
</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-10-16T01:15:33.678924" elapsed="0.000028"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:15:33.678194" elapsed="0.000804"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:15:33.678041" elapsed="0.000994"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:15:33.679090" elapsed="0.000038"/>
</return>
<msg time="2026-10-16T01:15:33.679275" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:15:33.676318" elapsed="0.002989"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:33.675959" elapsed="0.003388"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:33.679601" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:33.679379" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:33.674237" elapsed="0.005481"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:15:33.680499" 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-10-16T01:15:33.679948" elapsed="0.000587"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:15:33.680595" elapsed="0.000037"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:15:33.669748" elapsed="0.011007"/>
</kw>
<msg time="2026-10-16T01:15:33.680822" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:33.664103" elapsed="0.016785"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:33.685884" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:33.689660" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:33.693441" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:33.693619" elapsed="0.000020"/>
</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-10-16T01:15:33.693812" 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-10-16T01:15:33.694150" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:33.694010" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:33.693997" elapsed="0.000226"/>
</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-10-16T01:15:33.694372" elapsed="0.000031"/>
</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-10-16T01:15:33.694560" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:33.694771" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:15:33.693971" elapsed="0.000851"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:15:33.693881" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:33.694994" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:33.695063" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:15:33.695166" 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-10-16T01:15:33.663234" elapsed="0.031957"/>
</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-10-16T01:15:33.696287" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:33.696097" elapsed="0.000251">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:33.696443" 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-10-16T01:15:33.695774" elapsed="0.000693"/>
</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-10-16T01:15:33.696767" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:33.696531" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:15:33.697267" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:33.697002" elapsed="0.000290"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:33.696844" elapsed="0.000481"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:33.696514" elapsed="0.000831"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:33.697875" 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-10-16T01:15:33.697516" elapsed="0.000383"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:15:33.697945" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:15:33.698072" 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-manganese/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-10-16T01:15:33.695461" elapsed="0.002634"/>
</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-10-16T01:15:33.699163" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:33.698975" elapsed="0.000247">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:33.699305" 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-10-16T01:15:33.698640" elapsed="0.000687"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:15:33.699669" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:15:33.699565" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:33.699374" elapsed="0.000389"/>
</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-10-16T01:15:33.699913" elapsed="0.000020"/>
</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-10-16T01:15:33.700085" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:33.700146" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:15:33.700271" 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-manganese/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-10-16T01:15:33.698334" elapsed="0.001960"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:33.701531" 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-10-16T01:15:33.701289" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:33.702035" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:33.701811" elapsed="0.000265"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:15:33.706622" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:15:33.706674" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:15:33.706801" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:33.702361" elapsed="0.004782">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:33.702137" elapsed="0.005100">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:33.707431" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:33.707268" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-10-16T01:15:33.702120" elapsed="0.005393">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:33.707862" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:33.708002" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:33.707969" elapsed="0.000081"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:33.707952" 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-10-16T01:15:33.708207" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:15:33.708271" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:15:33.700576" elapsed="0.007797">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:33.708455" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:15:33.653427" elapsed="0.055155">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:15:33.708994" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:33.708776" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:33.708724" elapsed="0.000391"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:33.709198" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:15:33.651109" elapsed="0.058253">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:33.647321" elapsed="0.062157">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:15:33.647278" elapsed="0.062271">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:33.709813" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:15:33.710193" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:33.710519" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:15:33.710892" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:15:33.711319" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:33.711643" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:33.712016" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:15:33.712253" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:15:33.639563" elapsed="0.072791">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:15:33.712429" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:15:33.637762" elapsed="0.074756">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:33.712763" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:33.712598" elapsed="0.000216"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:33.712972" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:33.712837" elapsed="0.000183"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:33.713182" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:33.713042" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:33.712582" elapsed="0.000668"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:15:33.637379" elapsed="0.075908">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:15:33.637009" elapsed="0.076330">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:33.713399" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:15:33.628649" elapsed="0.084842">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:33.713664" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:33.713971" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:33.713829" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:33.713812" elapsed="0.000228"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:33.714163" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:33.714328" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:33.714398" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:15:33.627062" elapsed="0.087428">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:15:33.626592" elapsed="0.087960">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:15:33.626334" elapsed="0.088312">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:15:33.625569" elapsed="0.089236">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:33.715014" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:15:33.604954" elapsed="0.110162">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:15:34.733854" elapsed="0.000386"/>
</kw>
<msg time="2026-10-16T01:15:34.734343" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:34.732485" elapsed="0.001993"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:15:34.731544" elapsed="0.003094"/>
</kw>
<msg time="2026-10-16T01:15:34.734762" 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-10-16T01:15:34.725005" elapsed="0.009851"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:15:34.724140" elapsed="0.010868"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:34.736059" 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-10-16T01:15:34.735499" elapsed="0.000658"/>
</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-10-16T01:15:34.742691" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:34.741932" elapsed="0.000848"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:34.743792" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:34.743118" elapsed="0.000731"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:34.743944" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:15:34.744232" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:34.741101" elapsed="0.003183"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:15:34.744637" elapsed="0.000316"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:34.746099" 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-10-16T01:15:34.745362" elapsed="0.000794"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:34.747064" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:34.746512" elapsed="0.000607"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:34.747993" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:34.747453" elapsed="0.000594"/>
</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-10-16T01:15:34.756913" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:15:34.755454" elapsed="0.001570"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:15:34.757152" elapsed="0.000135"/>
</return>
<msg time="2026-10-16T01:15:34.757795" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:15:34.752145" elapsed="0.005783"/>
</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-10-16T01:15:34.781782" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:34.781313" elapsed="0.000506"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:15:34.782786" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:15:34.782497" elapsed="0.000375">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:34.782989" 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-10-16T01:15:34.782036" elapsed="0.000985"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:34.783735" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:34.783257" elapsed="0.000515"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:15:34.784157" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:15:34.784335" 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-10-16T01:15:34.784002" elapsed="0.000382"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:34.784987" 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-10-16T01:15:34.784653" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:34.786525" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:34.786003" elapsed="0.000580"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:15:34.787212" 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-10-16T01:15:34.786853" elapsed="0.000393"/>
</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-10-16T01:15:34.787657" elapsed="0.000030"/>
</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-10-16T01:15:34.787935" 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-10-16T01:15:34.788186" elapsed="0.000027"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:15:34.787478" elapsed="0.000780"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:15:34.787306" elapsed="0.000990"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:15:34.788352" elapsed="0.000054"/>
</return>
<msg time="2026-10-16T01:15:34.788553" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:15:34.785496" elapsed="0.003090"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:34.785133" elapsed="0.003493"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:34.788881" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:34.788658" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:34.785108" elapsed="0.003871"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:15:34.789769" 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-10-16T01:15:34.789193" elapsed="0.000612"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:15:34.789867" elapsed="0.000038"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:15:34.780595" elapsed="0.009412"/>
</kw>
<msg time="2026-10-16T01:15:34.790072" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:34.774919" elapsed="0.015219"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:34.795447" elapsed="0.000036"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:34.800657" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:34.804447" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:34.804625" elapsed="0.000020"/>
</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-10-16T01:15:34.804817" 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-10-16T01:15:34.805159" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:34.805017" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:34.805003" elapsed="0.000229"/>
</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-10-16T01:15:34.805396" 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-10-16T01:15:34.805573" elapsed="0.000018"/>
</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-10-16T01:15:34.805747" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:15:34.804977" elapsed="0.000820"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:15:34.804886" elapsed="0.000935"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:34.805970" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:34.806037" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:15:34.806141" 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-10-16T01:15:34.774052" elapsed="0.032112"/>
</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-10-16T01:15:34.807255" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:34.807066" elapsed="0.000248">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:34.807412" 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-10-16T01:15:34.806745" elapsed="0.000691"/>
</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-10-16T01:15:34.807730" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:34.807499" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:15:34.808228" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:34.807963" elapsed="0.000290"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:34.807806" elapsed="0.000480"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:34.807483" elapsed="0.000822"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:34.808828" 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-10-16T01:15:34.808476" elapsed="0.000407"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:15:34.808931" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:15:34.809056" 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-manganese/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-10-16T01:15:34.806435" elapsed="0.002644"/>
</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-10-16T01:15:34.810158" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:34.809971" elapsed="0.000246">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:34.810300" 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-10-16T01:15:34.809635" elapsed="0.000687"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:15:34.810499" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:15:34.810398" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:34.810381" elapsed="0.000195"/>
</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-10-16T01:15:34.810741" 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-10-16T01:15:34.810913" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:34.810972" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:15:34.811096" 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-manganese/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-10-16T01:15:34.809321" elapsed="0.001798"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:34.812525" 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-10-16T01:15:34.812281" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:34.812990" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:34.812769" elapsed="0.000262"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:15:34.817718" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:15:34.817773" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:15:34.817868" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:34.813314" elapsed="0.004896">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:34.813091" elapsed="0.005195">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:34.818478" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:34.818316" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-10-16T01:15:34.813074" elapsed="0.005485">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:34.818913" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:34.819033" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:34.819000" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:34.818984" elapsed="0.000107"/>
</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-10-16T01:15:34.819226" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:15:34.819322" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:15:34.811569" elapsed="0.007871">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:34.819508" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:15:34.764225" elapsed="0.055409">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:15:34.820050" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:34.819829" elapsed="0.000304"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:34.819782" elapsed="0.000390"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:34.820254" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:15:34.762019" elapsed="0.058419">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:34.758410" elapsed="0.062128">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:15:34.758347" elapsed="0.062263">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:34.820872" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:15:34.821218" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:34.821540" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:15:34.821898" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:15:34.822319" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:34.822639" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:34.823006" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:15:34.823245" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:15:34.750786" elapsed="0.072566">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:15:34.823427" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:15:34.748911" elapsed="0.074606">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:34.823769" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:34.823599" elapsed="0.000221"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:34.823979" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:34.823843" elapsed="0.000185"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:34.824189" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:34.824049" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:34.823583" elapsed="0.000715"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:15:34.748548" elapsed="0.075792">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:15:34.748144" elapsed="0.076264">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:34.824457" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:15:34.739736" elapsed="0.084812">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:34.824744" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:34.824965" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:34.824824" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:34.824809" elapsed="0.000225"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:34.825159" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:34.825326" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:34.825397" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:15:34.738118" elapsed="0.087372">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:15:34.737648" elapsed="0.087904">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:15:34.737411" elapsed="0.088189">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:15:34.736624" elapsed="0.089056">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:34.825918" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:15:34.715760" elapsed="0.110264">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:15:35.845451" elapsed="0.000437"/>
</kw>
<msg time="2026-10-16T01:15:35.845994" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:35.844168" elapsed="0.001937"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:15:35.843203" elapsed="0.003059"/>
</kw>
<msg time="2026-10-16T01:15:35.846381" 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-10-16T01:15:35.835879" elapsed="0.010601"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:15:35.835004" elapsed="0.011628"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:35.847680" 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-10-16T01:15:35.847136" elapsed="0.000669"/>
</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-10-16T01:15:35.854457" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:35.853669" elapsed="0.000847"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:35.855506" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:35.854876" elapsed="0.000685"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:35.855655" elapsed="0.000093"/>
</return>
<msg time="2026-10-16T01:15:35.855982" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:35.852864" elapsed="0.003168"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:15:35.856381" elapsed="0.000289"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:35.857836" 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-10-16T01:15:35.857077" elapsed="0.000815"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:35.858877" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:35.858294" elapsed="0.000637"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:35.859816" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:35.859241" elapsed="0.000631"/>
</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-10-16T01:15:35.868846" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:15:35.867321" elapsed="0.001641"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:15:35.869089" elapsed="0.000134"/>
</return>
<msg time="2026-10-16T01:15:35.869681" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:15:35.863960" elapsed="0.006005"/>
</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-10-16T01:15:35.893801" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:35.893339" elapsed="0.000499"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:15:35.894813" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:15:35.894510" elapsed="0.000399">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:35.895026" 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-10-16T01:15:35.894052" elapsed="0.001004"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:35.895761" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:35.895291" elapsed="0.000507"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:15:35.896178" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:15:35.896383" 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-10-16T01:15:35.896022" elapsed="0.000395"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:35.897013" 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-10-16T01:15:35.896685" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:35.898533" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:35.898011" elapsed="0.000580"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:15:35.899215" 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-10-16T01:15:35.898854" elapsed="0.000395"/>
</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-10-16T01:15:35.899657" elapsed="0.000029"/>
</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-10-16T01:15:35.899933" elapsed="0.000032"/>
</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-10-16T01:15:35.900235" elapsed="0.000029"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:15:35.899479" elapsed="0.000830"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:15:35.899308" elapsed="0.001054"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:15:35.900421" elapsed="0.000037"/>
</return>
<msg time="2026-10-16T01:15:35.900604" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:15:35.897518" elapsed="0.003118"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:35.897153" elapsed="0.003523"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:35.900931" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:35.900729" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:35.897130" elapsed="0.003900"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:15:35.901809" 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-10-16T01:15:35.901239" elapsed="0.000606"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:15:35.901905" elapsed="0.000036"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:15:35.892016" elapsed="0.010027"/>
</kw>
<msg time="2026-10-16T01:15:35.902108" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:35.886309" elapsed="0.015863"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:35.907527" elapsed="0.000035"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:35.911524" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:35.915395" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:35.915573" elapsed="0.000020"/>
</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-10-16T01:15:35.915764" 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-10-16T01:15:35.916106" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:35.915964" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:35.915951" elapsed="0.000227"/>
</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-10-16T01:15:35.916329" elapsed="0.000031"/>
</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-10-16T01:15:35.916519" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:35.916679" elapsed="0.000032"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:15:35.915925" elapsed="0.000817"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:15:35.915834" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:35.916952" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:35.917020" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:15:35.917124" 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-10-16T01:15:35.885466" elapsed="0.031681"/>
</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-10-16T01:15:35.918248" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:35.918053" elapsed="0.000255">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:35.918404" 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-10-16T01:15:35.917732" elapsed="0.000696"/>
</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-10-16T01:15:35.918723" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:35.918491" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:15:35.919223" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:35.918958" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:35.918800" elapsed="0.000479"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:35.918475" elapsed="0.000823"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:35.919819" 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-10-16T01:15:35.919467" elapsed="0.000377"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:15:35.919890" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:15:35.920013" 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-manganese/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-10-16T01:15:35.917421" elapsed="0.002615"/>
</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-10-16T01:15:35.921126" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:35.920935" elapsed="0.000250">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:35.921268" 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-10-16T01:15:35.920591" elapsed="0.000700"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:15:35.921467" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:15:35.921367" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:35.921337" elapsed="0.000206"/>
</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-10-16T01:15:35.921693" 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-10-16T01:15:35.921883" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:35.921943" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:15:35.922067" 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-manganese/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-10-16T01:15:35.920281" elapsed="0.001809"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:35.923489" 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-10-16T01:15:35.923252" elapsed="0.000279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:35.923952" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:35.923732" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:15:35.928615" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:15:35.928722" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:15:35.928823" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:35.924274" elapsed="0.004898">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:35.924052" elapsed="0.005199">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:35.929445" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:35.929282" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-10-16T01:15:35.924036" elapsed="0.005491">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:35.929877" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:35.929996" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:35.929964" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:35.929948" elapsed="0.000107"/>
</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-10-16T01:15:35.930190" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:15:35.930253" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:15:35.922544" elapsed="0.007822">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:35.930435" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:15:35.875781" elapsed="0.054778">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:15:35.930967" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:35.930749" elapsed="0.000302"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:35.930676" elapsed="0.000417"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:35.931175" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:15:35.873526" elapsed="0.057811">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:35.870436" elapsed="0.061016">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:15:35.870393" elapsed="0.061131">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:35.931788" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:15:35.932130" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:35.932449" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:15:35.932823" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:15:35.933278" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:35.933621" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:35.933997" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:15:35.934237" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:15:35.862589" elapsed="0.071748">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:15:35.934415" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:15:35.860790" elapsed="0.073714">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:35.934749" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:35.934585" elapsed="0.000216"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:35.934960" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:35.934823" elapsed="0.000186"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:35.935171" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:35.935031" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:35.934569" elapsed="0.000670"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:15:35.860340" elapsed="0.074936">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:15:35.859968" elapsed="0.075361">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:35.935390" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:15:35.851368" elapsed="0.084118">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:35.935662" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:35.936012" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:35.935872" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:35.935856" elapsed="0.000225"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:35.936205" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:35.936381" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:35.936440" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:15:35.849779" elapsed="0.086753">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:15:35.849282" elapsed="0.087311">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:15:35.849038" elapsed="0.087604">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:15:35.848246" elapsed="0.088494">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:35.936993" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:15:35.826641" elapsed="0.110458">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:15:36.955916" elapsed="0.000400"/>
</kw>
<msg time="2026-10-16T01:15:36.956450" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:36.954642" elapsed="0.001921"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:15:36.953735" elapsed="0.003013"/>
</kw>
<msg time="2026-10-16T01:15:36.956859" 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-10-16T01:15:36.947094" elapsed="0.009857"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:15:36.946210" elapsed="0.010889"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:36.958136" 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-10-16T01:15:36.957599" elapsed="0.000627"/>
</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-10-16T01:15:36.964831" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:36.964043" elapsed="0.000845"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:36.965885" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:36.965220" elapsed="0.000718"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:36.966029" elapsed="0.000063"/>
</return>
<msg time="2026-10-16T01:15:36.966315" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:36.963216" elapsed="0.003177"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:15:36.966750" elapsed="0.000283"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:36.968119" 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-10-16T01:15:36.967417" elapsed="0.000764"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:36.969121" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:36.968541" elapsed="0.000641"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:36.970064" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:36.969525" elapsed="0.000593"/>
</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-10-16T01:15:36.978895" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:15:36.977486" elapsed="0.001518"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:15:36.979134" elapsed="0.000135"/>
</return>
<msg time="2026-10-16T01:15:36.979952" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:15:36.974078" elapsed="0.006005"/>
</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-10-16T01:15:37.009454" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:37.009012" elapsed="0.000478"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:15:37.010553" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:15:37.010243" elapsed="0.000407">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:37.010790" 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-10-16T01:15:37.009796" elapsed="0.001026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:37.011508" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:37.011059" elapsed="0.000484"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:15:37.011952" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:15:37.012144" 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-10-16T01:15:37.011793" elapsed="0.000385"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:37.012797" 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-10-16T01:15:37.012466" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:37.016251" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:37.015925" elapsed="0.000384"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:15:37.016970" 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-10-16T01:15:37.016586" elapsed="0.000418"/>
</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-10-16T01:15:37.017414" elapsed="0.000029"/>
</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-10-16T01:15:37.017672" elapsed="0.000054"/>
</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-10-16T01:15:37.017962" elapsed="0.000028"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:15:37.017213" elapsed="0.000821"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:15:37.017063" elapsed="0.001011"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:15:37.018131" elapsed="0.000037"/>
</return>
<msg time="2026-10-16T01:15:37.018312" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:15:37.015401" elapsed="0.002960"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:37.015011" elapsed="0.003393"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:37.018648" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:37.018438" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:37.012916" elapsed="0.005849"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:15:37.019558" 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-10-16T01:15:37.018997" elapsed="0.000598"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:15:37.019655" elapsed="0.000038"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:15:37.008280" elapsed="0.011539"/>
</kw>
<msg time="2026-10-16T01:15:37.019887" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:37.002569" elapsed="0.017384"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:37.024814" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:37.028646" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:37.032501" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:37.032681" 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-10-16T01:15:37.032876" elapsed="0.000019"/>
</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-10-16T01:15:37.033217" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:37.033076" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:37.033062" elapsed="0.000227"/>
</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-10-16T01:15:37.033457" 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-10-16T01:15:37.033636" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:37.033812" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:15:37.033036" elapsed="0.000827"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:15:37.032946" elapsed="0.000941"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:37.034037" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:37.034106" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:15:37.034209" 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-10-16T01:15:37.001692" elapsed="0.032541"/>
</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-10-16T01:15:37.035352" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:37.035145" elapsed="0.000268">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:37.035496" 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-10-16T01:15:37.034816" elapsed="0.000703"/>
</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-10-16T01:15:37.035821" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:37.035583" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:15:37.036320" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:37.036056" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:37.035898" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:37.035566" elapsed="0.000876"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:37.036960" 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-10-16T01:15:37.036600" elapsed="0.000384"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:15:37.037030" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:15:37.037153" 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-manganese/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-10-16T01:15:37.034504" elapsed="0.002672"/>
</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-10-16T01:15:37.038309" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:37.038118" elapsed="0.000268">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:37.038470" 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-10-16T01:15:37.037793" elapsed="0.000700"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:15:37.038841" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:15:37.038734" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:37.038540" elapsed="0.000381"/>
</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-10-16T01:15:37.039071" elapsed="0.000020"/>
</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-10-16T01:15:37.039244" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:37.039304" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:15:37.039446" 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-manganese/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-10-16T01:15:37.037475" elapsed="0.001994"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:37.040721" 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-10-16T01:15:37.040479" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:37.041168" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:37.040950" elapsed="0.000258"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:15:37.046005" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:15:37.046057" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:15:37.046160" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:37.041507" elapsed="0.005030">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:37.041268" elapsed="0.005347">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:37.046825" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:37.046646" elapsed="0.000237"/>
</branch>
<status status="FAIL" start="2026-10-16T01:15:37.041251" elapsed="0.005655">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:37.047240" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:37.047386" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:37.047350" elapsed="0.000074"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:37.047310" elapsed="0.000135"/>
</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-10-16T01:15:37.047580" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:15:37.047641" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:15:37.039769" elapsed="0.007993">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:37.047864" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:15:36.988107" elapsed="0.059886">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:15:37.048402" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:37.048166" elapsed="0.000321"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:37.048118" elapsed="0.000409"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:37.048611" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:15:36.984588" elapsed="0.064212">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:36.980738" elapsed="0.068161">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:15:36.980662" elapsed="0.068308">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:37.049215" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:15:37.049593" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:37.049920" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:15:37.050266" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:15:37.050740" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:37.051051" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:37.051415" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:15:37.051651" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:15:36.972775" elapsed="0.079012">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:15:37.051850" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:15:36.970961" elapsed="0.080978">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:37.052156" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:37.052017" elapsed="0.000188"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:37.052376" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:37.052227" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:37.052587" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:37.052447" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:37.052002" elapsed="0.000652"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:15:36.970598" elapsed="0.082094">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:15:36.970210" elapsed="0.082562">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:37.052821" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:15:36.961790" elapsed="0.091157">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:37.053124" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:37.053363" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:37.053207" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:37.053191" elapsed="0.000242"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:37.053558" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:37.053813" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:37.053875" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:15:36.960185" elapsed="0.093782">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:15:36.959740" elapsed="0.094289">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:15:36.959470" elapsed="0.094607">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:15:36.958682" elapsed="0.095475">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:37.054384" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:15:36.937799" elapsed="0.116691">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:15:38.073175" elapsed="0.000410"/>
</kw>
<msg time="2026-10-16T01:15:38.073690" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:38.071923" elapsed="0.001908"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:15:38.070980" elapsed="0.003012"/>
</kw>
<msg time="2026-10-16T01:15:38.074083" 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-10-16T01:15:38.064438" elapsed="0.009736"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:15:38.063546" elapsed="0.010800"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:38.075379" 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-10-16T01:15:38.074843" elapsed="0.000631"/>
</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-10-16T01:15:38.082079" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:38.081282" elapsed="0.000855"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:38.083267" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:38.082605" elapsed="0.000753"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:38.083556" elapsed="0.000067"/>
</return>
<msg time="2026-10-16T01:15:38.083895" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:38.080464" elapsed="0.003485"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:15:38.084282" elapsed="0.000314"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:38.085736" 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-10-16T01:15:38.085000" elapsed="0.000795"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:38.086673" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:38.086131" elapsed="0.000626"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:38.087606" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:38.087072" elapsed="0.000588"/>
</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-10-16T01:15:38.096487" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:15:38.095064" elapsed="0.001533"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:15:38.096769" elapsed="0.000137"/>
</return>
<msg time="2026-10-16T01:15:38.097367" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:15:38.091830" elapsed="0.005667"/>
</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-10-16T01:15:38.124225" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:38.123795" elapsed="0.000467"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:15:38.125231" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:15:38.124958" elapsed="0.000425">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:38.125507" 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-10-16T01:15:38.124495" elapsed="0.001045"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:38.126240" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:38.125796" elapsed="0.000480"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:15:38.126678" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:15:38.126881" 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-10-16T01:15:38.126521" elapsed="0.000394"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:38.127512" 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-10-16T01:15:38.127182" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:38.129059" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:38.128521" elapsed="0.000603"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:15:38.129771" 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-10-16T01:15:38.129385" elapsed="0.000422"/>
</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-10-16T01:15:38.130202" elapsed="0.000029"/>
</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-10-16T01:15:38.130477" elapsed="0.000032"/>
</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-10-16T01:15:38.130753" elapsed="0.000028"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:15:38.130022" elapsed="0.000806"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:15:38.129869" elapsed="0.000997"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:15:38.130922" elapsed="0.000038"/>
</return>
<msg time="2026-10-16T01:15:38.131158" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:15:38.128022" elapsed="0.003170"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:38.127656" elapsed="0.003578"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:38.131491" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:38.131267" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:38.127632" elapsed="0.003961"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:15:38.132397" 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-10-16T01:15:38.131832" elapsed="0.000602"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:15:38.132497" elapsed="0.000038"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:15:38.123051" elapsed="0.009587"/>
</kw>
<msg time="2026-10-16T01:15:38.132728" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:38.117398" elapsed="0.015398"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:38.137325" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:38.141093" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:38.144861" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:38.145036" elapsed="0.000020"/>
</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-10-16T01:15:38.145213" elapsed="0.000019"/>
</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-10-16T01:15:38.145567" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:38.145426" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:38.145412" elapsed="0.000227"/>
</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-10-16T01:15:38.145806" 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-10-16T01:15:38.145982" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:38.146139" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:15:38.145385" elapsed="0.000803"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:15:38.145281" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:38.146370" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:38.146438" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:15:38.146542" 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-10-16T01:15:38.116534" elapsed="0.030032"/>
</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-10-16T01:15:38.147759" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:38.147540" elapsed="0.000280">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:38.147903" 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-10-16T01:15:38.147178" elapsed="0.000748"/>
</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-10-16T01:15:38.148202" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:38.147988" elapsed="0.000266"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:15:38.148726" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:38.148447" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:38.148277" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:38.147972" elapsed="0.000831"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:38.149292" 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-10-16T01:15:38.148957" elapsed="0.000375"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:15:38.149378" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:15:38.149502" 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-manganese/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-10-16T01:15:38.146880" elapsed="0.002645"/>
</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-10-16T01:15:38.150624" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:38.150422" elapsed="0.000260">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:38.150785" 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-10-16T01:15:38.150089" elapsed="0.000719"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:15:38.150969" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:15:38.150872" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:38.150855" elapsed="0.000190"/>
</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-10-16T01:15:38.151200" elapsed="0.000020"/>
</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-10-16T01:15:38.151386" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:38.151447" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:15:38.151571" 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-manganese/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-10-16T01:15:38.149793" elapsed="0.001802"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:38.153003" 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-10-16T01:15:38.152777" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:38.153466" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:38.153232" elapsed="0.000275"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:15:38.158268" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:15:38.158362" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:15:38.158512" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:38.153806" elapsed="0.005085">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:38.153567" elapsed="0.005402">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:38.159150" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:38.159000" elapsed="0.000208"/>
</branch>
<status status="FAIL" start="2026-10-16T01:15:38.153550" elapsed="0.005680">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:38.159572" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:38.159692" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:38.159659" elapsed="0.000091"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:38.159643" elapsed="0.000128"/>
</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-10-16T01:15:38.159907" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:15:38.159970" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:15:38.152053" elapsed="0.008018">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:38.160142" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:15:38.105562" elapsed="0.054708">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:15:38.160671" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:38.160454" elapsed="0.000324"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:38.160405" elapsed="0.000414"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:38.160903" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:15:38.102050" elapsed="0.059018">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:38.098196" elapsed="0.062972">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:15:38.098153" elapsed="0.063088">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:38.161502" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:15:38.161863" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:38.162175" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:15:38.162542" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:15:38.162998" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:38.163324" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:38.163675" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:15:38.163975" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:15:38.090453" elapsed="0.073626">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:15:38.164140" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:15:38.088524" elapsed="0.075704">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:38.164493" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:38.164351" elapsed="0.000193"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:38.164726" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:38.164566" elapsed="0.000212"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:38.164940" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:38.164800" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:38.164293" elapsed="0.000715"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:15:38.088169" elapsed="0.076877">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:15:38.087789" elapsed="0.077310">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:38.165147" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:15:38.079031" elapsed="0.086207">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:38.165426" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:38.165647" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:38.165505" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:38.165490" elapsed="0.000313"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:38.165933" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:38.166103" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:38.166160" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:15:38.077427" elapsed="0.088826">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:15:38.076967" elapsed="0.089365">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:15:38.076696" elapsed="0.089687">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:15:38.075946" elapsed="0.090518">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:38.166673" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:15:38.055120" elapsed="0.111724">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:15:39.186195" elapsed="0.000433"/>
</kw>
<msg time="2026-10-16T01:15:39.186781" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:39.184815" elapsed="0.002090"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:15:39.183882" elapsed="0.003183"/>
</kw>
<msg time="2026-10-16T01:15:39.187155" 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-10-16T01:15:39.177349" elapsed="0.009894"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:15:39.176455" elapsed="0.010961"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:39.188467" 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-10-16T01:15:39.187930" elapsed="0.000629"/>
</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-10-16T01:15:39.195316" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:39.194523" elapsed="0.000854"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:39.196530" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:39.195742" elapsed="0.000843"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:39.196680" elapsed="0.000100"/>
</return>
<msg time="2026-10-16T01:15:39.197009" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:39.193688" elapsed="0.003372"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:15:39.197408" elapsed="0.000349"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:39.198876" 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-10-16T01:15:39.198146" elapsed="0.000785"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:39.199817" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:39.199257" elapsed="0.000614"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:39.200731" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:39.200178" elapsed="0.000609"/>
</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-10-16T01:15:39.209491" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:15:39.208086" elapsed="0.001513"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:15:39.209976" elapsed="0.000148"/>
</return>
<msg time="2026-10-16T01:15:39.210606" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:15:39.204816" elapsed="0.005956"/>
</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-10-16T01:15:39.236421" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:39.235949" elapsed="0.000508"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:15:39.237479" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:15:39.237135" elapsed="0.000446">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:39.237717" 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-10-16T01:15:39.236672" elapsed="0.001079"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:39.238521" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:39.238061" elapsed="0.000496"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:15:39.238975" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:15:39.239171" 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-10-16T01:15:39.238807" elapsed="0.000397"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:39.239820" 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-10-16T01:15:39.239486" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:39.241347" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:39.240819" elapsed="0.000589"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:15:39.242037" 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-10-16T01:15:39.241655" elapsed="0.000416"/>
</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-10-16T01:15:39.242483" elapsed="0.000028"/>
</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-10-16T01:15:39.242761" 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-10-16T01:15:39.243013" elapsed="0.000026"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:15:39.242282" elapsed="0.000802"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:15:39.242133" elapsed="0.000999"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:15:39.243203" elapsed="0.000045"/>
</return>
<msg time="2026-10-16T01:15:39.243441" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:15:39.240326" elapsed="0.003144"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:39.239964" elapsed="0.003541"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:39.243692" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:39.243536" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:39.239940" elapsed="0.003846"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:15:39.244391" 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-10-16T01:15:39.243942" elapsed="0.000476"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:15:39.244461" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:15:39.235216" elapsed="0.009345"/>
</kw>
<msg time="2026-10-16T01:15:39.244608" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:39.229551" elapsed="0.015103"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:39.248467" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:39.252264" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:39.256141" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:39.256368" elapsed="0.000020"/>
</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-10-16T01:15:39.256546" 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-10-16T01:15:39.256906" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:39.256764" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:39.256750" elapsed="0.000229"/>
</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-10-16T01:15:39.257130" elapsed="0.000019"/>
</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-10-16T01:15:39.257319" 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-10-16T01:15:39.257485" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:15:39.256723" elapsed="0.000810"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:15:39.256616" elapsed="0.000940"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:39.257721" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:39.257791" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:15:39.257896" 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-10-16T01:15:39.228690" elapsed="0.029229"/>
</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-10-16T01:15:39.259045" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:39.258836" elapsed="0.000270">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:39.259188" 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-10-16T01:15:39.258496" elapsed="0.000714"/>
</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-10-16T01:15:39.259500" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:39.259272" elapsed="0.000280"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:15:39.260012" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:39.259750" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:39.259575" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:39.259255" elapsed="0.000832"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:39.260590" 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-10-16T01:15:39.260244" elapsed="0.000370"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:15:39.260658" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:15:39.260801" 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-manganese/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-10-16T01:15:39.258184" elapsed="0.002640"/>
</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-10-16T01:15:39.261940" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:39.261739" elapsed="0.000259">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:39.262081" 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-10-16T01:15:39.261408" elapsed="0.000695"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:15:39.262326" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:15:39.262212" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:39.262195" elapsed="0.000209"/>
</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-10-16T01:15:39.262552" elapsed="0.000020"/>
</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-10-16T01:15:39.262741" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:39.262801" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:15:39.262926" 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-manganese/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-10-16T01:15:39.261069" elapsed="0.001879"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:39.264349" 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-10-16T01:15:39.264114" elapsed="0.000277"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:39.264815" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:39.264579" elapsed="0.000277"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:15:39.269558" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:15:39.269611" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:15:39.269725" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:39.265138" elapsed="0.004945">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:39.264915" elapsed="0.005246">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:39.270356" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:39.270191" elapsed="0.000224"/>
</branch>
<status status="FAIL" start="2026-10-16T01:15:39.264898" elapsed="0.005539">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:39.270796" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:39.270915" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:39.270883" elapsed="0.000069"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:39.270867" elapsed="0.000105"/>
</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-10-16T01:15:39.271107" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:15:39.271169" elapsed="0.000013"/>
</return>
<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="FAIL" start="2026-10-16T01:15:39.263400" elapsed="0.007870">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:39.271352" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:15:39.218791" elapsed="0.052687">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:15:39.271887" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:39.271642" elapsed="0.000358"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:39.271595" elapsed="0.000444"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:39.272121" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:15:39.215193" elapsed="0.057090">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:39.211232" elapsed="0.061166">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:15:39.211190" elapsed="0.061279">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:39.272733" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:15:39.273075" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:39.273392" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:15:39.273766" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:15:39.274188" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:39.274506" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:39.274880" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:15:39.275116" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:15:39.203463" elapsed="0.071753">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:15:39.275277" elapsed="0.000029"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:15:39.201609" elapsed="0.073772">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:39.275597" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:39.275460" elapsed="0.000187"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:39.275830" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:39.275669" elapsed="0.000212"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:39.276041" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:39.275902" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:39.275444" elapsed="0.000664"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:15:39.201254" elapsed="0.074893">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:15:39.200883" elapsed="0.075316">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:39.276247" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:15:39.192340" elapsed="0.084011">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:39.276524" elapsed="0.000049"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:39.276865" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:39.276635" elapsed="0.000287"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:39.276620" elapsed="0.000324"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:39.277069" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:39.277240" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:39.277311" elapsed="0.000015"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:15:39.190738" elapsed="0.086668">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:15:39.190219" elapsed="0.087249">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:15:39.189964" elapsed="0.087552">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:15:39.189040" elapsed="0.088557">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:39.277884" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:15:39.167803" elapsed="0.110187">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:15:40.297236" elapsed="0.000433"/>
</kw>
<msg time="2026-10-16T01:15:40.297824" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:40.295842" elapsed="0.002099"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:15:40.294801" elapsed="0.003297"/>
</kw>
<msg time="2026-10-16T01:15:40.298187" 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-10-16T01:15:40.288318" elapsed="0.009979"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:15:40.287441" elapsed="0.011010"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:40.299564" 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-10-16T01:15:40.299021" elapsed="0.000635"/>
</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-10-16T01:15:40.306338" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:40.305527" elapsed="0.000869"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:40.307386" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:40.306757" elapsed="0.000684"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:40.307536" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:15:40.307855" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:40.304696" elapsed="0.003211"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:15:40.308235" elapsed="0.000320"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:40.309876" 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-10-16T01:15:40.308951" elapsed="0.000981"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:40.310829" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:40.310262" elapsed="0.000622"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:40.311753" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:40.311195" elapsed="0.000614"/>
</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-10-16T01:15:40.320464" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:15:40.319063" elapsed="0.001511"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:15:40.320777" elapsed="0.000139"/>
</return>
<msg time="2026-10-16T01:15:40.321365" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:15:40.315798" elapsed="0.005697"/>
</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-10-16T01:15:40.345145" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:40.344722" elapsed="0.000459"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:15:40.346151" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:15:40.345867" elapsed="0.000378">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:40.346379" 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-10-16T01:15:40.345410" elapsed="0.001001"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:40.347116" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:40.346643" elapsed="0.000508"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:15:40.347542" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:15:40.347752" 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-10-16T01:15:40.347386" elapsed="0.000400"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:40.348369" 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-10-16T01:15:40.348049" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:40.351543" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:40.351306" elapsed="0.000279"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:15:40.352036" 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-10-16T01:15:40.351778" elapsed="0.000282"/>
</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-10-16T01:15:40.352355" 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-10-16T01:15:40.352537" elapsed="0.000022"/>
</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-10-16T01:15:40.352730" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:15:40.352214" elapsed="0.000569"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:15:40.352104" elapsed="0.000707"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:15:40.352852" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:15:40.352980" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:15:40.350798" elapsed="0.002205"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:40.350402" elapsed="0.002630"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:40.353204" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:40.353057" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:40.348488" elapsed="0.004797"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:15:40.353837" 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-10-16T01:15:40.353438" elapsed="0.000457"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:15:40.353942" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:15:40.343997" elapsed="0.010047"/>
</kw>
<msg time="2026-10-16T01:15:40.354092" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:40.338382" elapsed="0.015756"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:40.357907" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:40.361764" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:40.365573" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:40.365764" elapsed="0.000020"/>
</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-10-16T01:15:40.365942" elapsed="0.000019"/>
</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-10-16T01:15:40.366286" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:40.366137" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:40.366124" 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-10-16T01:15:40.366512" elapsed="0.000019"/>
</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-10-16T01:15:40.366687" elapsed="0.000033"/>
</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-10-16T01:15:40.366861" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:15:40.366098" elapsed="0.000811"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:15:40.366009" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:40.367078" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:40.367146" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:15:40.367249" 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-10-16T01:15:40.337532" elapsed="0.029751"/>
</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-10-16T01:15:40.368415" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:40.368210" elapsed="0.000266">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:40.368559" 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-10-16T01:15:40.367889" elapsed="0.000693"/>
</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-10-16T01:15:40.368876" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:40.368645" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:15:40.369391" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:40.369109" elapsed="0.000307"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:40.368952" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:40.368628" elapsed="0.000840"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:40.369981" 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-10-16T01:15:40.369625" elapsed="0.000382"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:15:40.370053" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:15:40.370176" 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-manganese/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-10-16T01:15:40.367543" elapsed="0.002656"/>
</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-10-16T01:15:40.371300" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:40.371089" elapsed="0.000271">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:40.371442" 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-10-16T01:15:40.370774" elapsed="0.000691"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:15:40.371812" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:15:40.371690" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:40.371511" elapsed="0.000380"/>
</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-10-16T01:15:40.372041" elapsed="0.000020"/>
</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-10-16T01:15:40.372218" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:40.372292" elapsed="0.000016"/>
</return>
<msg time="2026-10-16T01:15:40.372431" 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-manganese/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-10-16T01:15:40.370457" elapsed="0.001998"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:40.373727" 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-10-16T01:15:40.373479" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:40.374184" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:40.373961" elapsed="0.000265"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:15:40.380000" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:15:40.380078" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:15:40.380216" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:40.374581" elapsed="0.006022">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:40.374314" elapsed="0.006424">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:40.380932" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:40.380774" elapsed="0.000217"/>
</branch>
<status status="FAIL" start="2026-10-16T01:15:40.374291" elapsed="0.006722">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:40.381386" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:40.381508" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:40.381475" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:40.381459" elapsed="0.000108"/>
</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-10-16T01:15:40.381717" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:15:40.381783" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:15:40.372750" elapsed="0.009136">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:40.381954" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:15:40.327897" elapsed="0.054192">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:15:40.382498" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:40.382262" elapsed="0.000320"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:40.382214" elapsed="0.000408"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:40.382730" elapsed="0.000037"/>
</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="FAIL" start="2026-10-16T01:15:40.325731" elapsed="0.057170">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:40.321999" elapsed="0.061002">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:15:40.321956" elapsed="0.061119">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:40.383334" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:15:40.383683" elapsed="0.000038"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:40.384013" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:15:40.384383" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:15:40.384843" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:40.385159" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:40.385525" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:15:40.385805" elapsed="0.000019"/>
</return>
<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="FAIL" start="2026-10-16T01:15:40.314454" elapsed="0.071454">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:15:40.386001" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:15:40.312630" elapsed="0.073465">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:40.386331" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:40.386176" elapsed="0.000207"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:40.386541" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:40.386405" elapsed="0.000185"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:40.386779" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:40.386612" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:40.386160" elapsed="0.000689"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:15:40.312297" elapsed="0.074591">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:15:40.311905" elapsed="0.075037">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:40.386990" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:15:40.303228" elapsed="0.083854">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:40.387255" elapsed="0.000031"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:40.387487" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:40.387347" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:40.387331" elapsed="0.000224"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:40.387679" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:40.387971" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:40.388030" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:15:40.301636" elapsed="0.086487">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:15:40.301165" elapsed="0.087021">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:15:40.300924" elapsed="0.087311">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:15:40.300130" elapsed="0.088203">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:40.388542" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:15:40.278799" elapsed="0.109848">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:15:41.407690" elapsed="0.000437"/>
</kw>
<msg time="2026-10-16T01:15:41.408240" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:41.406402" elapsed="0.002125"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:15:41.405422" elapsed="0.003274"/>
</kw>
<msg time="2026-10-16T01:15:41.408822" 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-10-16T01:15:41.398755" elapsed="0.010158"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:15:41.397884" elapsed="0.011177"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:41.410134" 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-10-16T01:15:41.409556" elapsed="0.000670"/>
</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-10-16T01:15:41.416962" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:41.416154" elapsed="0.000866"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:41.418014" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:41.417376" elapsed="0.000691"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:41.418162" elapsed="0.000065"/>
</return>
<msg time="2026-10-16T01:15:41.418477" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:41.415190" elapsed="0.003338"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:15:41.418886" elapsed="0.000285"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:41.420281" 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-10-16T01:15:41.419562" elapsed="0.000778"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:41.421196" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:41.420664" elapsed="0.000586"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:41.422120" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:41.421581" elapsed="0.000593"/>
</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-10-16T01:15:41.430970" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:15:41.429542" elapsed="0.001539"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:15:41.431213" elapsed="0.000158"/>
</return>
<msg time="2026-10-16T01:15:41.431851" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:15:41.426249" elapsed="0.005732"/>
</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-10-16T01:15:41.456779" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:41.456334" elapsed="0.000482"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:15:41.457803" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:15:41.457497" elapsed="0.000402">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:41.458021" 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-10-16T01:15:41.457031" elapsed="0.001022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:41.458757" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:41.458301" elapsed="0.000493"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:15:41.459177" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:15:41.459432" 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-10-16T01:15:41.459020" elapsed="0.000446"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:41.460066" 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-10-16T01:15:41.459752" elapsed="0.000371"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:41.461586" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:41.461061" elapsed="0.000584"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:15:41.462279" 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-10-16T01:15:41.461909" elapsed="0.000405"/>
</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-10-16T01:15:41.462724" elapsed="0.000031"/>
</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-10-16T01:15:41.462982" 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-10-16T01:15:41.463233" elapsed="0.000044"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:15:41.462526" elapsed="0.000798"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:15:41.462376" elapsed="0.000987"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:15:41.463419" elapsed="0.000036"/>
</return>
<msg time="2026-10-16T01:15:41.463600" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:15:41.460572" elapsed="0.003060"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:41.460210" elapsed="0.003480"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:41.463947" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:41.463743" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:41.460185" elapsed="0.003860"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:15:41.464640" 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-10-16T01:15:41.464239" elapsed="0.000427"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:15:41.464725" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:15:41.455601" elapsed="0.009225"/>
</kw>
<msg time="2026-10-16T01:15:41.464872" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:41.449980" elapsed="0.014939"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:41.468824" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:41.472625" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:41.476424" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:41.476635" 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-10-16T01:15:41.476831" 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-10-16T01:15:41.477176" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:41.477034" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:41.477020" 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-10-16T01:15:41.477417" 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-10-16T01:15:41.477593" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:41.477769" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:15:41.476994" elapsed="0.000825"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:15:41.476902" elapsed="0.000941"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:41.477992" elapsed="0.000029"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:41.478070" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:15:41.478174" 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-10-16T01:15:41.449126" elapsed="0.029072"/>
</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-10-16T01:15:41.479325" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:41.479105" elapsed="0.000279">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:41.479467" 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-10-16T01:15:41.478784" elapsed="0.000706"/>
</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-10-16T01:15:41.479787" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:41.479553" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:15:41.480301" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:41.480021" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:41.479863" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:41.479536" elapsed="0.000841"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:41.480889" 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-10-16T01:15:41.480534" elapsed="0.000380"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:15:41.480959" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:15:41.481082" 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-manganese/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-10-16T01:15:41.478470" elapsed="0.002634"/>
</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-10-16T01:15:41.482195" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:41.481994" elapsed="0.000272">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:41.482352" 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-10-16T01:15:41.481660" elapsed="0.000715"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:15:41.482544" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:15:41.482439" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:41.482422" elapsed="0.000198"/>
</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-10-16T01:15:41.482789" 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-10-16T01:15:41.483020" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:41.483082" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:15:41.483209" 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-manganese/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-10-16T01:15:41.481362" elapsed="0.001871"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:41.484645" 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-10-16T01:15:41.484418" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:41.485113" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:41.484893" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:15:41.489948" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:15:41.490000" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:15:41.490098" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:41.485447" elapsed="0.005012">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:41.485213" elapsed="0.005324">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:41.490736" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:41.490569" elapsed="0.000227"/>
</branch>
<status status="FAIL" start="2026-10-16T01:15:41.485197" elapsed="0.005621">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:41.491159" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:41.491294" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:41.491246" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:41.491230" 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-10-16T01:15:41.491489" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:15:41.491551" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:15:41.483688" elapsed="0.007965">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:41.491740" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:15:41.439439" elapsed="0.052428">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:15:41.492250" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:41.492033" elapsed="0.000314"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:41.491987" elapsed="0.000400"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:41.492468" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:15:41.436651" elapsed="0.056018">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:41.432472" elapsed="0.060324">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:15:41.432428" elapsed="0.060446">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:41.493130" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:15:41.493499" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:41.493830" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:15:41.494177" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:15:41.494609" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:41.494946" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:41.495303" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:15:41.495539" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:15:41.424880" elapsed="0.070761">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:15:41.495740" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:15:41.423027" elapsed="0.072805">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:41.496058" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:41.495912" elapsed="0.000197"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:41.496278" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:41.496131" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:41.496492" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:41.496351" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:41.495896" elapsed="0.000664"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:15:41.422668" elapsed="0.073942">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:15:41.422289" elapsed="0.074375">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:41.496737" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:15:41.413831" elapsed="0.083000">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:41.497004" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:41.497222" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:41.497082" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:41.497067" elapsed="0.000239"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:41.497465" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:41.497635" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:41.497694" elapsed="0.000099"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:15:41.412199" elapsed="0.085676">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:15:41.411753" elapsed="0.086185">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:15:41.411480" elapsed="0.086507">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:15:41.410687" elapsed="0.087381">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:41.498295" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:15:41.389339" elapsed="0.109061">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:15:42.517416" elapsed="0.000432"/>
</kw>
<msg time="2026-10-16T01:15:42.517959" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:42.516137" elapsed="0.001935"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:15:42.515196" elapsed="0.003030"/>
</kw>
<msg time="2026-10-16T01:15:42.518340" 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-10-16T01:15:42.508455" elapsed="0.009976"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:15:42.507577" elapsed="0.011004"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:42.519650" 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-10-16T01:15:42.519082" elapsed="0.000694"/>
</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-10-16T01:15:42.526316" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:42.525520" elapsed="0.000855"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:42.527367" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:42.526739" elapsed="0.000681"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:42.527514" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:15:42.527840" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:42.524691" elapsed="0.003202"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:15:42.528221" elapsed="0.000323"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:42.529632" 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-10-16T01:15:42.528944" elapsed="0.000743"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:42.530577" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:42.530047" elapsed="0.000583"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:42.531625" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:42.530969" elapsed="0.000710"/>
</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-10-16T01:15:42.540568" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:15:42.539161" elapsed="0.001519"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:15:42.540858" elapsed="0.000136"/>
</return>
<msg time="2026-10-16T01:15:42.541444" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:15:42.535853" elapsed="0.005715"/>
</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-10-16T01:15:42.565719" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:42.565275" elapsed="0.000482"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:15:42.566734" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:15:42.566427" elapsed="0.000402">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:42.566961" 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-10-16T01:15:42.565974" elapsed="0.001019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:42.567668" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:42.567226" elapsed="0.000499"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:15:42.568116" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:15:42.568327" 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-10-16T01:15:42.567952" elapsed="0.000409"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:42.568961" 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-10-16T01:15:42.568629" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:42.570476" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:42.569958" elapsed="0.000577"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:15:42.571161" 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-10-16T01:15:42.570806" elapsed="0.000390"/>
</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-10-16T01:15:42.571605" elapsed="0.000029"/>
</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-10-16T01:15:42.571889" elapsed="0.000032"/>
</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-10-16T01:15:42.572143" elapsed="0.000026"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:15:42.571426" elapsed="0.000788"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:15:42.571273" elapsed="0.000983"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:15:42.572297" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:15:42.572425" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:15:42.569468" elapsed="0.002983"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:42.569103" elapsed="0.003376"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:42.572653" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:42.572504" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:42.569080" elapsed="0.003663"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:15:42.573303" 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-10-16T01:15:42.572901" elapsed="0.000427"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:15:42.573371" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:15:42.564551" elapsed="0.008919"/>
</kw>
<msg time="2026-10-16T01:15:42.573550" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:42.558961" elapsed="0.014636"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:42.577392" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:42.581169" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:42.584950" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:42.585128" elapsed="0.000020"/>
</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-10-16T01:15:42.585323" elapsed="0.000019"/>
</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-10-16T01:15:42.585662" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:42.585521" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:42.585507" elapsed="0.000244"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:42.585904" elapsed="0.000019"/>
</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-10-16T01:15:42.586080" elapsed="0.000018"/>
</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-10-16T01:15:42.586253" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:15:42.585481" elapsed="0.000823"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:15:42.585391" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:42.586475" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:42.586541" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:15:42.586644" 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-10-16T01:15:42.558097" elapsed="0.028571"/>
</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-10-16T01:15:42.587778" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:42.587574" elapsed="0.000263">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:42.587953" 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-10-16T01:15:42.587251" elapsed="0.000728"/>
</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-10-16T01:15:42.588272" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:42.588043" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:15:42.588794" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:42.588507" elapsed="0.000312"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:42.588348" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:42.588026" elapsed="0.000845"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:42.589383" 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-10-16T01:15:42.589027" elapsed="0.000381"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:15:42.589453" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:15:42.589574" 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-manganese/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-10-16T01:15:42.586944" elapsed="0.002653"/>
</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-10-16T01:15:42.590685" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:42.590486" elapsed="0.000278">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:42.590847" 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-10-16T01:15:42.590154" elapsed="0.000716"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:15:42.591038" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:15:42.590933" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:42.590917" elapsed="0.000199"/>
</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-10-16T01:15:42.591280" 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-10-16T01:15:42.591455" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:42.591515" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:15:42.591639" 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-manganese/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-10-16T01:15:42.589858" elapsed="0.001804"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:42.593067" 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-10-16T01:15:42.592837" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:42.593527" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:42.593310" elapsed="0.000258"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:15:42.598363" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:15:42.598415" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:15:42.598512" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:42.593868" elapsed="0.005016">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:42.593628" elapsed="0.005335">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:42.599147" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:42.598994" elapsed="0.000258"/>
</branch>
<status status="FAIL" start="2026-10-16T01:15:42.593611" elapsed="0.005668">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:42.599620" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:42.599762" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:42.599726" elapsed="0.000075"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:42.599693" elapsed="0.000129"/>
</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-10-16T01:15:42.599958" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:15:42.600021" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:15:42.592119" elapsed="0.008003">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:42.600190" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:15:42.548352" elapsed="0.051976">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:15:42.600735" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:42.600495" elapsed="0.000326"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:42.600448" elapsed="0.000413"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:42.600946" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:15:42.546126" elapsed="0.054983">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:42.542201" elapsed="0.059011">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:15:42.542157" elapsed="0.059145">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:42.601549" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:15:42.601913" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:42.602224" elapsed="0.000034"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:15:42.602591" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:15:42.603049" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:42.603378" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:42.603754" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:15:42.603994" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:15:42.534387" elapsed="0.069707">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:15:42.604156" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:15:42.532550" elapsed="0.071706">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:42.604510" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:42.604370" elapsed="0.000190"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:42.604742" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:42.604582" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:42.604960" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:42.604819" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:42.604353" elapsed="0.000675"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:15:42.532195" elapsed="0.072871">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:15:42.531813" elapsed="0.073305">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:42.605165" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:15:42.523341" elapsed="0.081938">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:42.605456" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:42.605674" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:42.605534" elapsed="0.000275"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:42.605519" elapsed="0.000314"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:42.605962" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:42.606130" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:42.606188" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:15:42.521746" elapsed="0.084545">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:15:42.521273" elapsed="0.085087">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:15:42.521010" elapsed="0.085398">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:15:42.520217" elapsed="0.086273">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:42.606696" elapsed="0.000092"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:15:42.499120" elapsed="0.107753">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:15:43.626628" elapsed="0.000490"/>
</kw>
<msg time="2026-10-16T01:15:43.627260" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:43.625366" elapsed="0.002019"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:15:43.624429" elapsed="0.003114"/>
</kw>
<msg time="2026-10-16T01:15:43.627770" 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-10-16T01:15:43.617634" elapsed="0.010232"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:15:43.616745" elapsed="0.011271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:43.629079" 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-10-16T01:15:43.628527" elapsed="0.000645"/>
</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-10-16T01:15:43.637422" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:43.636196" elapsed="0.001286"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:43.638499" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:43.637857" elapsed="0.000696"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:43.638648" elapsed="0.000094"/>
</return>
<msg time="2026-10-16T01:15:43.638974" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:43.635035" elapsed="0.003989"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:15:43.639385" elapsed="0.000298"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:43.640826" 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-10-16T01:15:43.640089" elapsed="0.000793"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:43.641776" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:43.641208" elapsed="0.000623"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:43.642664" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:43.642142" elapsed="0.000610"/>
</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-10-16T01:15:43.652317" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:15:43.650898" elapsed="0.001531"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:15:43.652557" elapsed="0.000133"/>
</return>
<msg time="2026-10-16T01:15:43.653165" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:15:43.647571" elapsed="0.005747"/>
</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-10-16T01:15:43.677686" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:43.677262" elapsed="0.000480"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:15:43.678743" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:15:43.678423" elapsed="0.000424">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:43.678991" 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-10-16T01:15:43.677960" elapsed="0.001064"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:43.679734" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:43.679280" elapsed="0.000490"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:15:43.680156" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:15:43.680349" 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-10-16T01:15:43.679998" elapsed="0.000375"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:43.680863" 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-10-16T01:15:43.680561" elapsed="0.000342"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:43.683516" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:43.683273" elapsed="0.000286"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:15:43.684010" 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-10-16T01:15:43.683749" 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-10-16T01:15:43.684333" 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-10-16T01:15:43.684516" 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-10-16T01:15:43.684697" elapsed="0.000035"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:15:43.684190" elapsed="0.000575"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:15:43.684080" elapsed="0.000713"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:15:43.684833" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:15:43.684965" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:15:43.682915" elapsed="0.002074"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:43.682638" elapsed="0.002380"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:43.685185" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:43.685043" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:43.680949" elapsed="0.004321"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:15:43.685834" 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-10-16T01:15:43.685423" elapsed="0.000437"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:15:43.685904" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:15:43.676533" elapsed="0.009471"/>
</kw>
<msg time="2026-10-16T01:15:43.686050" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:43.670916" elapsed="0.015180"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:43.689908" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:43.693725" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:43.697523" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:43.697718" 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-10-16T01:15:43.697899" 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-10-16T01:15:43.698301" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:43.698098" elapsed="0.000256"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:43.698084" elapsed="0.000293"/>
</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-10-16T01:15:43.698529" elapsed="0.000019"/>
</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-10-16T01:15:43.698722" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:43.698884" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:15:43.698058" elapsed="0.000874"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:15:43.697969" elapsed="0.000986"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:43.699103" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:43.699169" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:15:43.699286" 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-10-16T01:15:43.670029" elapsed="0.029281"/>
</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-10-16T01:15:43.700426" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:43.700208" elapsed="0.000279">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:43.700571" 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-10-16T01:15:43.699884" elapsed="0.000710"/>
</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-10-16T01:15:43.700893" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:43.700658" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:15:43.701416" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:43.701137" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:43.700968" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:43.700641" elapsed="0.000852"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:43.702006" 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-10-16T01:15:43.701650" elapsed="0.000380"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:15:43.702076" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:15:43.702200" 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-manganese/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-10-16T01:15:43.699566" elapsed="0.002670"/>
</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-10-16T01:15:43.703322" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:43.703110" elapsed="0.000272">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:43.703465" 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-10-16T01:15:43.702793" elapsed="0.000695"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:15:43.703837" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:15:43.703732" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:43.703535" elapsed="0.000382"/>
</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-10-16T01:15:43.704068" 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-10-16T01:15:43.704273" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:43.704337" elapsed="0.000028"/>
</return>
<msg time="2026-10-16T01:15:43.704480" 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-manganese/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-10-16T01:15:43.702480" elapsed="0.002065"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:43.705794" 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-10-16T01:15:43.705551" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:43.706252" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:43.706023" elapsed="0.000270"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:15:43.711419" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:15:43.711477" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:15:43.711582" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:43.706576" elapsed="0.005386">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:43.706353" elapsed="0.005688">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:43.712240" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:43.712072" elapsed="0.000229"/>
</branch>
<status status="FAIL" start="2026-10-16T01:15:43.706336" elapsed="0.005987">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:43.712657" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:43.712799" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:43.712764" elapsed="0.000074"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:43.712747" elapsed="0.000111"/>
</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-10-16T01:15:43.712993" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:15:43.713056" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:15:43.704840" elapsed="0.008318">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:43.713239" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:15:43.660017" elapsed="0.053359">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:15:43.713789" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:43.713545" elapsed="0.000330"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:43.713496" elapsed="0.000421"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:43.714003" elapsed="0.000038"/>
</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="FAIL" start="2026-10-16T01:15:43.657769" elapsed="0.056405">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:43.654020" elapsed="0.060305">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:15:43.653956" elapsed="0.060448">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:43.714656" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:15:43.715025" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:43.715358" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:15:43.715733" elapsed="0.000024"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:15:43.716163" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:43.716495" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:43.716875" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:15:43.717116" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:15:43.646049" elapsed="0.071169">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:15:43.717292" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:15:43.643584" elapsed="0.073797">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:43.717616" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:43.717460" elapsed="0.000207"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:43.717862" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:43.717722" elapsed="0.000190"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:43.718075" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:43.717934" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:43.717445" elapsed="0.000699"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:15:43.643220" elapsed="0.074962">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:15:43.642851" elapsed="0.075397">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:43.718302" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:15:43.633155" elapsed="0.085238">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:43.718566" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:43.718866" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:43.718644" elapsed="0.000271"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:43.718629" elapsed="0.000308"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:43.719063" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:43.719245" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:43.719305" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:15:43.631166" elapsed="0.088264">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:15:43.630683" elapsed="0.088810">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:15:43.630438" elapsed="0.089103">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:15:43.629638" elapsed="0.089983">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:43.719906" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:15:43.607697" elapsed="0.112316">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:15:44.738610" elapsed="0.000416"/>
</kw>
<msg time="2026-10-16T01:15:44.739126" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:44.737363" elapsed="0.001889"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:15:44.736360" elapsed="0.003049"/>
</kw>
<msg time="2026-10-16T01:15:44.739499" 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-10-16T01:15:44.729876" elapsed="0.009713"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:15:44.729003" elapsed="0.010765"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:44.740792" 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-10-16T01:15:44.740247" elapsed="0.000637"/>
</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-10-16T01:15:44.747411" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:44.746617" elapsed="0.000852"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:44.748466" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:44.747833" elapsed="0.000687"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:44.748612" elapsed="0.000060"/>
</return>
<msg time="2026-10-16T01:15:44.748932" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:44.745810" elapsed="0.003173"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:15:44.749339" elapsed="0.000282"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:44.750747" 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-10-16T01:15:44.750022" elapsed="0.000781"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:44.751657" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:44.751130" elapsed="0.000612"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:44.752587" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:44.752055" elapsed="0.000585"/>
</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-10-16T01:15:44.761289" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:15:44.759881" elapsed="0.001592"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:15:44.761606" elapsed="0.000170"/>
</return>
<msg time="2026-10-16T01:15:44.762204" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:15:44.756642" elapsed="0.005715"/>
</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-10-16T01:15:44.786253" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:44.785810" elapsed="0.000481"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:15:44.787246" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:15:44.786970" elapsed="0.000367">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:44.787454" 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-10-16T01:15:44.786507" elapsed="0.000979"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:44.788172" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:44.787740" elapsed="0.000490"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:15:44.788621" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:15:44.788818" 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-10-16T01:15:44.788458" elapsed="0.000394"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:44.789527" 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-10-16T01:15:44.789117" elapsed="0.000468"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:44.791048" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:44.790523" elapsed="0.000583"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:15:44.791605" 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-10-16T01:15:44.791349" elapsed="0.000281"/>
</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-10-16T01:15:44.791928" elapsed="0.000020"/>
</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-10-16T01:15:44.792111" elapsed="0.000022"/>
</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-10-16T01:15:44.792304" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:15:44.791798" elapsed="0.000560"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:15:44.791673" elapsed="0.000851"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:15:44.792564" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:15:44.792695" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:15:44.790034" elapsed="0.002699"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:44.789670" elapsed="0.003094"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:44.792930" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:44.792787" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:44.789647" elapsed="0.003353"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:15:44.793548" 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-10-16T01:15:44.793151" elapsed="0.000422"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:15:44.793618" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:15:44.785075" elapsed="0.008658"/>
</kw>
<msg time="2026-10-16T01:15:44.793813" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:44.779428" elapsed="0.014433"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:44.797636" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:44.801451" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:44.805226" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:44.805404" elapsed="0.000020"/>
</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-10-16T01:15:44.805581" 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-10-16T01:15:44.805939" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:44.805799" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:44.805784" elapsed="0.000228"/>
</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-10-16T01:15:44.806164" elapsed="0.000019"/>
</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-10-16T01:15:44.806354" 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-10-16T01:15:44.806521" elapsed="0.000024"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:15:44.805757" elapsed="0.000817"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:15:44.805649" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:44.806764" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:44.806833" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:15:44.806937" 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-10-16T01:15:44.778571" elapsed="0.028390"/>
</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-10-16T01:15:44.808059" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:44.807864" elapsed="0.000255">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:44.808202" 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-10-16T01:15:44.807527" elapsed="0.000713"/>
</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-10-16T01:15:44.808519" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:44.808304" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:15:44.809069" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:44.808804" elapsed="0.000290"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:44.808629" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:44.808288" elapsed="0.000858"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:44.809658" 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-10-16T01:15:44.809316" elapsed="0.000366"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:15:44.809744" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:15:44.809869" 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-manganese/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-10-16T01:15:44.807230" elapsed="0.002661"/>
</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-10-16T01:15:44.810989" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:44.810787" elapsed="0.000261">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:44.811130" 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-10-16T01:15:44.810449" elapsed="0.000704"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:15:44.811335" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:15:44.811229" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:44.811199" elapsed="0.000212"/>
</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-10-16T01:15:44.811559" elapsed="0.000020"/>
</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-10-16T01:15:44.811748" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:44.811809" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:15:44.811932" 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-manganese/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-10-16T01:15:44.810133" elapsed="0.001822"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:44.813363" 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-10-16T01:15:44.813123" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:44.813827" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:44.813590" elapsed="0.000278"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:15:44.819076" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:15:44.819126" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:15:44.819235" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:44.814149" elapsed="0.005413">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:44.813928" elapsed="0.005709">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:44.819841" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:44.819668" elapsed="0.000233"/>
</branch>
<status status="FAIL" start="2026-10-16T01:15:44.813911" elapsed="0.006012">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:44.820268" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:44.820426" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:44.820392" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:44.820375" elapsed="0.000109"/>
</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-10-16T01:15:44.820618" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:15:44.820680" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:15:44.812409" elapsed="0.008392">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:44.820870" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:15:44.768809" elapsed="0.052186">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:15:44.821399" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:44.821164" elapsed="0.000318"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:44.821115" elapsed="0.000406"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:44.821605" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:15:44.766658" elapsed="0.055135">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:44.762856" elapsed="0.059039">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:15:44.762813" elapsed="0.059154">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:44.822229" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:15:44.822575" elapsed="0.000024"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:44.822906" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:15:44.823273" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:15:44.823695" elapsed="0.000048"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:44.824037" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:44.824396" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:15:44.824661" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:15:44.755317" elapsed="0.069480">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:15:44.824859" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:15:44.753493" elapsed="0.071455">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:44.825171" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:44.825028" elapsed="0.000207"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:44.825429" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:44.825258" elapsed="0.000222"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:44.825642" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:44.825502" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:44.825012" elapsed="0.000725"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:15:44.753138" elapsed="0.072639">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:15:44.752768" elapsed="0.073062">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:44.825879" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:15:44.744426" elapsed="0.081544">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:44.826145" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:44.826379" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:44.826237" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:44.826220" elapsed="0.000226"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:44.826570" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:44.826856" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:44.826917" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:15:44.742839" elapsed="0.084171">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:15:44.742360" elapsed="0.084712">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:15:44.742106" elapsed="0.085015">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:15:44.741342" elapsed="0.085859">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:44.827425" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:15:44.720616" elapsed="0.106912">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:15:45.846451" elapsed="0.000428"/>
</kw>
<msg time="2026-10-16T01:15:45.846992" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:45.845184" elapsed="0.001921"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:15:45.844273" elapsed="0.003009"/>
</kw>
<msg time="2026-10-16T01:15:45.847377" 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-10-16T01:15:45.837791" elapsed="0.009677"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:15:45.836911" elapsed="0.010704"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:45.848799" 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-10-16T01:15:45.848246" elapsed="0.000648"/>
</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-10-16T01:15:45.855495" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:45.854737" elapsed="0.000816"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:45.856558" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:45.855919" elapsed="0.000693"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:45.856736" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:15:45.857025" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:45.853897" elapsed="0.003178"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:15:45.857426" elapsed="0.000311"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:45.858851" 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-10-16T01:15:45.858108" elapsed="0.000799"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:45.859799" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:45.859256" elapsed="0.000598"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:45.860686" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:45.860164" elapsed="0.000605"/>
</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-10-16T01:15:45.869488" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:15:45.868119" elapsed="0.001475"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:15:45.869962" elapsed="0.000137"/>
</return>
<msg time="2026-10-16T01:15:45.870552" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:15:45.864868" elapsed="0.005809"/>
</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-10-16T01:15:45.894364" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:45.893926" elapsed="0.000474"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:15:45.895385" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:15:45.895077" elapsed="0.000404">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:45.895599" 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-10-16T01:15:45.894613" elapsed="0.001016"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:45.896459" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:45.896003" elapsed="0.000492"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:15:45.896905" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:15:45.897095" 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-10-16T01:15:45.896747" elapsed="0.000381"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:45.897737" 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-10-16T01:15:45.897413" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:45.899252" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:45.898736" elapsed="0.000569"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:15:45.899787" 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-10-16T01:15:45.899476" elapsed="0.000336"/>
</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-10-16T01:15:45.900111" 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-10-16T01:15:45.900304" elapsed="0.000022"/>
</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-10-16T01:15:45.900484" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:15:45.899982" elapsed="0.000553"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:15:45.899856" elapsed="0.000706"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:15:45.900602" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:15:45.900747" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:15:45.898240" elapsed="0.002531"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:45.897883" elapsed="0.002917"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:45.900967" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:45.900825" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:45.897858" elapsed="0.003178"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:15:45.901587" 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-10-16T01:15:45.901186" elapsed="0.000426"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:15:45.901655" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:15:45.893215" elapsed="0.008555"/>
</kw>
<msg time="2026-10-16T01:15:45.901816" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:45.887522" elapsed="0.014340"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:45.905632" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:45.909440" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:45.913209" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:45.913390" elapsed="0.000019"/>
</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-10-16T01:15:45.913565" elapsed="0.000019"/>
</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-10-16T01:15:45.913914" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:45.913775" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:45.913762" elapsed="0.000225"/>
</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-10-16T01:15:45.914136" elapsed="0.000018"/>
</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-10-16T01:15:45.914324" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:45.914517" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:15:45.913734" elapsed="0.000832"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:15:45.913632" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:45.914750" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:45.914819" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:15:45.914923" 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-10-16T01:15:45.886665" elapsed="0.028281"/>
</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-10-16T01:15:45.916041" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:45.915845" elapsed="0.000257">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:45.916184" 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-10-16T01:15:45.915511" elapsed="0.000712"/>
</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-10-16T01:15:45.916505" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:45.916286" elapsed="0.000271"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:15:45.917017" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:45.916753" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:45.916580" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:45.916270" elapsed="0.000822"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:45.917595" 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-10-16T01:15:45.917261" elapsed="0.000358"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:15:45.917664" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:15:45.917803" 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-manganese/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-10-16T01:15:45.915216" elapsed="0.002610"/>
</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-10-16T01:15:45.918918" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:45.918717" elapsed="0.000259">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:45.919059" 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-10-16T01:15:45.918379" elapsed="0.000712"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:15:45.919268" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:15:45.919155" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:45.919138" elapsed="0.000212"/>
</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-10-16T01:15:45.919512" 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-10-16T01:15:45.919682" elapsed="0.000037"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:45.919762" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:15:45.919886" 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-manganese/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-10-16T01:15:45.918074" elapsed="0.001835"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:45.921303" 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-10-16T01:15:45.921066" elapsed="0.000279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:45.921809" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:45.921572" elapsed="0.000278"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:15:45.926860" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:15:45.926912" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:15:45.927009" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:45.922129" elapsed="0.005241">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:45.921910" elapsed="0.005538">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:45.927629" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:45.927479" elapsed="0.000210"/>
</branch>
<status status="FAIL" start="2026-10-16T01:15:45.921894" elapsed="0.005836">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:45.928063" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:45.928183" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:45.928150" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:45.928134" 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-10-16T01:15:45.928394" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:15:45.928457" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:15:45.920357" elapsed="0.008201">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:45.928626" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:15:45.876986" elapsed="0.051781">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:15:45.929156" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:45.928937" elapsed="0.000318"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:45.928889" elapsed="0.000408"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:45.929380" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:15:45.874806" elapsed="0.054740">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:45.871164" elapsed="0.058483">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:15:45.871122" elapsed="0.058623">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:45.929993" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:15:45.930386" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:45.930717" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:15:45.931068" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:15:45.931513" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:45.931857" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:45.932217" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:15:45.932456" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:15:45.863491" elapsed="0.069066">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:15:45.932618" elapsed="0.000014"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:15:45.861639" elapsed="0.071126">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:45.932988" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:45.932848" elapsed="0.000196"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:45.933217" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:45.933066" elapsed="0.000201"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:45.933438" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:45.933289" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:45.932832" elapsed="0.000674"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:15:45.861307" elapsed="0.072237">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:15:45.860891" elapsed="0.072704">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:45.933644" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:15:45.852511" elapsed="0.081345">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:45.934032" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:45.934262" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:45.934110" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:45.934094" elapsed="0.000238"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:45.934456" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:45.934621" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:45.934679" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:15:45.850879" elapsed="0.083909">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:15:45.850405" elapsed="0.084444">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:15:45.850142" elapsed="0.084790">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:15:45.849364" elapsed="0.085651">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:45.935244" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:15:45.828268" elapsed="0.107087">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:15:46.947564" elapsed="0.000278"/>
</kw>
<msg time="2026-10-16T01:15:46.947916" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:46.946789" elapsed="0.001201"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:15:46.946220" elapsed="0.001869"/>
</kw>
<msg time="2026-10-16T01:15:46.948147" 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-10-16T01:15:46.941981" elapsed="0.006240"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:15:46.941441" elapsed="0.006878"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:46.948970" 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-10-16T01:15:46.948626" elapsed="0.000402"/>
</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-10-16T01:15:46.953127" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:46.952639" elapsed="0.000523"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:46.953782" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:46.953386" elapsed="0.000430"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:46.953887" elapsed="0.000038"/>
</return>
<msg time="2026-10-16T01:15:46.954067" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:46.952108" elapsed="0.001990"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:15:46.954319" elapsed="0.000175"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:46.955168" 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-10-16T01:15:46.954740" elapsed="0.000478"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:46.955755" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:46.955420" elapsed="0.000369"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:46.956315" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:46.955987" elapsed="0.000360"/>
</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-10-16T01:15:46.961647" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:15:46.960823" elapsed="0.000922"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:15:46.961825" elapsed="0.000082"/>
</return>
<msg time="2026-10-16T01:15:46.962173" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:15:46.958809" elapsed="0.003460"/>
</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-10-16T01:15:46.984677" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:46.984256" elapsed="0.000479"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:15:46.985726" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:15:46.985420" elapsed="0.000402">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:46.985938" 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-10-16T01:15:46.984949" elapsed="0.001020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:46.986658" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:46.986222" elapsed="0.000471"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:15:46.987093" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:15:46.987302" 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-10-16T01:15:46.986939" elapsed="0.000395"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:46.987931" 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-10-16T01:15:46.987603" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:46.990894" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:46.990645" elapsed="0.000290"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:15:46.991377" 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-10-16T01:15:46.991108" 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-10-16T01:15:46.991679" 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-10-16T01:15:46.991878" 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-10-16T01:15:46.992056" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:15:46.991553" elapsed="0.000555"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:15:46.991444" elapsed="0.000691"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:15:46.992192" elapsed="0.000028"/>
</return>
<msg time="2026-10-16T01:15:46.992329" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:15:46.990290" elapsed="0.002065"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:46.989914" elapsed="0.002470"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:46.992552" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:46.992409" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:46.988047" elapsed="0.004576"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:15:46.993199" 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-10-16T01:15:46.992793" elapsed="0.000433"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:15:46.993270" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:15:46.983525" elapsed="0.009845"/>
</kw>
<msg time="2026-10-16T01:15:46.993417" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:46.977867" elapsed="0.015597"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:46.997307" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:47.001168" elapsed="0.000035"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:47.004983" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:47.005160" elapsed="0.000031"/>
</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-10-16T01:15:47.005350" elapsed="0.000019"/>
</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-10-16T01:15:47.005688" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:47.005548" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:47.005535" elapsed="0.000242"/>
</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-10-16T01:15:47.005929" elapsed="0.000019"/>
</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-10-16T01:15:47.006104" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:47.006276" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:15:47.005509" elapsed="0.000816"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:15:47.005418" elapsed="0.000930"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:47.006496" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:47.006563" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:15:47.006667" 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-10-16T01:15:46.977006" elapsed="0.029685"/>
</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-10-16T01:15:47.007831" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:47.007621" elapsed="0.000270">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:47.007973" 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-10-16T01:15:47.007301" elapsed="0.000694"/>
</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-10-16T01:15:47.008284" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:47.008058" elapsed="0.000278"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:15:47.008800" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:47.008516" elapsed="0.000309"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:47.008359" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:47.008042" elapsed="0.000836"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:47.009384" 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-10-16T01:15:47.009035" elapsed="0.000403"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:15:47.009486" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:15:47.009612" 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-manganese/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-10-16T01:15:47.006994" elapsed="0.002641"/>
</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-10-16T01:15:47.010726" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:47.010522" elapsed="0.000264">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:47.010869" 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-10-16T01:15:47.010205" elapsed="0.000687"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:15:47.011232" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:15:47.011118" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:47.010940" elapsed="0.000369"/>
</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-10-16T01:15:47.011459" elapsed="0.000020"/>
</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-10-16T01:15:47.011631" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:47.011691" elapsed="0.000029"/>
</return>
<msg time="2026-10-16T01:15:47.011834" 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-manganese/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-10-16T01:15:47.009895" elapsed="0.001963"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:47.013072" 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-10-16T01:15:47.012847" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:47.013531" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:47.013313" elapsed="0.000258"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:15:47.018436" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:15:47.018490" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:15:47.018593" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:47.013874" elapsed="0.005094">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:47.013631" elapsed="0.005416">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:47.019240" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:47.019077" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-10-16T01:15:47.013615" elapsed="0.005705">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:47.019651" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:47.019788" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:47.019756" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:47.019739" elapsed="0.000107"/>
</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-10-16T01:15:47.019979" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:15:47.020073" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:15:47.012129" elapsed="0.008062">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:47.020261" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:15:46.967339" elapsed="0.053049">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:15:47.020795" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:47.020554" elapsed="0.000324"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:47.020507" elapsed="0.000411"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:47.021000" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:15:46.965201" elapsed="0.055963">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:46.962554" elapsed="0.058724">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:15:46.962528" elapsed="0.058822">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:47.021592" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:15:47.021951" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:47.022274" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:15:47.022617" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:15:47.023073" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:47.023401" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:47.023771" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:15:47.024007" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:15:46.957987" elapsed="0.066120">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:15:47.024168" elapsed="0.000027"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:15:46.956871" elapsed="0.067400">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:47.024488" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:47.024350" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:47.024697" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:47.024561" elapsed="0.000212"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:47.024935" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:47.024795" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:47.024335" elapsed="0.000699"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:15:46.956646" elapsed="0.068430">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:15:46.956407" elapsed="0.068722">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:47.025193" elapsed="0.000016"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:15:46.951268" elapsed="0.074020">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:47.025463" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:47.025679" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:47.025541" elapsed="0.000269"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:47.025526" elapsed="0.000307"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:47.025959" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:47.026127" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:47.026199" elapsed="0.000015"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:15:46.950273" elapsed="0.076020">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:15:46.949979" elapsed="0.076376">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:15:46.949818" elapsed="0.076584">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:15:46.949324" elapsed="0.077158">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:47.026685" elapsed="0.000094"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:15:46.936035" elapsed="0.090828">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:15:48.045330" elapsed="0.000420"/>
</kw>
<msg time="2026-10-16T01:15:48.045851" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:48.044069" elapsed="0.001887"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:15:48.043138" elapsed="0.002973"/>
</kw>
<msg time="2026-10-16T01:15:48.046225" 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-10-16T01:15:48.036649" elapsed="0.009667"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:15:48.035817" elapsed="0.010649"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:48.047512" 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-10-16T01:15:48.046971" elapsed="0.000632"/>
</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-10-16T01:15:48.054503" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:48.053736" elapsed="0.000825"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:48.055562" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:48.054927" elapsed="0.000690"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:48.055742" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:15:48.056035" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:48.052897" elapsed="0.003189"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:15:48.056439" elapsed="0.000317"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:48.057858" 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-10-16T01:15:48.057126" elapsed="0.000787"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:48.058804" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:48.058261" elapsed="0.000597"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:48.059749" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:48.059188" elapsed="0.000617"/>
</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-10-16T01:15:48.068447" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:15:48.067051" elapsed="0.001505"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:15:48.068682" elapsed="0.000178"/>
</return>
<msg time="2026-10-16T01:15:48.069311" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:15:48.063859" elapsed="0.005578"/>
</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-10-16T01:15:48.094014" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:48.093566" elapsed="0.000484"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:15:48.095009" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:15:48.094748" elapsed="0.000346">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:48.095229" 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-10-16T01:15:48.094278" elapsed="0.000983"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:48.095949" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:48.095497" elapsed="0.000488"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:15:48.096386" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:15:48.096558" 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-10-16T01:15:48.096224" elapsed="0.000367"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:48.097207" 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-10-16T01:15:48.096882" elapsed="0.000383"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:48.098726" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:48.098204" elapsed="0.000583"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:15:48.099401" 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-10-16T01:15:48.099032" elapsed="0.000403"/>
</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-10-16T01:15:48.099843" elapsed="0.000029"/>
</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-10-16T01:15:48.100095" 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-10-16T01:15:48.100408" elapsed="0.000029"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:15:48.099643" elapsed="0.000839"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:15:48.099496" elapsed="0.001024"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:15:48.100576" elapsed="0.000036"/>
</return>
<msg time="2026-10-16T01:15:48.100780" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:15:48.097690" elapsed="0.003124"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:48.097351" elapsed="0.003504"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:48.101088" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:48.100888" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:48.097327" elapsed="0.003877"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:15:48.101808" 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-10-16T01:15:48.101408" elapsed="0.000425"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:15:48.101877" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:15:48.092854" elapsed="0.009122"/>
</kw>
<msg time="2026-10-16T01:15:48.102022" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:48.087143" elapsed="0.014925"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:48.105877" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:48.109655" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:48.113460" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:48.113635" elapsed="0.000020"/>
</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-10-16T01:15:48.113828" elapsed="0.000019"/>
</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-10-16T01:15:48.114175" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:48.114022" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:48.114009" 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-10-16T01:15:48.114400" elapsed="0.000024"/>
</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-10-16T01:15:48.114579" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:48.114753" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:15:48.113983" elapsed="0.000819"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:15:48.113896" elapsed="0.000959"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:48.115009" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:48.115080" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:15:48.115199" 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-10-16T01:15:48.086302" elapsed="0.028922"/>
</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-10-16T01:15:48.116313" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:48.116110" elapsed="0.000263">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:48.116454" 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-10-16T01:15:48.115791" elapsed="0.000686"/>
</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-10-16T01:15:48.116773" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:48.116539" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:15:48.117288" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:48.117011" elapsed="0.000301"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:48.116849" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:48.116523" elapsed="0.000841"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:48.117870" 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-10-16T01:15:48.117520" elapsed="0.000374"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:15:48.117939" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:15:48.118061" 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-manganese/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-10-16T01:15:48.115479" elapsed="0.002605"/>
</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-10-16T01:15:48.119156" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:48.118969" elapsed="0.000258">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:48.119310" 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-10-16T01:15:48.118634" elapsed="0.000698"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:15:48.119498" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:15:48.119395" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:48.119379" elapsed="0.000195"/>
</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-10-16T01:15:48.119738" elapsed="0.000020"/>
</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-10-16T01:15:48.119913" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:48.119973" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:15:48.120096" 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-manganese/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-10-16T01:15:48.118340" elapsed="0.001779"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:48.121528" 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-10-16T01:15:48.121300" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:48.122004" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:48.121784" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:15:48.126507" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:15:48.126587" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:15:48.126681" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:48.122340" elapsed="0.004684">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:48.122103" elapsed="0.004996">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:48.127295" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:48.127130" elapsed="0.000224"/>
</branch>
<status status="FAIL" start="2026-10-16T01:15:48.122087" elapsed="0.005289">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:48.127697" elapsed="0.000043"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:48.127835" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:48.127803" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:48.127787" elapsed="0.000106"/>
</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-10-16T01:15:48.128027" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:15:48.128089" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:15:48.120570" elapsed="0.007631">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:48.128270" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:15:48.076633" elapsed="0.051762">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:15:48.128804" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:48.128559" elapsed="0.000328"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:48.128513" elapsed="0.000414"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:48.129010" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:15:48.073996" elapsed="0.055189">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:48.070133" elapsed="0.059153">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:15:48.070090" elapsed="0.059268">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:48.129601" elapsed="0.000027"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:15:48.129963" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:48.130284" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:15:48.130632" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:15:48.131112" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:48.131436" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:48.131806" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:15:48.132040" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:15:48.062505" elapsed="0.069636">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:15:48.132216" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:15:48.060656" elapsed="0.071650">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:48.132530" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:48.132385" elapsed="0.000196"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:48.132768" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:48.132604" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:48.132985" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:48.132840" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:48.132369" elapsed="0.000684"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:15:48.060324" elapsed="0.072767">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:15:48.059903" elapsed="0.073240">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:48.133204" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:15:48.051386" elapsed="0.081911">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:48.133470" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:48.133688" elapsed="0.000099"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:48.133548" elapsed="0.000270"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:48.133533" elapsed="0.000307"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:48.133971" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:48.134138" elapsed="0.000032"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:48.134211" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:15:48.049577" elapsed="0.084726">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:15:48.049092" elapsed="0.085273">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:15:48.048858" elapsed="0.085555">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:15:48.048071" elapsed="0.086423">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:48.134820" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:15:48.027473" elapsed="0.107454">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:15:49.153426" elapsed="0.000419"/>
</kw>
<msg time="2026-10-16T01:15:49.153949" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:49.152186" elapsed="0.001869"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:15:49.151257" elapsed="0.002972"/>
</kw>
<msg time="2026-10-16T01:15:49.154319" 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-10-16T01:15:49.144767" elapsed="0.009639"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:15:49.143896" elapsed="0.010655"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:49.155597" 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-10-16T01:15:49.155056" elapsed="0.000633"/>
</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-10-16T01:15:49.162422" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:49.161639" elapsed="0.000852"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:49.163486" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:49.162855" elapsed="0.000684"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:49.163633" elapsed="0.000060"/>
</return>
<msg time="2026-10-16T01:15:49.163952" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:49.160813" elapsed="0.003190"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:15:49.164350" elapsed="0.000287"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:49.165778" 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-10-16T01:15:49.165035" elapsed="0.000800"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:49.166684" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:49.166179" elapsed="0.000588"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:49.167622" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:49.167075" elapsed="0.000599"/>
</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-10-16T01:15:49.176287" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:15:49.174874" elapsed="0.001521"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:15:49.176519" elapsed="0.000273"/>
</return>
<msg time="2026-10-16T01:15:49.177242" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:15:49.171637" elapsed="0.005730"/>
</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-10-16T01:15:49.202335" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:49.201893" elapsed="0.000478"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:15:49.203409" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:15:49.203117" elapsed="0.000382">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:49.203623" 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-10-16T01:15:49.202644" elapsed="0.001011"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:49.204361" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:49.203910" elapsed="0.000487"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:15:49.204825" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:15:49.205006" 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-10-16T01:15:49.204624" elapsed="0.000416"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:49.205637" 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-10-16T01:15:49.205327" elapsed="0.000367"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:49.207172" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:49.206629" elapsed="0.000603"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:15:49.207848" 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-10-16T01:15:49.207474" elapsed="0.000409"/>
</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-10-16T01:15:49.208290" elapsed="0.000030"/>
</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-10-16T01:15:49.208542" 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-10-16T01:15:49.208812" elapsed="0.000028"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:15:49.208095" elapsed="0.000791"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:15:49.207944" elapsed="0.000980"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:15:49.208980" elapsed="0.000036"/>
</return>
<msg time="2026-10-16T01:15:49.209173" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:15:49.206161" elapsed="0.003045"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:49.205801" elapsed="0.003446"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:49.209478" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:49.209280" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:49.205777" elapsed="0.003798"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:15:49.210361" 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-10-16T01:15:49.209808" elapsed="0.000589"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:15:49.210444" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:15:49.201184" elapsed="0.009358"/>
</kw>
<msg time="2026-10-16T01:15:49.210589" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:49.195578" elapsed="0.015056"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:49.214407" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:49.218183" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:49.221968" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:49.222158" 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-10-16T01:15:49.222336" elapsed="0.000019"/>
</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-10-16T01:15:49.222670" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:49.222532" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:49.222519" 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-10-16T01:15:49.222920" 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-10-16T01:15:49.223096" elapsed="0.000018"/>
</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-10-16T01:15:49.223267" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:15:49.222493" elapsed="0.000823"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:15:49.222404" elapsed="0.000935"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:49.223486" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:49.223552" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:15:49.223659" 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-10-16T01:15:49.194742" elapsed="0.028941"/>
</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-10-16T01:15:49.224790" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:49.224579" elapsed="0.000272">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:49.224933" 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-10-16T01:15:49.224261" elapsed="0.000695"/>
</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-10-16T01:15:49.225243" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:49.225018" elapsed="0.000277"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:15:49.225764" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:49.225479" elapsed="0.000310"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:49.225318" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:49.225002" elapsed="0.000838"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:49.226343" 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-10-16T01:15:49.225996" elapsed="0.000371"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:15:49.226412" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:15:49.226532" 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-manganese/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-10-16T01:15:49.223955" elapsed="0.002600"/>
</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-10-16T01:15:49.227671" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:49.227483" elapsed="0.000266">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:49.227838" 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-10-16T01:15:49.227162" elapsed="0.000699"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:15:49.228029" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:15:49.227924" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:49.227908" elapsed="0.000197"/>
</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-10-16T01:15:49.228269" 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-10-16T01:15:49.228446" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:49.228506" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:15:49.228628" 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-manganese/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-10-16T01:15:49.226847" elapsed="0.001804"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:49.230055" 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-10-16T01:15:49.229828" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:49.230513" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:49.230295" elapsed="0.000258"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:15:49.235826" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:15:49.235884" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:15:49.235979" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:49.230849" elapsed="0.005482">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:49.230612" elapsed="0.005795">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:49.236587" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:49.236438" elapsed="0.000207"/>
</branch>
<status status="FAIL" start="2026-10-16T01:15:49.230596" elapsed="0.006071">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:49.237014" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:49.237133" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:49.237100" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:49.237084" 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-10-16T01:15:49.237341" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:15:49.237403" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:15:49.229107" elapsed="0.008395">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:49.237600" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:15:49.185011" elapsed="0.052782">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:15:49.238193" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:49.237963" elapsed="0.000313"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:49.237917" elapsed="0.000400"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:49.238400" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:15:49.181918" elapsed="0.056645">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:49.177860" elapsed="0.060802">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:15:49.177819" elapsed="0.060934">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:49.238998" elapsed="0.000027"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:15:49.239354" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:49.239666" elapsed="0.000019"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:15:49.240045" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:15:49.240488" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:49.240818" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:49.241177" elapsed="0.000024"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:15:49.241415" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:15:49.170331" elapsed="0.071189">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:15:49.241583" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:15:49.168522" elapsed="0.073151">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:49.241918" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:49.241779" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:49.242131" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:49.241991" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:49.242363" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:49.242222" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:49.241763" elapsed="0.000668"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:15:49.168193" elapsed="0.074276">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:15:49.167801" elapsed="0.074719">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:49.242568" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:15:49.159438" elapsed="0.083396">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:49.243015" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:49.243249" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:49.243094" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:49.243079" elapsed="0.000240"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:49.243444" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:49.243610" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:49.243668" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:15:49.157652" elapsed="0.086124">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:15:49.157216" elapsed="0.086622">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:15:49.156954" elapsed="0.086932">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:15:49.156183" elapsed="0.087784">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:49.244188" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:15:49.135554" elapsed="0.108738">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:15:50.263314" elapsed="0.000434"/>
</kw>
<msg time="2026-10-16T01:15:50.263865" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:50.261996" elapsed="0.001983"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:15:50.261020" elapsed="0.003136"/>
</kw>
<msg time="2026-10-16T01:15:50.264250" 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-10-16T01:15:50.254545" elapsed="0.009810"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:15:50.253655" elapsed="0.010852"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:50.265760" 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-10-16T01:15:50.265019" elapsed="0.000839"/>
</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-10-16T01:15:50.272653" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:50.271863" elapsed="0.000878"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:50.273739" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:50.273078" elapsed="0.000718"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:50.273986" elapsed="0.000066"/>
</return>
<msg time="2026-10-16T01:15:50.274304" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:50.270949" elapsed="0.003407"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:15:50.274697" elapsed="0.000319"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:50.276126" 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-10-16T01:15:50.275416" elapsed="0.000789"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:50.277071" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:50.276530" elapsed="0.000595"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:50.277993" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:50.277456" elapsed="0.000590"/>
</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-10-16T01:15:50.286617" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:15:50.285264" elapsed="0.001528"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:15:50.286921" elapsed="0.000132"/>
</return>
<msg time="2026-10-16T01:15:50.287511" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:15:50.282014" elapsed="0.005620"/>
</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-10-16T01:15:50.313231" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:50.312784" elapsed="0.000484"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:15:50.314255" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:15:50.313948" elapsed="0.000405">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:50.314471" 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-10-16T01:15:50.313490" elapsed="0.001012"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:50.315199" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:50.314753" elapsed="0.000481"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:15:50.315612" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:15:50.315827" 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-10-16T01:15:50.315456" elapsed="0.000404"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:50.316452" 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-10-16T01:15:50.316143" elapsed="0.000367"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:50.319336" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:50.319084" elapsed="0.000294"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:15:50.319825" 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-10-16T01:15:50.319553" 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-10-16T01:15:50.320145" 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-10-16T01:15:50.320326" elapsed="0.000022"/>
</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-10-16T01:15:50.320504" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:15:50.320004" elapsed="0.000551"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:15:50.319894" elapsed="0.000689"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:15:50.320623" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:15:50.320810" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:15:50.318741" elapsed="0.002093"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:50.318462" elapsed="0.002401"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:50.321032" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:50.320888" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:50.316571" elapsed="0.004532"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:15:50.321655" 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-10-16T01:15:50.321267" elapsed="0.000413"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:15:50.321742" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:15:50.312053" elapsed="0.009791"/>
</kw>
<msg time="2026-10-16T01:15:50.321892" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:50.306385" elapsed="0.015553"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:50.325725" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:50.329502" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:50.333358" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:50.333540" 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-10-16T01:15:50.333737" 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-10-16T01:15:50.334079" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:50.333938" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:50.333925" 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-10-16T01:15:50.334319" elapsed="0.000019"/>
</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-10-16T01:15:50.334495" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:50.334655" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:15:50.333898" elapsed="0.000819"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:15:50.333807" elapsed="0.000935"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:50.334891" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:50.334959" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:15:50.335064" 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-10-16T01:15:50.305509" elapsed="0.029579"/>
</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-10-16T01:15:50.336245" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:50.336036" elapsed="0.000270">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:50.336388" 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-10-16T01:15:50.335694" elapsed="0.000717"/>
</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-10-16T01:15:50.336688" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:50.336474" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:15:50.337221" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:50.336946" elapsed="0.000300"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:50.336779" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:50.336457" elapsed="0.000842"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:50.337807" 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-10-16T01:15:50.337456" elapsed="0.000375"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:15:50.337876" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:15:50.337999" 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-manganese/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-10-16T01:15:50.335393" elapsed="0.002628"/>
</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-10-16T01:15:50.339090" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:50.338903" elapsed="0.000258">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:50.339244" 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-10-16T01:15:50.338574" elapsed="0.000692"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:15:50.339591" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:15:50.339489" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:50.339313" elapsed="0.000356"/>
</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-10-16T01:15:50.339835" 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-10-16T01:15:50.340008" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:50.340068" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:15:50.340213" 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-manganese/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-10-16T01:15:50.338276" elapsed="0.001962"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:50.341475" 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-10-16T01:15:50.341238" elapsed="0.000279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:50.341938" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:50.341719" elapsed="0.000259"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:15:50.346847" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:15:50.346906" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:15:50.347049" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:50.342271" elapsed="0.005142">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:50.342037" elapsed="0.005459">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:50.347679" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:50.347527" elapsed="0.000234"/>
</branch>
<status status="FAIL" start="2026-10-16T01:15:50.342021" elapsed="0.005762">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:50.348120" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:50.348268" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:50.348224" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:50.348207" 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-10-16T01:15:50.348468" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:15:50.348532" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:15:50.340507" elapsed="0.008128">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:50.348723" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:15:50.295836" elapsed="0.053017">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:15:50.349259" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:50.349019" elapsed="0.000336"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:50.348971" elapsed="0.000436"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:50.349543" elapsed="0.000037"/>
</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="FAIL" start="2026-10-16T01:15:50.292623" elapsed="0.057114">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:50.288156" elapsed="0.061683">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:15:50.288095" elapsed="0.061818">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:50.350172" elapsed="0.000025"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:15:50.350521" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:50.350851" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:15:50.351210" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:15:50.351645" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:50.351986" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:50.352351" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:15:50.352641" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:15:50.280669" elapsed="0.072113">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:15:50.352845" elapsed="0.000014"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:15:50.278897" elapsed="0.074036">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:50.353166" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:50.353012" elapsed="0.000205"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:50.353375" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:50.353239" elapsed="0.000185"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:50.353584" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:50.353445" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:50.352997" elapsed="0.000655"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:15:50.278535" elapsed="0.075154">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:15:50.278166" elapsed="0.075603">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:50.353819" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:15:50.269506" elapsed="0.084404">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:50.354082" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:50.354312" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:50.354174" elapsed="0.000184"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:50.354158" elapsed="0.000221"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:50.354503" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:50.354669" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:50.354813" elapsed="0.000016"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:15:50.267873" elapsed="0.087035">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:15:50.267393" elapsed="0.087575">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:15:50.267126" elapsed="0.087891">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:15:50.266333" elapsed="0.088765">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:50.355319" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:15:50.245079" elapsed="0.110345">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:15:51.375157" elapsed="0.000408"/>
</kw>
<msg time="2026-10-16T01:15:51.375683" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:51.373868" elapsed="0.001964"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:15:51.372691" elapsed="0.003301"/>
</kw>
<msg time="2026-10-16T01:15:51.376084" 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-10-16T01:15:51.366012" elapsed="0.010184"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:15:51.365147" elapsed="0.011203"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:51.377414" 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-10-16T01:15:51.376869" elapsed="0.000638"/>
</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-10-16T01:15:51.384154" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:51.383348" elapsed="0.000867"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:51.385227" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:51.384556" elapsed="0.000727"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:51.385377" elapsed="0.000063"/>
</return>
<msg time="2026-10-16T01:15:51.385668" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:51.382515" elapsed="0.003238"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:15:51.386085" elapsed="0.000316"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:51.387498" 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-10-16T01:15:51.386799" elapsed="0.000756"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:51.388459" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:51.387918" elapsed="0.000595"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:51.389389" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:51.388858" elapsed="0.000585"/>
</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-10-16T01:15:51.398301" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:15:51.396859" elapsed="0.001554"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:15:51.398542" elapsed="0.000136"/>
</return>
<msg time="2026-10-16T01:15:51.399179" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:15:51.393517" elapsed="0.005794"/>
</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-10-16T01:15:51.423494" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:51.423050" elapsed="0.000480"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:15:51.424526" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:15:51.424233" elapsed="0.000387">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:51.424758" 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-10-16T01:15:51.423772" elapsed="0.001020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:51.425553" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:51.425098" elapsed="0.000491"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:15:51.426002" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:15:51.426214" 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-10-16T01:15:51.425841" elapsed="0.000407"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:51.426862" 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-10-16T01:15:51.426524" elapsed="0.000397"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:51.428410" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:51.427869" elapsed="0.000601"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:15:51.428932" 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-10-16T01:15:51.428655" 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-10-16T01:15:51.429253" 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-10-16T01:15:51.429436" 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-10-16T01:15:51.429617" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:15:51.429110" elapsed="0.000559"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:15:51.429001" elapsed="0.000695"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:15:51.429753" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:15:51.429884" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:15:51.427370" elapsed="0.002538"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:51.427009" elapsed="0.002928"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:51.430109" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:51.429961" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:51.426985" elapsed="0.003214"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:15:51.430765" 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-10-16T01:15:51.430359" elapsed="0.000432"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:15:51.430835" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:15:51.422322" elapsed="0.008614"/>
</kw>
<msg time="2026-10-16T01:15:51.430983" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:51.416554" elapsed="0.014476"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:51.434831" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:51.438616" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:51.442401" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:51.442617" elapsed="0.000020"/>
</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-10-16T01:15:51.442814" 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-10-16T01:15:51.443175" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:51.443017" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:51.443003" 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-10-16T01:15:51.443405" 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-10-16T01:15:51.443592" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:51.443772" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:15:51.442976" elapsed="0.000847"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:15:51.442884" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:51.443997" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:51.444065" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:15:51.444184" 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-10-16T01:15:51.415684" elapsed="0.028524"/>
</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-10-16T01:15:51.445331" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:51.445129" elapsed="0.000262">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:51.445475" 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-10-16T01:15:51.444785" elapsed="0.000713"/>
</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-10-16T01:15:51.445793" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:51.445562" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:15:51.446317" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:51.446033" elapsed="0.000308"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:51.445870" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:51.445545" elapsed="0.000850"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:51.446905" 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-10-16T01:15:51.446553" elapsed="0.000376"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:15:51.446974" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:15:51.447098" 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-manganese/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-10-16T01:15:51.444470" elapsed="0.002664"/>
</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-10-16T01:15:51.448227" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:51.448020" elapsed="0.000264">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:51.448372" 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-10-16T01:15:51.447686" elapsed="0.000709"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:15:51.448592" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:15:51.448492" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:51.448474" elapsed="0.000196"/>
</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-10-16T01:15:51.448843" 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-10-16T01:15:51.449018" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:51.449079" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:15:51.449223" 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-manganese/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-10-16T01:15:51.447388" elapsed="0.001858"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:51.450650" 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-10-16T01:15:51.450422" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:51.451128" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:51.450895" elapsed="0.000277"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:15:51.455731" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:15:51.455787" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:15:51.455885" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:51.451455" elapsed="0.004804">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:51.451233" elapsed="0.005104">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:51.456530" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:51.456368" elapsed="0.000220"/>
</branch>
<status status="FAIL" start="2026-10-16T01:15:51.451216" elapsed="0.005394">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:51.457091" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:51.457227" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:51.457194" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:51.457178" elapsed="0.000106"/>
</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-10-16T01:15:51.457418" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:15:51.457480" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:15:51.449684" elapsed="0.007896">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:51.457650" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:15:51.405957" elapsed="0.051844">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:15:51.458198" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:51.457967" elapsed="0.000347"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:51.457921" elapsed="0.000432"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:51.458439" elapsed="0.000037"/>
</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="FAIL" start="2026-10-16T01:15:51.403771" elapsed="0.054839">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:51.399815" elapsed="0.058919">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:15:51.399772" elapsed="0.059038">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:51.459060" elapsed="0.000028"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:15:51.459423" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:51.459752" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:15:51.460102" elapsed="0.000035"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:15:51.460537" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:51.460878" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:51.461239" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:15:51.461480" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:15:51.392183" elapsed="0.069398">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:15:51.461643" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:15:51.390303" elapsed="0.071469">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:51.461994" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:51.461854" elapsed="0.000195"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:51.462223" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:51.462072" elapsed="0.000201"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:51.462438" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:51.462294" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:51.461839" elapsed="0.000667"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:15:51.389940" elapsed="0.072605">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:15:51.389537" elapsed="0.073059">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:51.462644" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:15:51.381143" elapsed="0.081617">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:51.462936" elapsed="0.000050"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:51.463207" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:51.463049" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:51.463033" elapsed="0.000245"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:51.463405" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:51.463574" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:51.463632" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:15:51.379493" elapsed="0.084325">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:15:51.379022" elapsed="0.084862">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:15:51.378778" elapsed="0.085156">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:15:51.377981" elapsed="0.086036">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:51.464237" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:15:51.356245" elapsed="0.108097">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:15:52.483673" elapsed="0.000457"/>
</kw>
<msg time="2026-10-16T01:15:52.484248" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:52.482374" elapsed="0.001990"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:15:52.481428" elapsed="0.003093"/>
</kw>
<msg time="2026-10-16T01:15:52.484613" 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-10-16T01:15:52.474691" elapsed="0.010042"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:15:52.473839" elapsed="0.011051"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:52.485963" 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-10-16T01:15:52.485401" elapsed="0.000656"/>
</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-10-16T01:15:52.492765" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:52.491962" elapsed="0.000862"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:52.493820" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:52.493180" elapsed="0.000695"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:52.493970" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:15:52.494284" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:52.491145" elapsed="0.003192"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:15:52.494668" elapsed="0.000346"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:52.496261" 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-10-16T01:15:52.495407" elapsed="0.000912"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:52.497218" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:52.496650" elapsed="0.000622"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:52.498147" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:52.497585" elapsed="0.000617"/>
</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-10-16T01:15:52.506946" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:15:52.505497" elapsed="0.001558"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:15:52.507210" elapsed="0.000137"/>
</return>
<msg time="2026-10-16T01:15:52.507812" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:15:52.502237" elapsed="0.005704"/>
</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-10-16T01:15:52.530921" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:52.530477" elapsed="0.000480"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:15:52.531933" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:15:52.531623" elapsed="0.000403">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:52.532163" 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-10-16T01:15:52.531188" elapsed="0.001015"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:52.532901" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:52.532445" elapsed="0.000493"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:15:52.533351" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:15:52.533537" 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-10-16T01:15:52.533182" elapsed="0.000388"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:52.534202" 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-10-16T01:15:52.533875" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:52.535692" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:52.535192" elapsed="0.000558"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:15:52.536194" 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-10-16T01:15:52.535925" 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-10-16T01:15:52.536500" 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-10-16T01:15:52.536684" elapsed="0.000037"/>
</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-10-16T01:15:52.536883" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:15:52.536370" elapsed="0.000564"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:15:52.536262" elapsed="0.000700"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:15:52.537002" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:15:52.537144" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:15:52.534688" elapsed="0.002481"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:52.534345" elapsed="0.002852"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:52.537366" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:52.537221" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:52.534322" elapsed="0.003113"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:15:52.538005" 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-10-16T01:15:52.537591" elapsed="0.000472"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:15:52.538121" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:15:52.529769" elapsed="0.008457"/>
</kw>
<msg time="2026-10-16T01:15:52.538272" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:52.524120" elapsed="0.014199"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:52.542110" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:52.545893" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:52.549669" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:52.549858" elapsed="0.000020"/>
</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-10-16T01:15:52.550033" elapsed="0.000019"/>
</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-10-16T01:15:52.550386" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:52.550241" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:52.550228" 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-10-16T01:15:52.550610" elapsed="0.000019"/>
</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-10-16T01:15:52.550799" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:52.550958" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:15:52.550202" elapsed="0.000803"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:15:52.550111" elapsed="0.000917"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:52.551188" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:52.551261" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:15:52.551364" 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-10-16T01:15:52.523259" elapsed="0.028129"/>
</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-10-16T01:15:52.552518" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:52.552328" elapsed="0.000249">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:52.552658" 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-10-16T01:15:52.551993" elapsed="0.000687"/>
</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-10-16T01:15:52.552972" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:52.552759" elapsed="0.000264"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:15:52.553488" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:52.553217" elapsed="0.000296"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:52.553046" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:52.552742" elapsed="0.000823"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:52.554082" 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-10-16T01:15:52.553742" elapsed="0.000377"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:15:52.554166" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:15:52.554290" 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-manganese/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-10-16T01:15:52.551646" elapsed="0.002666"/>
</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-10-16T01:15:52.555385" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:52.555198" elapsed="0.000252">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:52.555536" 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-10-16T01:15:52.554870" elapsed="0.000688"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:15:52.555761" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-10-16T01:15:52.555637" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:52.555619" elapsed="0.000224"/>
</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-10-16T01:15:52.555991" elapsed="0.000020"/>
</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-10-16T01:15:52.556186" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:52.556248" elapsed="0.000013"/>
</return>
<msg time="2026-10-16T01:15:52.556371" 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-manganese/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-10-16T01:15:52.554553" elapsed="0.001841"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:52.557793" 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-10-16T01:15:52.557553" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:52.558247" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:52.558018" elapsed="0.000269"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:15:52.562948" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:15:52.563001" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:15:52.563110" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:52.558566" elapsed="0.004903">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:52.558346" elapsed="0.005233">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:52.563778" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:52.563612" elapsed="0.000225"/>
</branch>
<status status="FAIL" start="2026-10-16T01:15:52.558329" elapsed="0.005529">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:52.564204" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:52.564323" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:52.564290" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:52.564274" elapsed="0.000107"/>
</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-10-16T01:15:52.564518" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:15:52.564583" elapsed="0.000013"/>
</return>
<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="FAIL" start="2026-10-16T01:15:52.556839" elapsed="0.007844">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:52.564770" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:15:52.513487" elapsed="0.051409">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:15:52.565292" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:52.565059" elapsed="0.000313"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:52.565013" elapsed="0.000400"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:52.565496" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:15:52.511379" elapsed="0.054279">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:52.508425" elapsed="0.057360">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:15:52.508383" elapsed="0.057475">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:52.566114" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:15:52.566454" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:52.566779" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:15:52.567135" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:15:52.567557" elapsed="0.000026"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:52.567883" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:52.568240" elapsed="0.000019"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:15:52.568475" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:15:52.500876" elapsed="0.067699">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:15:52.568665" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:15:52.499059" elapsed="0.069714">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:52.568994" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:52.568854" elapsed="0.000190"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:52.569216" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:52.569066" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:52.569425" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:52.569287" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:52.568838" elapsed="0.000655"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:15:52.498688" elapsed="0.070842">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:15:52.498298" elapsed="0.071285">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:52.569630" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:15:52.489768" elapsed="0.079984">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:52.569933" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:52.570163" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:52.570010" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:52.569995" elapsed="0.000236"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:52.570354" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:52.570518" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:52.570575" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:15:52.488035" elapsed="0.082631">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:15:52.487566" elapsed="0.083199">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:15:52.487331" elapsed="0.083483">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:15:52.486527" elapsed="0.084377">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:52.571126" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:15:52.465196" elapsed="0.106034">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:15:53.589836" elapsed="0.000403"/>
</kw>
<msg time="2026-10-16T01:15:53.590339" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:53.588527" elapsed="0.002012"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:15:53.587578" elapsed="0.003154"/>
</kw>
<msg time="2026-10-16T01:15:53.590828" 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-10-16T01:15:53.580947" elapsed="0.009974"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:15:53.580103" elapsed="0.010970"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:53.592161" 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-10-16T01:15:53.591576" elapsed="0.000679"/>
</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-10-16T01:15:53.598982" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:53.598197" elapsed="0.000842"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:53.600030" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:53.599395" elapsed="0.000708"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:53.600210" elapsed="0.000060"/>
</return>
<msg time="2026-10-16T01:15:53.600496" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:53.597333" elapsed="0.003214"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:15:53.600903" elapsed="0.000320"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:53.602318" 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-10-16T01:15:53.601588" elapsed="0.000787"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:53.603265" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:53.602727" elapsed="0.000593"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:53.604207" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:53.603630" elapsed="0.000631"/>
</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-10-16T01:15:53.612895" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:15:53.611476" elapsed="0.001529"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:15:53.613156" elapsed="0.000135"/>
</return>
<msg time="2026-10-16T01:15:53.613756" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:15:53.608299" elapsed="0.005587"/>
</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-10-16T01:15:53.637610" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:53.637191" elapsed="0.000455"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:15:53.638594" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:15:53.638334" elapsed="0.000345">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:53.638819" 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-10-16T01:15:53.637879" elapsed="0.000971"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:53.639526" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:53.639096" elapsed="0.000465"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:15:53.639974" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:15:53.640217" 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-10-16T01:15:53.639813" elapsed="0.000438"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:53.640848" 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-10-16T01:15:53.640518" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:53.643882" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:53.643533" elapsed="0.000391"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:15:53.644367" 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-10-16T01:15:53.644111" elapsed="0.000281"/>
</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-10-16T01:15:53.644670" elapsed="0.000041"/>
</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-10-16T01:15:53.644875" elapsed="0.000022"/>
</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-10-16T01:15:53.645055" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:15:53.644543" elapsed="0.000578"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:15:53.644436" elapsed="0.000713"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:15:53.645189" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:15:53.645320" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:15:53.643037" elapsed="0.002305"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:53.642662" elapsed="0.002709"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:53.645543" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:53.645394" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:53.640966" elapsed="0.004647"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:15:53.646195" 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-10-16T01:15:53.645782" elapsed="0.000438"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:15:53.646265" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:15:53.636467" elapsed="0.009897"/>
</kw>
<msg time="2026-10-16T01:15:53.646411" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:53.630800" elapsed="0.015657"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:53.650278" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:53.654111" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:53.657946" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:53.658173" 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-10-16T01:15:53.658354" elapsed="0.000019"/>
</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-10-16T01:15:53.658693" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:53.658552" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:53.658538" elapsed="0.000243"/>
</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-10-16T01:15:53.658934" 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-10-16T01:15:53.659123" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:53.659285" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:15:53.658513" elapsed="0.000820"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:15:53.658422" elapsed="0.000934"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:53.659504" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:53.659576" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:15:53.659679" 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-10-16T01:15:53.629935" elapsed="0.029783"/>
</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-10-16T01:15:53.660823" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:53.660615" elapsed="0.000268">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:53.660965" 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-10-16T01:15:53.660293" elapsed="0.000695"/>
</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-10-16T01:15:53.661282" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:53.661051" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:15:53.661796" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:53.661517" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:53.661358" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:53.661034" elapsed="0.000839"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:53.662386" 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-10-16T01:15:53.662031" elapsed="0.000380"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:15:53.662457" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:15:53.662586" 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-manganese/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-10-16T01:15:53.659978" elapsed="0.002630"/>
</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-10-16T01:15:53.663678" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:53.663490" elapsed="0.000263">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:53.663836" 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-10-16T01:15:53.663175" elapsed="0.000684"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:15:53.664207" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:15:53.664101" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:53.663905" elapsed="0.000381"/>
</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-10-16T01:15:53.664438" 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-10-16T01:15:53.664648" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:53.664727" elapsed="0.000016"/>
</return>
<msg time="2026-10-16T01:15:53.664857" 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-manganese/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-10-16T01:15:53.662865" elapsed="0.002015"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:53.666119" 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-10-16T01:15:53.665882" elapsed="0.000279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:53.666567" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:53.666349" elapsed="0.000258"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:15:53.670783" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:15:53.670834" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:15:53.670937" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:53.666906" elapsed="0.004374">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:53.666667" elapsed="0.004689">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:53.671536" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:53.671387" elapsed="0.000209"/>
</branch>
<status status="FAIL" start="2026-10-16T01:15:53.666650" elapsed="0.004968">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:53.671966" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:53.672099" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:53.672053" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:53.672037" 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-10-16T01:15:53.672294" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:15:53.672356" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:15:53.665166" elapsed="0.007290">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:53.672523" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:15:53.620230" elapsed="0.052415">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:15:53.673058" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:53.672840" elapsed="0.000313"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:53.672792" elapsed="0.000401"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:53.673275" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:15:53.618104" elapsed="0.055368">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:53.614360" elapsed="0.059216">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:15:53.614318" elapsed="0.059330">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:53.673913" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:15:53.674267" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:53.674575" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:15:53.674937" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:15:53.675371" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:53.675678" elapsed="0.000034"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:53.676036" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:15:53.676286" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:15:53.606942" elapsed="0.069445">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:15:53.676449" elapsed="0.000014"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:15:53.605137" elapsed="0.071398">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:53.676780" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:53.676614" elapsed="0.000218"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:53.676991" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:53.676854" elapsed="0.000186"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:53.677222" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:53.677062" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:53.676598" elapsed="0.000694"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:15:53.604780" elapsed="0.072550">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:15:53.604356" elapsed="0.073026">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:53.677430" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:15:53.595925" elapsed="0.081594">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:53.677691" elapsed="0.000041"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:53.677931" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:53.677792" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:53.677776" elapsed="0.000223"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:53.678171" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:53.678341" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:53.678399" elapsed="0.000015"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:15:53.594230" elapsed="0.084262">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:15:53.593765" elapsed="0.084789">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:15:53.593500" elapsed="0.085103">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:15:53.592693" elapsed="0.085990">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:53.678909" elapsed="0.000027"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:15:53.571853" elapsed="0.107165">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:15:54.697618" elapsed="0.000421"/>
</kw>
<msg time="2026-10-16T01:15:54.698168" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:54.696384" elapsed="0.001891"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:15:54.695439" elapsed="0.003104"/>
</kw>
<msg time="2026-10-16T01:15:54.698640" 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-10-16T01:15:54.688902" elapsed="0.009864"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:15:54.688029" elapsed="0.010892"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:54.700021" 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-10-16T01:15:54.699438" elapsed="0.000695"/>
</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-10-16T01:15:54.706794" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:54.706007" elapsed="0.000846"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:54.707851" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:54.707208" elapsed="0.000697"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:54.707996" elapsed="0.000060"/>
</return>
<msg time="2026-10-16T01:15:54.708323" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:54.705194" elapsed="0.003181"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:15:54.708732" elapsed="0.000290"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:54.710312" 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-10-16T01:15:54.709519" elapsed="0.000850"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:54.711259" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:54.710695" elapsed="0.000617"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:54.712327" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:54.711630" elapsed="0.000752"/>
</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-10-16T01:15:54.721240" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:15:54.719814" elapsed="0.001535"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:15:54.721477" elapsed="0.000133"/>
</return>
<msg time="2026-10-16T01:15:54.722113" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:15:54.716504" elapsed="0.005738"/>
</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-10-16T01:15:54.747132" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:54.746668" elapsed="0.000501"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:15:54.748149" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:15:54.747848" elapsed="0.000392">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:54.748358" 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-10-16T01:15:54.747385" elapsed="0.001005"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:54.749098" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:54.748625" elapsed="0.000509"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:15:54.749529" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:15:54.749725" 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-10-16T01:15:54.749368" elapsed="0.000392"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:54.750358" 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-10-16T01:15:54.750029" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:54.751893" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:54.751369" elapsed="0.000583"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:15:54.752578" 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-10-16T01:15:54.752221" elapsed="0.000391"/>
</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-10-16T01:15:54.753021" elapsed="0.000029"/>
</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-10-16T01:15:54.753295" elapsed="0.000032"/>
</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-10-16T01:15:54.753546" elapsed="0.000026"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:15:54.752844" elapsed="0.000773"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:15:54.752672" elapsed="0.000983"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:15:54.753731" elapsed="0.000038"/>
</return>
<msg time="2026-10-16T01:15:54.753915" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:15:54.750865" elapsed="0.003083"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:54.750501" elapsed="0.003487"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:54.754237" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:54.754019" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:54.750477" elapsed="0.003860"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:15:54.755119" 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-10-16T01:15:54.754555" elapsed="0.000590"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:15:54.755189" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:15:54.745954" elapsed="0.009332"/>
</kw>
<msg time="2026-10-16T01:15:54.755375" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:54.740236" elapsed="0.015188"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:54.759210" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:54.763000" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:54.766824" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:54.767000" elapsed="0.000019"/>
</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-10-16T01:15:54.767193" elapsed="0.000019"/>
</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-10-16T01:15:54.767532" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:54.767392" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:54.767378" 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-10-16T01:15:54.767785" 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-10-16T01:15:54.767965" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:54.768142" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:15:54.767352" elapsed="0.000840"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:15:54.767262" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:54.768363" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:54.768430" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:15:54.768532" 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-10-16T01:15:54.739378" elapsed="0.029177"/>
</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-10-16T01:15:54.769678" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:54.769463" elapsed="0.000291">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:54.769868" 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-10-16T01:15:54.769143" 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-10-16T01:15:54.770187" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:54.769957" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:15:54.770687" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:54.770419" elapsed="0.000308"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:54.770263" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:54.769939" elapsed="0.000841"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:54.771288" 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-10-16T01:15:54.770937" elapsed="0.000376"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:15:54.771358" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:15:54.771481" 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-manganese/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-10-16T01:15:54.768829" elapsed="0.002676"/>
</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-10-16T01:15:54.772602" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:54.772414" elapsed="0.000247">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:54.772761" 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-10-16T01:15:54.772060" elapsed="0.000724"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:15:54.772955" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:15:54.772848" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:54.772831" elapsed="0.000200"/>
</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-10-16T01:15:54.773198" elapsed="0.000020"/>
</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-10-16T01:15:54.773369" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:54.773427" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:15:54.773551" 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-manganese/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-10-16T01:15:54.771763" elapsed="0.001811"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:54.774987" 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-10-16T01:15:54.774757" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:54.775451" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:54.775231" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:15:54.780037" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:15:54.780102" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:15:54.780198" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:54.775792" elapsed="0.004736">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:54.775551" elapsed="0.005053">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:54.780802" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:54.780634" elapsed="0.000257"/>
</branch>
<status status="FAIL" start="2026-10-16T01:15:54.775534" elapsed="0.005381">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:54.781258" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:54.781377" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:54.781343" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:54.781327" elapsed="0.000107"/>
</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-10-16T01:15:54.781569" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:15:54.781637" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:15:54.774025" elapsed="0.007732">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:54.781826" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:15:54.729658" elapsed="0.052294">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:15:54.782350" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:54.782134" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:54.782086" elapsed="0.000385"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:54.782554" elapsed="0.000038"/>
</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="FAIL" start="2026-10-16T01:15:54.726763" elapsed="0.055986">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:54.722697" elapsed="0.060154">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:15:54.722656" elapsed="0.060266">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:54.783183" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:15:54.783522" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:54.783844" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:15:54.784215" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:15:54.784637" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:54.784962" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:54.785319" elapsed="0.000019"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:15:54.785549" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:15:54.715161" elapsed="0.070488">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:15:54.785726" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:15:54.713277" elapsed="0.072539">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:54.786081" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:54.785929" elapsed="0.000203"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:54.786292" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:54.786154" elapsed="0.000187"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:54.786504" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:54.786363" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:54.785912" elapsed="0.000661"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:15:54.712904" elapsed="0.073707">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:15:54.712478" elapsed="0.074185">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:54.786740" elapsed="0.000016"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:15:54.703803" elapsed="0.083033">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:54.787015" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:54.787247" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:54.787106" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:54.787090" elapsed="0.000224"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:54.787439" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:54.787605" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:54.787663" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:15:54.702051" elapsed="0.085726">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:15:54.701589" elapsed="0.086252">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:15:54.701357" elapsed="0.086533">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:15:54.700572" elapsed="0.087398">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:54.788196" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:15:54.679612" elapsed="0.108688">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:15:55.800535" elapsed="0.000280"/>
</kw>
<msg time="2026-10-16T01:15:55.800894" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:55.799752" elapsed="0.001220"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:15:55.799177" elapsed="0.001909"/>
</kw>
<msg time="2026-10-16T01:15:55.801270" 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-10-16T01:15:55.794958" elapsed="0.006375"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:15:55.794409" elapsed="0.007023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:55.802109" 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-10-16T01:15:55.801761" elapsed="0.000408"/>
</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-10-16T01:15:55.806252" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:55.805765" elapsed="0.000523"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:55.806894" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:55.806496" elapsed="0.000432"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:55.806989" elapsed="0.000039"/>
</return>
<msg time="2026-10-16T01:15:55.807199" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:55.805250" elapsed="0.001981"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:15:55.807435" elapsed="0.000186"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:55.808306" 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-10-16T01:15:55.807873" elapsed="0.000468"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:55.808883" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:55.808545" elapsed="0.000371"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:55.809435" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:55.809124" elapsed="0.000344"/>
</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-10-16T01:15:55.814985" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:15:55.814120" elapsed="0.000933"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:15:55.815156" elapsed="0.000086"/>
</return>
<msg time="2026-10-16T01:15:55.815511" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:15:55.812078" elapsed="0.003512"/>
</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-10-16T01:15:55.838141" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:55.837680" elapsed="0.000497"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:15:55.839166" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:15:55.838850" elapsed="0.000410">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:55.839377" 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-10-16T01:15:55.838392" elapsed="0.001016"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:55.840107" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:55.839641" elapsed="0.000502"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:15:55.840526" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:15:55.840736" 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-10-16T01:15:55.840372" elapsed="0.000398"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:55.841416" 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-10-16T01:15:55.841040" elapsed="0.000436"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:55.842605" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:55.842240" elapsed="0.000408"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:15:55.843109" 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-10-16T01:15:55.842840" 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-10-16T01:15:55.843416" 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-10-16T01:15:55.843600" elapsed="0.000022"/>
</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-10-16T01:15:55.843813" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:15:55.843286" elapsed="0.000581"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:15:55.843178" elapsed="0.000717"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:15:55.843936" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:15:55.844093" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:15:55.841887" elapsed="0.002231"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:55.841566" elapsed="0.002581"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:55.844317" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:55.844172" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:55.841539" elapsed="0.002849"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:15:55.844962" 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-10-16T01:15:55.844543" elapsed="0.000445"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:15:55.845032" elapsed="0.000039"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:15:55.836967" elapsed="0.008180"/>
</kw>
<msg time="2026-10-16T01:15:55.845194" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:55.831322" elapsed="0.013919"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:55.849089" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:55.853041" elapsed="0.000036"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:55.856810" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:55.856986" elapsed="0.000020"/>
</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-10-16T01:15:55.857176" 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-10-16T01:15:55.857552" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:55.857376" elapsed="0.000229"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:55.857362" 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-10-16T01:15:55.857794" 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-10-16T01:15:55.857978" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:55.858155" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:15:55.857335" elapsed="0.000870"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:15:55.857245" elapsed="0.000984"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:55.858378" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:55.858445" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:15:55.858549" 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-10-16T01:15:55.830462" elapsed="0.028110"/>
</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-10-16T01:15:55.859674" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:55.859485" elapsed="0.000264">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:55.859833" 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-10-16T01:15:55.859160" elapsed="0.000696"/>
</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-10-16T01:15:55.860219" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:55.859918" elapsed="0.000355"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:15:55.860729" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:55.860451" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:55.860295" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:55.859901" elapsed="0.000905"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:55.861311" 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-10-16T01:15:55.860960" elapsed="0.000375"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:15:55.861380" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:15:55.861503" 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-manganese/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-10-16T01:15:55.858850" elapsed="0.002681"/>
</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-10-16T01:15:55.862611" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:55.862426" elapsed="0.000243">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:55.862768" 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-10-16T01:15:55.862112" elapsed="0.000679"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:15:55.862963" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:15:55.862861" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:55.862844" elapsed="0.000195"/>
</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-10-16T01:15:55.863202" elapsed="0.000020"/>
</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-10-16T01:15:55.863372" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:55.863438" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:15:55.863562" 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-manganese/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-10-16T01:15:55.861792" elapsed="0.001826"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:55.865017" 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-10-16T01:15:55.864791" elapsed="0.000279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:55.865472" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:55.865256" elapsed="0.000256"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:15:55.870508" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:15:55.870564" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:15:55.870663" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:55.865808" elapsed="0.005244">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:55.865572" elapsed="0.005579">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:55.871332" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:55.871182" elapsed="0.000209"/>
</branch>
<status status="FAIL" start="2026-10-16T01:15:55.865556" elapsed="0.005857">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:55.871772" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:55.871892" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:55.871858" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:55.871843" elapsed="0.000107"/>
</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-10-16T01:15:55.872100" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:15:55.872163" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:15:55.864077" elapsed="0.008188">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:55.872333" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:15:55.820603" elapsed="0.051854">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:15:55.872878" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:55.872626" elapsed="0.000335"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:55.872574" elapsed="0.000426"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:55.873098" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:15:55.818303" elapsed="0.054960">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:55.815903" elapsed="0.057489">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:15:55.815875" elapsed="0.057592">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:55.873739" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:15:55.874093" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:55.874401" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:15:55.874759" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:15:55.875196" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:55.875506" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:55.875867" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:15:55.876116" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:15:55.811235" elapsed="0.064983">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:15:55.876280" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:15:55.809995" elapsed="0.066377">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:55.876591" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:55.876452" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:55.876827" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:55.876663" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:55.877045" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:55.876898" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:55.876436" elapsed="0.000693"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:15:55.809783" elapsed="0.067383">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:15:55.809526" elapsed="0.067697">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:55.877270" elapsed="0.000018"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:15:55.804396" elapsed="0.072971">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:55.877543" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:55.877787" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:55.877621" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:55.877606" elapsed="0.000251"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:55.877980" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:55.878162" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:55.878220" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:15:55.803417" elapsed="0.074933">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:15:55.803130" elapsed="0.075283">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:15:55.802957" elapsed="0.075505">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:15:55.802466" elapsed="0.076077">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:55.878767" elapsed="0.000021"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:15:55.788939" elapsed="0.089931">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:15:56.897839" elapsed="0.000420"/>
</kw>
<msg time="2026-10-16T01:15:56.898372" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:56.896541" elapsed="0.001944"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:15:56.895612" elapsed="0.003026"/>
</kw>
<msg time="2026-10-16T01:15:56.898763" 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-10-16T01:15:56.889127" elapsed="0.009728"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:15:56.888232" elapsed="0.010769"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:56.900078" 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-10-16T01:15:56.899513" elapsed="0.000659"/>
</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-10-16T01:15:56.906968" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:56.906168" elapsed="0.000856"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:56.908010" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:56.907379" elapsed="0.000706"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:56.908179" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:15:56.908478" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:56.905323" elapsed="0.003205"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:15:56.908966" elapsed="0.000323"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:56.910378" 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-10-16T01:15:56.909656" elapsed="0.000779"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:56.911411" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:56.910839" elapsed="0.000624"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:56.912320" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:56.911799" elapsed="0.000573"/>
</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-10-16T01:15:56.921381" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:15:56.919881" elapsed="0.001698"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:15:56.921759" elapsed="0.000140"/>
</return>
<msg time="2026-10-16T01:15:56.922412" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:15:56.916494" elapsed="0.006041"/>
</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-10-16T01:15:56.948498" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:56.948074" elapsed="0.000460"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:15:56.949518" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:15:56.949227" elapsed="0.000389">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:56.949752" 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-10-16T01:15:56.948773" elapsed="0.001013"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:56.950465" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:56.950020" elapsed="0.000480"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:15:56.950911" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:15:56.951133" 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-10-16T01:15:56.950752" elapsed="0.000414"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:56.951763" 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-10-16T01:15:56.951436" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:56.955005" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:56.954656" elapsed="0.000426"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:15:56.955681" 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-10-16T01:15:56.955325" elapsed="0.000411"/>
</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-10-16T01:15:56.956150" elapsed="0.000029"/>
</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-10-16T01:15:56.956405" 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-10-16T01:15:56.956673" elapsed="0.000058"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:15:56.955950" elapsed="0.000839"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:15:56.955798" elapsed="0.001039"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:15:56.956905" elapsed="0.000036"/>
</return>
<msg time="2026-10-16T01:15:56.957074" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:15:56.954186" elapsed="0.002913"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:56.953808" elapsed="0.003320"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:56.957298" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:56.957153" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:56.951881" elapsed="0.005492"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:15:56.957927" 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-10-16T01:15:56.957525" elapsed="0.000427"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:15:56.957996" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:15:56.947332" elapsed="0.010777"/>
</kw>
<msg time="2026-10-16T01:15:56.958188" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:56.941681" elapsed="0.016555"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:56.962007" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:56.965797" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:56.969569" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:56.969760" 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-10-16T01:15:56.969939" elapsed="0.000019"/>
</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-10-16T01:15:56.970291" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:56.970151" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:56.970137" elapsed="0.000228"/>
</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-10-16T01:15:56.970516" elapsed="0.000019"/>
</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-10-16T01:15:56.970691" elapsed="0.000033"/>
</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-10-16T01:15:56.970866" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:15:56.970110" elapsed="0.000804"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:15:56.970007" elapsed="0.000930"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:56.971097" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:56.971166" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:15:56.971270" 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-10-16T01:15:56.940841" elapsed="0.030453"/>
</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-10-16T01:15:56.972391" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:56.972202" elapsed="0.000249">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:56.972531" 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-10-16T01:15:56.971867" elapsed="0.000687"/>
</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-10-16T01:15:56.972850" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:56.972617" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:15:56.973402" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:56.973135" elapsed="0.000291"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:56.972957" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:56.972600" elapsed="0.000879"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:56.973991" 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-10-16T01:15:56.973638" elapsed="0.000378"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:15:56.974077" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:15:56.974202" 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-manganese/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-10-16T01:15:56.971551" elapsed="0.002674"/>
</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-10-16T01:15:56.975305" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:56.975111" elapsed="0.000254">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:56.975447" 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-10-16T01:15:56.974779" elapsed="0.000690"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:15:56.975811" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:15:56.975691" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:56.975516" elapsed="0.000373"/>
</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-10-16T01:15:56.976053" 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-10-16T01:15:56.976228" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:56.976289" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:15:56.976414" 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-manganese/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-10-16T01:15:56.974464" elapsed="0.001973"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:56.977652" 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-10-16T01:15:56.977428" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:56.978129" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:56.977895" elapsed="0.000274"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:15:56.982747" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:15:56.982801" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:15:56.982906" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:56.978451" elapsed="0.004830">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:56.978229" elapsed="0.005130">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:56.983540" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:56.983390" elapsed="0.000208"/>
</branch>
<status status="FAIL" start="2026-10-16T01:15:56.978213" elapsed="0.005407">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:56.983982" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:56.984159" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:56.984124" elapsed="0.000075"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:56.984106" 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-10-16T01:15:56.984358" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:15:56.984423" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:15:56.976721" elapsed="0.007805">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:56.984596" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:15:56.930802" elapsed="0.053950">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:15:56.985157" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:56.984922" elapsed="0.000318"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:56.984874" elapsed="0.000407"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:56.985366" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:15:56.927265" elapsed="0.058270">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:56.923068" elapsed="0.062567">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:15:56.923000" elapsed="0.062726">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:56.985976" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:15:56.986332" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:56.986643" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:15:56.987021" elapsed="0.000033"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:15:56.987454" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:56.987788" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:56.988147" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:15:56.988387" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:15:56.915200" elapsed="0.073289">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:15:56.988549" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:15:56.913322" elapsed="0.075316">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:56.988886" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:56.988744" elapsed="0.000193"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:56.989148" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:56.988959" elapsed="0.000242"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:56.989365" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:56.989224" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:56.988727" elapsed="0.000706"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:15:56.912901" elapsed="0.076571">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:15:56.912464" elapsed="0.077060">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:56.989571" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:15:56.903925" elapsed="0.085737">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:56.989918" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:56.990154" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:56.989997" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:56.989982" elapsed="0.000242"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:56.990348" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:56.990514" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:56.990572" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:15:56.902195" elapsed="0.088468">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:15:56.901645" elapsed="0.089163">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:15:56.901404" elapsed="0.089455">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:15:56.900607" elapsed="0.090332">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:56.991192" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:15:56.879584" elapsed="0.111713">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:15:58.009836" elapsed="0.000411"/>
</kw>
<msg time="2026-10-16T01:15:58.010348" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:58.008547" elapsed="0.001907"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:15:58.007588" elapsed="0.003020"/>
</kw>
<msg time="2026-10-16T01:15:58.010698" 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-10-16T01:15:58.001112" elapsed="0.009821"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:15:58.000244" elapsed="0.010872"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:58.012335" 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-10-16T01:15:58.011762" elapsed="0.000666"/>
</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-10-16T01:15:58.018965" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:58.018192" elapsed="0.000831"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:58.020026" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:58.019384" elapsed="0.000720"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:58.020200" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:15:58.020485" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:58.017363" elapsed="0.003173"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:15:58.020905" elapsed="0.000310"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:58.022327" 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-10-16T01:15:58.021594" elapsed="0.000789"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:58.023273" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:58.022742" elapsed="0.000584"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:58.024204" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:58.023629" elapsed="0.000628"/>
</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-10-16T01:15:58.033153" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:15:58.031663" elapsed="0.001600"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:15:58.033391" elapsed="0.000135"/>
</return>
<msg time="2026-10-16T01:15:58.034010" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:15:58.028416" elapsed="0.005750"/>
</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-10-16T01:15:58.058639" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:58.058213" elapsed="0.000463"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:15:58.059637" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:15:58.059371" elapsed="0.000372">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:58.059863" 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-10-16T01:15:58.058912" elapsed="0.000983"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:58.060579" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:58.060147" elapsed="0.000467"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:15:58.061016" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:15:58.061206" 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-10-16T01:15:58.060860" elapsed="0.000379"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:58.061839" 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-10-16T01:15:58.061510" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:58.063357" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:58.062837" elapsed="0.000579"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:15:58.064107" 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-10-16T01:15:58.063658" elapsed="0.000485"/>
</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-10-16T01:15:58.064537" elapsed="0.000029"/>
</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-10-16T01:15:58.064817" elapsed="0.000032"/>
</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-10-16T01:15:58.065084" elapsed="0.000028"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:15:58.064359" elapsed="0.000800"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:15:58.064205" elapsed="0.000991"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:15:58.065251" elapsed="0.000037"/>
</return>
<msg time="2026-10-16T01:15:58.065433" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:15:58.062347" elapsed="0.003118"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:58.061985" elapsed="0.003520"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:58.065790" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:58.065538" elapsed="0.000343"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:58.061961" elapsed="0.003955"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:15:58.066505" 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-10-16T01:15:58.066122" elapsed="0.000408"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:15:58.066575" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:15:58.057478" elapsed="0.009196"/>
</kw>
<msg time="2026-10-16T01:15:58.066737" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:58.051827" elapsed="0.014957"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:58.070574" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:58.074401" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:58.078191" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:58.078369" elapsed="0.000020"/>
</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-10-16T01:15:58.078545" 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-10-16T01:15:58.078902" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:58.078763" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:58.078749" elapsed="0.000226"/>
</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-10-16T01:15:58.079137" elapsed="0.000019"/>
</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-10-16T01:15:58.079311" elapsed="0.000018"/>
</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-10-16T01:15:58.079506" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:15:58.078722" elapsed="0.000834"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:15:58.078617" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:58.079744" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:58.079814" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:15:58.079919" 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-10-16T01:15:58.050971" elapsed="0.028972"/>
</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-10-16T01:15:58.081060" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:58.080855" elapsed="0.000265">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:58.081203" 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-10-16T01:15:58.080517" elapsed="0.000708"/>
</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-10-16T01:15:58.081501" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:58.081288" elapsed="0.000264"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:15:58.082057" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:58.081758" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:58.081575" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:58.081271" elapsed="0.000866"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:58.082625" 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-10-16T01:15:58.082291" elapsed="0.000358"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:15:58.082694" elapsed="0.000043"/>
</return>
<msg time="2026-10-16T01:15:58.082836" 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-manganese/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-10-16T01:15:58.080219" elapsed="0.002640"/>
</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-10-16T01:15:58.083932" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:58.083738" elapsed="0.000252">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:58.084124" 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-10-16T01:15:58.083410" elapsed="0.000737"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:15:58.084313" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:15:58.084210" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:58.084193" elapsed="0.000196"/>
</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-10-16T01:15:58.084536" elapsed="0.000020"/>
</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-10-16T01:15:58.084718" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:58.084786" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:15:58.084911" 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-manganese/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-10-16T01:15:58.083114" elapsed="0.001820"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:58.086345" 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-10-16T01:15:58.086118" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:58.086857" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:58.086610" 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-10-16T01:15:58.091318" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:15:58.091374" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:15:58.091471" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:58.087199" elapsed="0.004623">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:58.086958" elapsed="0.004939">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:58.092090" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:58.091927" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-10-16T01:15:58.086941" elapsed="0.005229">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:58.092499" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:58.092623" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:58.092590" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:58.092575" elapsed="0.000106"/>
</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-10-16T01:15:58.092833" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:15:58.092896" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:15:58.085386" elapsed="0.007610">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:58.093078" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:15:58.041331" elapsed="0.051873">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:15:58.093582" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:58.093368" elapsed="0.000295"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:58.093322" elapsed="0.000402"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:58.093811" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:15:58.038659" elapsed="0.055314">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:58.034619" elapsed="0.059469">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:15:58.034577" elapsed="0.059583">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:58.094404" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:15:58.094793" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:58.095114" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:15:58.095460" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:15:58.095908" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:58.096231" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:58.096573" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:15:58.096843" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:15:58.027082" elapsed="0.069864">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:15:58.097009" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:15:58.025124" elapsed="0.071991">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:58.097335" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:58.097196" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:58.097541" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:58.097406" elapsed="0.000183"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:58.097782" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:58.097611" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:58.097180" elapsed="0.000672"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:15:58.024767" elapsed="0.073124">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:15:58.024352" elapsed="0.073590">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:58.097990" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:15:58.015984" elapsed="0.082110">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:58.098269" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:58.098490" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:58.098347" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:58.098332" elapsed="0.000227"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:58.098683" elapsed="0.000143"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:58.098979" elapsed="0.000023"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:58.099054" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:15:58.014384" elapsed="0.084763">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:15:58.013930" elapsed="0.085277">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:15:58.013664" elapsed="0.085627">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:15:58.012902" elapsed="0.086473">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:58.099582" elapsed="0.000021"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:15:57.992076" elapsed="0.107609">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:15:59.118082" elapsed="0.000382"/>
</kw>
<msg time="2026-10-16T01:15:59.118666" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:59.116830" elapsed="0.001980"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:15:59.115891" elapsed="0.003078"/>
</kw>
<msg time="2026-10-16T01:15:59.119086" 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-10-16T01:15:59.109313" elapsed="0.009865"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:15:59.108451" elapsed="0.010878"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:59.120365" 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-10-16T01:15:59.119816" elapsed="0.000642"/>
</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-10-16T01:15:59.126997" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:15:59.126233" elapsed="0.000847"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:59.128088" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:59.127409" elapsed="0.000736"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:15:59.128237" elapsed="0.000060"/>
</return>
<msg time="2026-10-16T01:15:59.128523" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:15:59.125378" elapsed="0.003208"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:15:59.128946" elapsed="0.000308"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:59.130365" 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-10-16T01:15:59.129631" elapsed="0.000790"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:59.131315" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:59.130779" elapsed="0.000590"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:15:59.132247" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:15:59.131675" elapsed="0.000626"/>
</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-10-16T01:15:59.141147" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:15:59.139680" elapsed="0.001577"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:15:59.141383" elapsed="0.000134"/>
</return>
<msg time="2026-10-16T01:15:59.141991" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:15:59.136433" elapsed="0.005706"/>
</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-10-16T01:15:59.170009" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:59.169565" elapsed="0.000497"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:15:59.170999" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:15:59.170738" elapsed="0.000366">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:59.171221" 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-10-16T01:15:59.170275" elapsed="0.000977"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:59.171934" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:59.171484" elapsed="0.000486"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:15:59.172372" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:15:59.172540" 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-10-16T01:15:59.172218" elapsed="0.000356"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:59.173191" 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-10-16T01:15:59.172865" elapsed="0.000383"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:59.174696" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:59.174193" elapsed="0.000583"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:15:59.175378" 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-10-16T01:15:59.175029" elapsed="0.000382"/>
</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-10-16T01:15:59.175818" elapsed="0.000029"/>
</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-10-16T01:15:59.176086" elapsed="0.000032"/>
</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-10-16T01:15:59.176337" elapsed="0.000026"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:15:59.175619" elapsed="0.000788"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:15:59.175471" elapsed="0.000973"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:15:59.176500" elapsed="0.000036"/>
</return>
<msg time="2026-10-16T01:15:59.176678" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:15:59.173681" elapsed="0.003051"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:59.173333" elapsed="0.003441"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:59.177059" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:59.176807" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:59.173309" elapsed="0.003850"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:15:59.177922" 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-10-16T01:15:59.177369" elapsed="0.000588"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:15:59.178036" elapsed="0.000038"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:15:59.168862" elapsed="0.009314"/>
</kw>
<msg time="2026-10-16T01:15:59.178239" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:15:59.163254" elapsed="0.015049"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:59.183481" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:59.187259" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:59.190975" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:59.191161" elapsed="0.000020"/>
</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-10-16T01:15:59.191337" elapsed="0.000019"/>
</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-10-16T01:15:59.191679" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:59.191540" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:59.191527" 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-10-16T01:15:59.191917" elapsed="0.000019"/>
</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-10-16T01:15:59.192110" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:59.192273" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:15:59.191500" elapsed="0.000820"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:15:59.191413" elapsed="0.000930"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:59.192490" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:59.192555" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:15:59.192657" 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-10-16T01:15:59.162398" elapsed="0.030283"/>
</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-10-16T01:15:59.193795" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:59.193589" elapsed="0.000266">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:59.193937" 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-10-16T01:15:59.193271" elapsed="0.000688"/>
</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-10-16T01:15:59.194262" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:59.194040" elapsed="0.000273"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:15:59.194773" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:15:59.194493" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-10-16T01:15:59.194336" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:59.194005" elapsed="0.000844"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:15:59.195348" 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-10-16T01:15:59.195004" elapsed="0.000396"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:15:59.195448" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:15:59.195570" 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-manganese/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-10-16T01:15:59.192956" elapsed="0.002636"/>
</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-10-16T01:15:59.196656" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:15:59.196465" elapsed="0.000266">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:15:59.196822" 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-10-16T01:15:59.196153" elapsed="0.000691"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:15:59.197027" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:15:59.196908" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-10-16T01:15:59.196891" elapsed="0.000214"/>
</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-10-16T01:15:59.197253" elapsed="0.000020"/>
</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-10-16T01:15:59.197422" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:59.197480" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:15:59.197602" 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-manganese/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-10-16T01:15:59.195847" elapsed="0.001778"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:59.199004" 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-10-16T01:15:59.198777" elapsed="0.000281"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:15:59.199470" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:15:59.199253" elapsed="0.000257"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:15:59.203993" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:15:59.204061" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:15:59.204155" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:59.199805" elapsed="0.004664">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:59.199568" elapsed="0.004977">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:59.204745" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:59.204574" elapsed="0.000231"/>
</branch>
<status status="FAIL" start="2026-10-16T01:15:59.199552" elapsed="0.005274">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:15:59.205161" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:59.205279" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:15:59.205247" elapsed="0.000069"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:59.205231" elapsed="0.000105"/>
</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-10-16T01:15:59.205469" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:15:59.205560" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:15:59.198073" elapsed="0.007589">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:59.205751" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:15:59.150268" elapsed="0.055607">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:15:59.206273" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:59.206056" elapsed="0.000298"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:59.205993" elapsed="0.000401"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:15:59.206475" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:15:59.146812" elapsed="0.059825">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:15:59.142590" elapsed="0.064171">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:15:59.142549" elapsed="0.064287">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:59.207089" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:15:59.207429" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:59.207756" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:15:59.208105" elapsed="0.000027"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:15:59.208525" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:59.208863" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:15:59.209221" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:15:59.209454" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:15:59.135117" elapsed="0.074436">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:15:59.209613" elapsed="0.000018"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:15:59.133166" elapsed="0.076578">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:59.209964" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:59.209825" elapsed="0.000199"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:59.210190" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:59.210053" elapsed="0.000185"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:59.210403" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:59.210260" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:59.209809" elapsed="0.000692"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:15:59.132811" elapsed="0.077731">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:15:59.132396" elapsed="0.078197">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:59.210640" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:15:59.123987" elapsed="0.086777">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:59.210945" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:59.211176" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:15:59.211036" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:15:59.211009" elapsed="0.000235"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:59.211370" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:59.211535" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:15:59.211592" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:15:59.122398" elapsed="0.089285">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:15:59.121944" elapsed="0.089899">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:15:59.121677" elapsed="0.090215">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:15:59.120928" elapsed="0.091045">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:15:59.212198" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:15:59.100305" elapsed="0.111998">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:16:00.230925" elapsed="0.000412"/>
</kw>
<msg time="2026-10-16T01:16:00.231439" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:00.229638" elapsed="0.001906"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:16:00.228659" elapsed="0.003200"/>
</kw>
<msg time="2026-10-16T01:16:00.231981" 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-10-16T01:16:00.222110" elapsed="0.010090"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:16:00.221217" elapsed="0.011143"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:00.233417" 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-10-16T01:16:00.232874" elapsed="0.000634"/>
</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-10-16T01:16:00.240259" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:00.239448" elapsed="0.000868"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:00.241303" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:00.240647" elapsed="0.000710"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:00.241450" elapsed="0.000059"/>
</return>
<msg time="2026-10-16T01:16:00.241764" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:00.238582" elapsed="0.003234"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:16:00.242163" elapsed="0.000385"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:00.243657" 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-10-16T01:16:00.242969" elapsed="0.000777"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:00.244593" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:00.244096" elapsed="0.000549"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:00.245501" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:00.244986" elapsed="0.000566"/>
</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-10-16T01:16:00.254130" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:00.252675" elapsed="0.001563"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:00.254364" elapsed="0.000130"/>
</return>
<msg time="2026-10-16T01:16:00.254968" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:00.249489" elapsed="0.005626"/>
</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-10-16T01:16:00.279266" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:00.278825" elapsed="0.000477"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:16:00.280266" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:16:00.279981" elapsed="0.000374">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:00.280471" 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-10-16T01:16:00.279515" elapsed="0.000987"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:00.281209" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:00.280762" elapsed="0.000482"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:16:00.281627" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:16:00.281828" 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-10-16T01:16:00.281468" elapsed="0.000394"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:00.282458" 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-10-16T01:16:00.282152" elapsed="0.000363"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:00.285560" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:00.285237" elapsed="0.000381"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:16:00.286112" 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-10-16T01:16:00.285844" 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-10-16T01:16:00.286417" elapsed="0.000020"/>
</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-10-16T01:16:00.286596" 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-10-16T01:16:00.286827" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:16:00.286290" elapsed="0.000591"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:16:00.286180" elapsed="0.000730"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:16:00.286949" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:16:00.287092" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:16:00.284745" elapsed="0.002370"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:00.284367" elapsed="0.002777"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:00.287311" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:00.287168" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:00.282575" elapsed="0.004806"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:16:00.287937" 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-10-16T01:16:00.287532" elapsed="0.000431"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:16:00.288021" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:16:00.278101" elapsed="0.010022"/>
</kw>
<msg time="2026-10-16T01:16:00.288170" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:00.272364" elapsed="0.015852"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:00.292028" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:00.295839" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:00.299645" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:00.299835" elapsed="0.000020"/>
</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-10-16T01:16:00.300024" 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-10-16T01:16:00.300364" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:00.300223" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:00.300210" elapsed="0.000227"/>
</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-10-16T01:16:00.300585" 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-10-16T01:16:00.300776" 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-10-16T01:16:00.300938" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:16:00.300184" elapsed="0.000803"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:16:00.300094" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:00.301205" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:00.301273" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:16:00.301377" 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-10-16T01:16:00.271476" elapsed="0.029924"/>
</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-10-16T01:16:00.302500" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:00.302308" elapsed="0.000252">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:00.302643" 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-10-16T01:16:00.301972" elapsed="0.000694"/>
</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-10-16T01:16:00.302961" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:00.302746" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:16:00.303474" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:00.303211" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:00.303051" elapsed="0.000479"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:00.302729" elapsed="0.000821"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:00.304074" 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-10-16T01:16:00.303722" elapsed="0.000376"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:16:00.304143" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:16:00.304266" 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-manganese/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-10-16T01:16:00.301658" elapsed="0.002630"/>
</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-10-16T01:16:00.305362" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:00.305166" elapsed="0.000255">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:00.305504" 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-10-16T01:16:00.304840" elapsed="0.000686"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:16:00.305875" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:16:00.305771" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:00.305572" elapsed="0.000380"/>
</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-10-16T01:16:00.306115" 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-10-16T01:16:00.306290" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:00.306350" elapsed="0.000013"/>
</return>
<msg time="2026-10-16T01:16:00.306473" 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-manganese/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-10-16T01:16:00.304528" elapsed="0.001969"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:00.307729" 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-10-16T01:16:00.307490" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:00.308192" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:00.307961" elapsed="0.000271"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:16:00.312181" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:00.312267" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:00.312372" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:00.308512" elapsed="0.004218">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:00.308292" elapsed="0.004516">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:00.312988" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:00.312839" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:00.308275" elapsed="0.004810">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:00.313425" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:00.313544" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:00.313511" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:00.313496" elapsed="0.000106"/>
</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-10-16T01:16:00.313756" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:00.313821" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:16:00.306782" elapsed="0.007140">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:00.313990" elapsed="0.000031"/>
</return>
<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="FAIL" start="2026-10-16T01:16:00.261835" elapsed="0.052296">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:16:00.314513" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:00.314296" elapsed="0.000298"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:00.314249" elapsed="0.000384"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:00.314740" elapsed="0.000042"/>
</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="FAIL" start="2026-10-16T01:16:00.259613" elapsed="0.055299">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:00.255572" elapsed="0.059457">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:16:00.255524" elapsed="0.059578">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:00.315345" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:16:00.315684" elapsed="0.000038"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:00.316024" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:16:00.316367" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:16:00.316847" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:00.317174" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:00.317516" elapsed="0.000019"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:16:00.317790" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:16:00.248198" elapsed="0.069694">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:16:00.317953" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:16:00.246404" elapsed="0.071652">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:00.318274" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:00.318136" elapsed="0.000187"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:00.318479" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:00.318345" elapsed="0.000182"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:00.318690" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:00.318549" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:00.318121" elapsed="0.000664"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:00.246078" elapsed="0.072745">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:00.245645" elapsed="0.073230">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:00.318923" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:16:00.237100" elapsed="0.081925">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:00.319198" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:00.319413" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:00.319276" elapsed="0.000183"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:00.319261" elapsed="0.000219"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:00.319603" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:00.319860" elapsed="0.000025"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:00.319926" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:16:00.235469" elapsed="0.084559">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:16:00.235026" elapsed="0.085064">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:16:00.234769" elapsed="0.085370">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:16:00.233977" elapsed="0.086240">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:00.320456" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:16:00.212948" elapsed="0.107612">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:16:01.339294" elapsed="0.000387"/>
</kw>
<msg time="2026-10-16T01:16:01.339818" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:01.338040" elapsed="0.001887"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:16:01.337095" elapsed="0.003017"/>
</kw>
<msg time="2026-10-16T01:16:01.340203" 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-10-16T01:16:01.330312" elapsed="0.009982"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:16:01.329444" elapsed="0.010998"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:01.341469" 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-10-16T01:16:01.340935" elapsed="0.000627"/>
</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-10-16T01:16:01.348174" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:01.347374" elapsed="0.000858"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:01.349224" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:01.348564" elapsed="0.000713"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:01.349370" elapsed="0.000059"/>
</return>
<msg time="2026-10-16T01:16:01.349652" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:01.346518" elapsed="0.003215"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:16:01.350201" elapsed="0.000293"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:01.351602" 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-10-16T01:16:01.350902" elapsed="0.000756"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:01.352735" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:01.352184" elapsed="0.000609"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:01.353629" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:01.353131" elapsed="0.000550"/>
</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-10-16T01:16:01.362333" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:01.360926" elapsed="0.001515"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:01.362568" elapsed="0.000178"/>
</return>
<msg time="2026-10-16T01:16:01.363207" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:01.357676" elapsed="0.005745"/>
</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-10-16T01:16:01.387229" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:01.386790" elapsed="0.000475"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:16:01.388301" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:16:01.388027" elapsed="0.000363">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:01.388508" 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-10-16T01:16:01.387539" elapsed="0.001001"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:01.389251" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:01.388798" elapsed="0.000489"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:16:01.389667" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:16:01.389869" 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-10-16T01:16:01.389514" elapsed="0.000389"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:01.390504" 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-10-16T01:16:01.390192" elapsed="0.000370"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:01.392108" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:01.391489" elapsed="0.000686"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:16:01.392812" 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-10-16T01:16:01.392418" elapsed="0.000426"/>
</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-10-16T01:16:01.393163" elapsed="0.000020"/>
</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-10-16T01:16:01.393346" elapsed="0.000022"/>
</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-10-16T01:16:01.393524" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:16:01.393033" elapsed="0.000542"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:16:01.392898" elapsed="0.000705"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:16:01.393642" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:16:01.393788" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:16:01.391026" elapsed="0.002785"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:01.390647" elapsed="0.003193"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:01.394024" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:01.393864" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:01.390623" elapsed="0.003474"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:16:01.394637" 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-10-16T01:16:01.394250" elapsed="0.000413"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:16:01.394722" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:16:01.386080" elapsed="0.008744"/>
</kw>
<msg time="2026-10-16T01:16:01.394870" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:01.380365" elapsed="0.014552"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:01.398683" elapsed="0.000037"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:01.402487" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:01.406347" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:01.406524" elapsed="0.000020"/>
</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-10-16T01:16:01.406713" 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-10-16T01:16:01.407066" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:01.406913" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:01.406900" 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-10-16T01:16:01.407295" elapsed="0.000019"/>
</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-10-16T01:16:01.407469" elapsed="0.000018"/>
</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-10-16T01:16:01.407626" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:16:01.406874" elapsed="0.000799"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:16:01.406784" elapsed="0.000926"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:01.407859" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:01.407926" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:16:01.408044" 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-10-16T01:16:01.379424" elapsed="0.028644"/>
</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-10-16T01:16:01.409173" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:01.408964" elapsed="0.000268">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:01.409314" 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-10-16T01:16:01.408627" elapsed="0.000710"/>
</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-10-16T01:16:01.409614" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:01.409400" elapsed="0.000266"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:16:01.410141" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:01.409862" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:01.409689" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:01.409383" elapsed="0.000834"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:01.410726" 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-10-16T01:16:01.410373" elapsed="0.000378"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:16:01.410797" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:16:01.410920" 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-manganese/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-10-16T01:16:01.408332" elapsed="0.002610"/>
</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-10-16T01:16:01.412066" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:01.411863" elapsed="0.000262">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:01.412220" 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-10-16T01:16:01.411532" elapsed="0.000711"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:16:01.412414" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:16:01.412308" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:01.412291" elapsed="0.000200"/>
</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-10-16T01:16:01.412644" elapsed="0.000020"/>
</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-10-16T01:16:01.412830" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:01.412891" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:01.413027" 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-manganese/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-10-16T01:16:01.411232" elapsed="0.001820"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:01.414435" 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-10-16T01:16:01.414212" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:01.414899" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:01.414661" elapsed="0.000278"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:16:01.419150" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:01.419202" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:01.419297" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:01.415237" elapsed="0.004393">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:01.415013" elapsed="0.004716">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:01.419915" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:01.419762" elapsed="0.000211"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:01.414982" elapsed="0.005028">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:01.420350" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:01.420468" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:01.420436" elapsed="0.000069"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:01.420420" elapsed="0.000105"/>
</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-10-16T01:16:01.420659" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:01.420739" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:16:01.413487" elapsed="0.007359">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:01.420944" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:16:01.369745" elapsed="0.051341">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:16:01.421470" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:01.421253" elapsed="0.000298"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:01.421206" elapsed="0.000385"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:01.421675" elapsed="0.000063"/>
</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="FAIL" start="2026-10-16T01:16:01.367579" elapsed="0.054293">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:01.364142" elapsed="0.057829">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:16:01.364099" elapsed="0.057961">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:01.422305" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:16:01.422647" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:01.422976" elapsed="0.000035"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:16:01.423335" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:16:01.423782" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:01.424104" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:01.424445" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:16:01.424682" elapsed="0.000052"/>
</return>
<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="FAIL" start="2026-10-16T01:16:01.356352" elapsed="0.068468">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:16:01.424881" elapsed="0.000014"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:16:01.354535" elapsed="0.070433">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:01.425201" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:01.425063" elapsed="0.000188"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:01.425406" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:01.425272" elapsed="0.000188"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:01.425624" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:01.425482" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:01.425047" elapsed="0.000645"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:01.354203" elapsed="0.071553">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:01.353809" elapsed="0.072000">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:01.425856" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:16:01.345156" elapsed="0.080823">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:01.426171" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:01.426387" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:01.426249" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:01.426234" elapsed="0.000222"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:01.426578" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:01.426840" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:01.426902" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:16:01.343517" elapsed="0.083494">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:16:01.343085" elapsed="0.083991">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:16:01.342825" elapsed="0.084300">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:16:01.342059" elapsed="0.085148">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:01.427413" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:16:01.321181" elapsed="0.106336">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:16:02.446801" elapsed="0.000426"/>
</kw>
<msg time="2026-10-16T01:16:02.447345" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:02.445498" elapsed="0.001965"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:16:02.444571" elapsed="0.003048"/>
</kw>
<msg time="2026-10-16T01:16:02.447738" 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-10-16T01:16:02.437874" elapsed="0.009956"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:16:02.437000" elapsed="0.011000"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:02.449045" 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-10-16T01:16:02.448480" elapsed="0.000658"/>
</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-10-16T01:16:02.456062" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:02.455234" elapsed="0.000886"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:02.457104" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:02.456448" elapsed="0.000712"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:02.457384" elapsed="0.000068"/>
</return>
<msg time="2026-10-16T01:16:02.457690" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:02.454391" elapsed="0.003386"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:16:02.458133" elapsed="0.000304"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:02.459546" 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-10-16T01:16:02.458844" elapsed="0.000758"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:02.460513" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:02.459971" elapsed="0.000595"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:02.461442" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:02.460913" elapsed="0.000582"/>
</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-10-16T01:16:02.470437" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:02.469023" elapsed="0.001523"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:02.470673" elapsed="0.000183"/>
</return>
<msg time="2026-10-16T01:16:02.471315" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:02.465696" elapsed="0.005742"/>
</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-10-16T01:16:02.498939" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:02.498494" elapsed="0.000497"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:16:02.499973" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:16:02.499660" elapsed="0.000435">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:02.500213" 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-10-16T01:16:02.499216" elapsed="0.001028"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:02.500932" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:02.500476" elapsed="0.000491"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:16:02.501380" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:16:02.501574" 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-10-16T01:16:02.501214" elapsed="0.000392"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:02.502233" 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-10-16T01:16:02.501904" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:02.503772" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:02.503250" elapsed="0.000594"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:16:02.504466" 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-10-16T01:16:02.504102" elapsed="0.000398"/>
</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-10-16T01:16:02.504926" elapsed="0.000029"/>
</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-10-16T01:16:02.505201" 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-10-16T01:16:02.505450" elapsed="0.000027"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:16:02.504730" elapsed="0.000791"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:16:02.504559" elapsed="0.001001"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:16:02.505616" elapsed="0.000035"/>
</return>
<msg time="2026-10-16T01:16:02.505884" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:16:02.502758" elapsed="0.003159"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:02.502373" elapsed="0.003584"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:02.506225" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:02.506013" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:02.502350" elapsed="0.003974"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:16:02.507141" 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-10-16T01:16:02.506539" elapsed="0.000639"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:16:02.507240" elapsed="0.000038"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:16:02.497752" elapsed="0.009626"/>
</kw>
<msg time="2026-10-16T01:16:02.507443" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:02.492167" elapsed="0.015339"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:02.512404" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:02.516532" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:02.520307" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:02.520484" elapsed="0.000019"/>
</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-10-16T01:16:02.520658" elapsed="0.000019"/>
</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-10-16T01:16:02.521034" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:02.520879" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:02.520865" elapsed="0.000243"/>
</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-10-16T01:16:02.521265" elapsed="0.000019"/>
</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-10-16T01:16:02.521439" elapsed="0.000018"/>
</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-10-16T01:16:02.521596" elapsed="0.000026"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:16:02.520838" elapsed="0.000814"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:16:02.520742" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:02.521845" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:02.521913" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:02.522033" 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-10-16T01:16:02.491314" elapsed="0.030743"/>
</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-10-16T01:16:02.523193" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:02.523001" elapsed="0.000252">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:02.523335" 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-10-16T01:16:02.522649" elapsed="0.000714"/>
</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-10-16T01:16:02.523639" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:02.523426" elapsed="0.000265"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:16:02.524167" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:02.523890" elapsed="0.000301"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:02.523730" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:02.523409" elapsed="0.000834"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:02.524757" 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-10-16T01:16:02.524398" elapsed="0.000383"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:16:02.524827" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:16:02.524948" 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-manganese/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-10-16T01:16:02.522355" elapsed="0.002615"/>
</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-10-16T01:16:02.526071" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:02.525865" elapsed="0.000264">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:02.526210" 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-10-16T01:16:02.525531" elapsed="0.000702"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:16:02.526400" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:16:02.526296" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:02.526279" elapsed="0.000197"/>
</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-10-16T01:16:02.526623" elapsed="0.000019"/>
</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-10-16T01:16:02.526807" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:02.526868" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:02.527013" 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-manganese/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-10-16T01:16:02.525232" elapsed="0.001805"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:02.528414" 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-10-16T01:16:02.528192" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:02.528876" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:02.528640" elapsed="0.000276"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:16:02.533486" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:02.533545" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:02.533671" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:02.529214" elapsed="0.004860">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:02.528990" elapsed="0.005161">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:02.534331" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:02.534182" elapsed="0.000207"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:02.528958" elapsed="0.005452">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:02.534762" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:02.534881" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:02.534848" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:02.534832" elapsed="0.000107"/>
</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-10-16T01:16:02.535086" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:02.535149" elapsed="0.000013"/>
</return>
<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="FAIL" start="2026-10-16T01:16:02.527469" elapsed="0.007781">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:02.535316" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:16:02.479803" elapsed="0.055637">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:16:02.535852" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:02.535604" elapsed="0.000331"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:02.535557" elapsed="0.000432"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:02.536075" elapsed="0.000037"/>
</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="FAIL" start="2026-10-16T01:16:02.476301" elapsed="0.059939">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:02.472247" elapsed="0.064092">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:16:02.472196" elapsed="0.064215">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:02.536656" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:16:02.537041" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:02.537350" elapsed="0.000023"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:16:02.537696" elapsed="0.000050"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:16:02.538162" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:02.538472" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:02.538850" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:16:02.539133" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:16:02.464373" elapsed="0.074871">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:16:02.539307" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:16:02.462359" elapsed="0.077035">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:02.539614" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:02.539474" elapsed="0.000190"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:02.539850" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:02.539685" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:02.540080" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:02.539922" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:02.539459" elapsed="0.000690"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:02.462013" elapsed="0.078174">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:02.461590" elapsed="0.078648">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:02.540286" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:16:02.452845" elapsed="0.087537">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:02.540555" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:02.540863" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:02.540633" elapsed="0.000279"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:02.540618" elapsed="0.000315"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:02.541075" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:02.541242" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:02.541299" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:16:02.451133" elapsed="0.090263">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:16:02.450625" elapsed="0.090832">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:16:02.450381" elapsed="0.091124">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:16:02.449578" elapsed="0.092008">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:02.541839" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:16:02.428396" elapsed="0.113547">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:16:03.561122" elapsed="0.000397"/>
</kw>
<msg time="2026-10-16T01:16:03.561631" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:03.559850" elapsed="0.001927"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:16:03.558918" elapsed="0.003015"/>
</kw>
<msg time="2026-10-16T01:16:03.562048" 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-10-16T01:16:03.552431" elapsed="0.009707"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:16:03.551526" elapsed="0.010770"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:03.563349" 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-10-16T01:16:03.562801" elapsed="0.000638"/>
</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-10-16T01:16:03.570069" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:03.569265" elapsed="0.000862"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:03.571211" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:03.570457" elapsed="0.000808"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:03.571357" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:16:03.571639" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:03.568386" elapsed="0.003302"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:16:03.572077" elapsed="0.000290"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:03.573449" 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-10-16T01:16:03.572759" elapsed="0.000744"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:03.574372" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:03.573857" elapsed="0.000568"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:03.575305" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:03.574757" elapsed="0.000601"/>
</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-10-16T01:16:03.584091" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:03.582599" elapsed="0.001601"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:03.584329" elapsed="0.000136"/>
</return>
<msg time="2026-10-16T01:16:03.584984" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:03.579322" elapsed="0.005791"/>
</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-10-16T01:16:03.610845" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:03.610346" elapsed="0.000543"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:16:03.612003" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:16:03.611621" elapsed="0.000492">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:03.612237" 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-10-16T01:16:03.611150" elapsed="0.001121"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:03.613139" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:03.612632" elapsed="0.000545"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:16:03.613597" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:16:03.613829" 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-10-16T01:16:03.613420" elapsed="0.000444"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:03.614494" 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-10-16T01:16:03.614166" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:03.617678" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:03.617439" elapsed="0.000298"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:16:03.618192" 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-10-16T01:16:03.617914" 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-10-16T01:16:03.618520" elapsed="0.000020"/>
</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-10-16T01:16:03.618718" 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-10-16T01:16:03.618907" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:16:03.618389" elapsed="0.000569"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:16:03.618267" elapsed="0.000736"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:16:03.619050" elapsed="0.000034"/>
</return>
<msg time="2026-10-16T01:16:03.619193" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:16:03.617097" elapsed="0.002119"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:03.616785" elapsed="0.002460"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:03.619414" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:03.619270" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:03.614626" elapsed="0.004857"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:16:03.620061" 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-10-16T01:16:03.619637" elapsed="0.000450"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:16:03.620132" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:16:03.609545" elapsed="0.010685"/>
</kw>
<msg time="2026-10-16T01:16:03.620278" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:03.603298" elapsed="0.017029"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:03.624127" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:03.627889" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:03.631657" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:03.631921" 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-10-16T01:16:03.632119" elapsed="0.000019"/>
</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-10-16T01:16:03.632480" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:03.632338" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:03.632322" 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-10-16T01:16:03.632722" elapsed="0.000019"/>
</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-10-16T01:16:03.632899" elapsed="0.000018"/>
</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-10-16T01:16:03.633069" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:16:03.632290" elapsed="0.000828"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:16:03.632193" elapsed="0.000950"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:03.633291" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:03.633360" elapsed="0.000016"/>
</return>
<msg time="2026-10-16T01:16:03.633484" 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-10-16T01:16:03.602213" elapsed="0.031296"/>
</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-10-16T01:16:03.634730" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:03.634479" elapsed="0.000326">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:03.634894" 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-10-16T01:16:03.634130" 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-10-16T01:16:03.635221" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:03.634993" elapsed="0.000280"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:16:03.635755" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:03.635474" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:03.635296" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:03.634975" elapsed="0.000859"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:03.636350" 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-10-16T01:16:03.636006" elapsed="0.000368"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:16:03.636420" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:16:03.636545" 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-manganese/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-10-16T01:16:03.633801" elapsed="0.002766"/>
</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-10-16T01:16:03.637659" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:03.637464" elapsed="0.000272">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:03.637820" 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-10-16T01:16:03.637147" elapsed="0.000697"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:16:03.698544" elapsed="0.000044"/>
</return>
<status status="PASS" start="2026-10-16T01:16:03.698318" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:03.637940" elapsed="0.060731"/>
</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-10-16T01:16:03.698911" elapsed="0.000027"/>
</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-10-16T01:16:03.699111" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:03.699174" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:16:03.699353" 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-manganese/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-10-16T01:16:03.636833" elapsed="0.062548"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:03.701001" 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-10-16T01:16:03.700673" elapsed="0.000375"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:03.701454" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:03.701235" elapsed="0.000259"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:16:03.706588" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:03.706642" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:03.706791" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:03.701800" elapsed="0.005402">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:03.701556" elapsed="0.005727">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:03.707464" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:03.707314" elapsed="0.000208"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:03.701539" elapsed="0.006005">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:03.707908" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:03.708044" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:03.708011" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:03.707994" elapsed="0.000109"/>
</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-10-16T01:16:03.708241" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:03.708303" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:16:03.699742" elapsed="0.008663">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:03.708472" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:16:03.591884" elapsed="0.116753">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:16:03.709070" elapsed="0.000078"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:03.708836" elapsed="0.000375"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:03.708784" elapsed="0.000468"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:03.709337" elapsed="0.000038"/>
</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="FAIL" start="2026-10-16T01:16:03.589396" elapsed="0.120114">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:03.585574" elapsed="0.124036">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:16:03.585532" elapsed="0.124151">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:03.709953" elapsed="0.000036"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:16:03.710329" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:03.710642" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:16:03.711035" elapsed="0.000029"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:16:03.711481" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:03.711817" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:03.712190" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:16:03.712432" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:16:03.578028" elapsed="0.134506">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:16:03.712595" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:16:03.576213" elapsed="0.136472">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:03.712937" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:03.712796" elapsed="0.000207"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:03.713163" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:03.713026" elapsed="0.000186"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:03.713374" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:03.713233" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:03.712780" elapsed="0.000662"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:03.575852" elapsed="0.137628">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:03.575452" elapsed="0.138085">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:03.713589" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:16:03.567043" elapsed="0.146639">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:03.713950" elapsed="0.000066"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:03.714223" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:03.714081" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:03.714065" elapsed="0.000226"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:03.714417" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:03.714585" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:03.714643" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:16:03.565419" elapsed="0.149401">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:16:03.564947" elapsed="0.149939">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:16:03.564677" elapsed="0.150259">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:16:03.563906" elapsed="0.151198">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:03.715321" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:16:03.542827" elapsed="0.172598">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:16:04.742609" elapsed="0.000489"/>
</kw>
<msg time="2026-10-16T01:16:04.743225" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:04.741312" elapsed="0.002041"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:16:04.740325" elapsed="0.003198"/>
</kw>
<msg time="2026-10-16T01:16:04.743621" 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-10-16T01:16:04.730734" elapsed="0.013016"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:16:04.729429" elapsed="0.014486"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:04.745076" 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-10-16T01:16:04.744459" elapsed="0.000717"/>
</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-10-16T01:16:04.752336" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:04.751469" elapsed="0.000929"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:04.753472" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:04.752792" elapsed="0.000739"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:04.753634" elapsed="0.000099"/>
</return>
<msg time="2026-10-16T01:16:04.754007" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:04.750554" elapsed="0.003510"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:16:04.754422" elapsed="0.000347"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:04.756104" 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-10-16T01:16:04.755191" elapsed="0.000974"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:04.757456" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:04.756522" elapsed="0.000994"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:04.758489" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:04.757893" elapsed="0.000655"/>
</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-10-16T01:16:04.765574" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:04.764744" elapsed="0.000897"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:04.765745" elapsed="0.000086"/>
</return>
<msg time="2026-10-16T01:16:04.766114" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:04.762619" elapsed="0.003575"/>
</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-10-16T01:16:04.789235" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:04.788888" elapsed="0.000376"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:16:04.790047" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:16:04.789791" elapsed="0.000336">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:04.790214" 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-10-16T01:16:04.789434" elapsed="0.000804"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:04.790749" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:04.790412" elapsed="0.000364"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:16:04.791094" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:16:04.791256" 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-10-16T01:16:04.790972" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:04.791728" 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-10-16T01:16:04.791478" elapsed="0.000295"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:04.792698" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:04.792460" elapsed="0.000299"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:16:04.793265" 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-10-16T01:16:04.792940" elapsed="0.000351"/>
</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-10-16T01:16:04.793583" elapsed="0.000020"/>
</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-10-16T01:16:04.793789" 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-10-16T01:16:04.793989" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:16:04.793451" elapsed="0.000592"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:16:04.793337" elapsed="0.000736"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:16:04.794115" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:16:04.794248" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:16:04.792117" elapsed="0.002154"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:04.791842" elapsed="0.002459"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:04.794472" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:04.794327" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:04.791822" elapsed="0.002721"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:16:04.795153" 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-10-16T01:16:04.794715" elapsed="0.000506"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:16:04.795268" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:16:04.788336" elapsed="0.007035"/>
</kw>
<msg time="2026-10-16T01:16:04.795421" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:04.782603" elapsed="0.012866"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:04.799325" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:04.803478" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:04.807304" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:04.807484" elapsed="0.000020"/>
</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-10-16T01:16:04.807662" elapsed="0.000019"/>
</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-10-16T01:16:04.808037" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:04.807880" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:04.807866" 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-10-16T01:16:04.808263" elapsed="0.000019"/>
</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-10-16T01:16:04.808441" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:04.808603" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:16:04.807839" elapsed="0.000812"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:16:04.807748" elapsed="0.000926"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:04.808842" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:04.808909" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:16:04.809030" 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-10-16T01:16:04.781732" elapsed="0.027322"/>
</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-10-16T01:16:04.810205" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:04.810008" elapsed="0.000259">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:04.810351" 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-10-16T01:16:04.809651" elapsed="0.000723"/>
</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-10-16T01:16:04.810657" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:04.810437" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:16:04.811209" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:04.810924" elapsed="0.000310"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:04.810751" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:04.810420" elapsed="0.000867"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:04.811809" 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-10-16T01:16:04.811446" elapsed="0.000388"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:16:04.811879" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:16:04.812016" 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-manganese/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-10-16T01:16:04.809318" elapsed="0.002722"/>
</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-10-16T01:16:04.813144" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:04.812935" elapsed="0.000269">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:04.813287" 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-10-16T01:16:04.812592" elapsed="0.000718"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:16:04.813473" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:16:04.813374" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:04.813357" elapsed="0.000193"/>
</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-10-16T01:16:04.813718" 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-10-16T01:16:04.813895" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:04.813968" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:16:04.814096" 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-manganese/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-10-16T01:16:04.812289" elapsed="0.001831"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:04.815351" 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-10-16T01:16:04.815124" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:04.815820" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:04.815580" 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-10-16T01:16:04.821558" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:04.821614" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:04.821740" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:04.816162" elapsed="0.005976">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:04.815922" elapsed="0.006329">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:04.822438" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:04.822284" elapsed="0.000214"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:04.815905" elapsed="0.006615">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:04.822888" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:04.823025" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:04.822991" elapsed="0.000074"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:04.822974" elapsed="0.000112"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:04.823225" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:04.823288" elapsed="0.000013"/>
</return>
<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="FAIL" start="2026-10-16T01:16:04.814396" elapsed="0.008996">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:04.823458" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:16:04.771251" elapsed="0.052337">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:16:04.824022" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:04.823781" elapsed="0.000324"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:04.823732" elapsed="0.000411"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:04.824226" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:16:04.769104" elapsed="0.055285">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:04.766483" elapsed="0.058005">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:16:04.766454" elapsed="0.058106">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:04.824829" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:16:04.825192" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:04.825506" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:16:04.825886" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:16:04.826329" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:04.826642" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:04.827024" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:16:04.827264" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:16:04.761198" elapsed="0.066168">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:16:04.827460" elapsed="0.000017"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:16:04.759512" elapsed="0.068042">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:04.827811" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:04.827635" elapsed="0.000230"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:04.828040" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:04.827888" elapsed="0.000204"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:04.828259" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:04.828114" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:04.827619" elapsed="0.000709"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:04.759137" elapsed="0.069230">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:04.758653" elapsed="0.069767">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:04.828470" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:16:04.749079" elapsed="0.079486">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:04.828834" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:04.829085" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:04.828917" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:04.828901" elapsed="0.000260"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:04.829287" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:04.829456" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:04.829513" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:16:04.747322" elapsed="0.082285">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:16:04.746809" elapsed="0.082860">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:16:04.746513" elapsed="0.083281">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:16:04.745655" elapsed="0.084225">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:04.830106" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:16:04.716578" elapsed="0.113634">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:16:05.849435" elapsed="0.000441"/>
</kw>
<msg time="2026-10-16T01:16:05.850012" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:05.848187" elapsed="0.002056"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:16:05.847246" elapsed="0.003162"/>
</kw>
<msg time="2026-10-16T01:16:05.850499" 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-10-16T01:16:05.840318" elapsed="0.010272"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:16:05.839416" elapsed="0.011353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:05.851816" 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-10-16T01:16:05.851272" elapsed="0.000636"/>
</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-10-16T01:16:05.858424" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:05.857638" elapsed="0.000843"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:05.859517" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:05.858847" elapsed="0.000727"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:05.859677" elapsed="0.000101"/>
</return>
<msg time="2026-10-16T01:16:05.860051" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:05.856834" elapsed="0.003273"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:16:05.860463" elapsed="0.000336"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:05.861887" 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-10-16T01:16:05.861197" elapsed="0.000766"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:05.862839" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:05.862303" elapsed="0.000589"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:05.863750" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:05.863224" elapsed="0.000581"/>
</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-10-16T01:16:05.872352" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:05.871002" elapsed="0.001458"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:05.872586" elapsed="0.000291"/>
</return>
<msg time="2026-10-16T01:16:05.873333" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:05.867756" elapsed="0.005701"/>
</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-10-16T01:16:05.896628" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:05.896202" elapsed="0.000461"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:16:05.897668" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:16:05.897366" elapsed="0.000425">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:05.897911" 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-10-16T01:16:05.896904" elapsed="0.001055"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:05.898635" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:05.898200" elapsed="0.000470"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:16:05.899099" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:16:05.899348" 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-10-16T01:16:05.898923" elapsed="0.000459"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:05.900016" 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-10-16T01:16:05.899653" elapsed="0.000422"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:05.901378" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:05.901072" elapsed="0.000348"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:16:05.902014" 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-10-16T01:16:05.901596" elapsed="0.000444"/>
</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-10-16T01:16:05.902325" 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-10-16T01:16:05.902511" elapsed="0.000022"/>
</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-10-16T01:16:05.902694" elapsed="0.000035"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:16:05.902194" elapsed="0.000568"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:16:05.902085" elapsed="0.000706"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:16:05.902831" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:16:05.902980" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:16:05.900513" elapsed="0.002491"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:05.900162" elapsed="0.002872"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:05.903203" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:05.903058" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:05.900138" elapsed="0.003135"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:16:05.903834" 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-10-16T01:16:05.903427" elapsed="0.000433"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:16:05.903904" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:16:05.895471" elapsed="0.008547"/>
</kw>
<msg time="2026-10-16T01:16:05.904065" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:05.889803" elapsed="0.014309"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:05.907881" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:05.911826" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:05.915613" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:05.915842" 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-10-16T01:16:05.916039" 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-10-16T01:16:05.916385" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:05.916241" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:05.916227" 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-10-16T01:16:05.916613" elapsed="0.000019"/>
</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-10-16T01:16:05.916810" elapsed="0.000026"/>
</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-10-16T01:16:05.916993" elapsed="0.000025"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:16:05.916200" elapsed="0.000849"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:16:05.916109" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:05.917224" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:05.917292" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:16:05.917398" 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-10-16T01:16:05.888959" elapsed="0.028462"/>
</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-10-16T01:16:05.918522" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:05.918330" elapsed="0.000252">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:05.918664" 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-10-16T01:16:05.918007" elapsed="0.000680"/>
</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-10-16T01:16:05.918996" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:05.918767" elapsed="0.000281"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:16:05.919492" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:05.919228" elapsed="0.000290"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:05.919071" elapsed="0.000479"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:05.918749" elapsed="0.000821"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:05.920093" 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-10-16T01:16:05.919742" elapsed="0.000376"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:16:05.920163" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:16:05.920287" 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-manganese/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-10-16T01:16:05.917680" elapsed="0.002629"/>
</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-10-16T01:16:05.921386" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:05.921198" elapsed="0.000247">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:05.921527" 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-10-16T01:16:05.920866" elapsed="0.000684"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:16:05.921727" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:16:05.921613" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:05.921596" elapsed="0.000209"/>
</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-10-16T01:16:05.921966" 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-10-16T01:16:05.922175" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:05.922238" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:05.922364" 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-manganese/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-10-16T01:16:05.920553" elapsed="0.001835"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:05.923803" 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-10-16T01:16:05.923558" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:05.924267" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:05.924046" elapsed="0.000263"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:16:05.928984" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:05.929076" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:05.929229" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:05.924592" elapsed="0.005143">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:05.924369" elapsed="0.005476">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:05.930112" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:05.929888" elapsed="0.000307"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:05.924353" elapsed="0.005874">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:05.930692" elapsed="0.000056"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:05.930885" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:05.930839" elapsed="0.000115"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:05.930815" 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-10-16T01:16:05.931171" elapsed="0.000028"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:05.931258" elapsed="0.000020"/>
</return>
<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="FAIL" start="2026-10-16T01:16:05.922851" elapsed="0.008547">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:05.931492" elapsed="0.000021"/>
</return>
<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="FAIL" start="2026-10-16T01:16:05.879313" elapsed="0.052353">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:16:05.932250" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:05.931931" elapsed="0.000433"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:05.931864" elapsed="0.000555"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:05.932534" elapsed="0.000049"/>
</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="FAIL" start="2026-10-16T01:16:05.877169" elapsed="0.055665">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:05.874116" elapsed="0.058878">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:16:05.874072" elapsed="0.059026">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:05.933445" elapsed="0.000033"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:16:05.933972" elapsed="0.000030"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:05.934409" elapsed="0.000028"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:16:05.934917" elapsed="0.000049"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:16:05.935527" elapsed="0.000031"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:05.936008" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:05.936490" elapsed="0.000028"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:16:05.936911" elapsed="0.000040"/>
</return>
<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="FAIL" start="2026-10-16T01:16:05.866122" elapsed="0.070950">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:16:05.937159" elapsed="0.000021"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:16:05.864614" elapsed="0.072670">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:05.937590" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:05.937395" elapsed="0.000265"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:05.938036" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:05.937691" elapsed="0.000433"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:05.938336" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:05.938162" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:05.937373" elapsed="0.001031"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:05.864288" elapsed="0.074154">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:05.863899" elapsed="0.074596">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:05.938543" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:16:05.855457" elapsed="0.083175">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:05.938864" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:05.939103" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:05.938962" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:05.938934" elapsed="0.000239"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:05.939330" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:05.939500" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:05.939558" elapsed="0.000015"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:16:05.853883" elapsed="0.085768">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:16:05.853406" elapsed="0.086329">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:16:05.853164" elapsed="0.086623">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:16:05.852370" elapsed="0.087498">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:05.940143" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:16:05.831096" elapsed="0.109153">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:16:06.959405" elapsed="0.000447"/>
</kw>
<msg time="2026-10-16T01:16:06.959999" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:06.958136" elapsed="0.001987"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:16:06.957187" elapsed="0.003095"/>
</kw>
<msg time="2026-10-16T01:16:06.960374" 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-10-16T01:16:06.950525" elapsed="0.009938"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:16:06.949651" elapsed="0.010960"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:06.961667" 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-10-16T01:16:06.961151" elapsed="0.000644"/>
</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-10-16T01:16:06.968432" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:06.967612" elapsed="0.000879"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:06.969527" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:06.968891" elapsed="0.000690"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:06.969676" elapsed="0.000097"/>
</return>
<msg time="2026-10-16T01:16:06.970035" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:06.966804" elapsed="0.003284"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:16:06.970414" elapsed="0.000281"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:06.971825" 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-10-16T01:16:06.971120" elapsed="0.000761"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:06.972769" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:06.972235" elapsed="0.000590"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:06.973814" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:06.973159" elapsed="0.000710"/>
</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-10-16T01:16:06.982574" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:06.981209" elapsed="0.001474"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:06.982997" elapsed="0.000136"/>
</return>
<msg time="2026-10-16T01:16:06.983560" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:06.977906" elapsed="0.005780"/>
</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-10-16T01:16:07.007384" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:07.006958" elapsed="0.000461"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:16:07.008418" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:16:07.008123" elapsed="0.000390">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:07.008631" 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-10-16T01:16:07.007636" elapsed="0.001027"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:07.009369" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:07.008919" elapsed="0.000485"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:16:07.009816" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:16:07.010032" 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-10-16T01:16:07.009629" elapsed="0.000437"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:07.010643" 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-10-16T01:16:07.010335" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:07.013440" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:07.013199" elapsed="0.000286"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:16:07.013973" 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-10-16T01:16:07.013667" elapsed="0.000331"/>
</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-10-16T01:16:07.014283" elapsed="0.000020"/>
</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-10-16T01:16:07.014464" elapsed="0.000022"/>
</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-10-16T01:16:07.014643" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:16:07.014154" elapsed="0.000541"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:16:07.014043" elapsed="0.000722"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:16:07.014807" elapsed="0.000028"/>
</return>
<msg time="2026-10-16T01:16:07.014955" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:16:07.012817" elapsed="0.002163"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:07.012534" elapsed="0.002475"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:07.015179" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:07.015034" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:07.010785" elapsed="0.004465"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:16:07.015815" 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-10-16T01:16:07.015403" elapsed="0.000438"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:16:07.015886" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:16:07.006220" elapsed="0.009788"/>
</kw>
<msg time="2026-10-16T01:16:07.016107" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:07.000491" elapsed="0.015665"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:07.020074" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:07.023903" elapsed="0.000037"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:07.027871" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:07.028066" elapsed="0.000020"/>
</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-10-16T01:16:07.028245" elapsed="0.000019"/>
</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-10-16T01:16:07.028588" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:07.028445" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:07.028431" 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-10-16T01:16:07.028829" elapsed="0.000019"/>
</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-10-16T01:16:07.029019" 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-10-16T01:16:07.029180" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:16:07.028405" elapsed="0.000824"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:16:07.028315" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:07.029400" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:07.029467" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:16:07.029571" 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-10-16T01:16:06.999631" elapsed="0.029965"/>
</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-10-16T01:16:07.030730" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:07.030513" elapsed="0.000281">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:07.030910" 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-10-16T01:16:07.030188" elapsed="0.000761"/>
</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-10-16T01:16:07.031232" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:07.031015" elapsed="0.000268"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:16:07.031754" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:07.031472" elapsed="0.000307"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:07.031306" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:07.030998" elapsed="0.000834"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:07.032356" 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-10-16T01:16:07.032007" elapsed="0.000374"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:16:07.032428" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:16:07.032551" 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-manganese/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-10-16T01:16:07.029875" elapsed="0.002699"/>
</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-10-16T01:16:07.033656" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:07.033467" elapsed="0.000265">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:07.033816" 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-10-16T01:16:07.033148" elapsed="0.000691"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:16:07.034194" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:16:07.034089" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:07.033886" elapsed="0.000387"/>
</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-10-16T01:16:07.034426" elapsed="0.000020"/>
</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-10-16T01:16:07.034598" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:07.034659" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:07.034801" 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-manganese/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-10-16T01:16:07.032832" elapsed="0.001993"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:07.036080" 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-10-16T01:16:07.035835" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:07.036531" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:07.036309" elapsed="0.000263"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:16:07.040965" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:07.041056" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:07.041220" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:07.036875" elapsed="0.004865">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:07.036632" elapsed="0.005220">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:07.042124" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:07.041896" elapsed="0.000355"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:07.036615" elapsed="0.005670">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:07.042783" elapsed="0.000034"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:07.042975" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:07.042907" elapsed="0.000124"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:07.042884" elapsed="0.000175"/>
</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-10-16T01:16:07.043251" elapsed="0.000028"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:07.043339" elapsed="0.000020"/>
</return>
<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="FAIL" start="2026-10-16T01:16:07.035118" elapsed="0.008363">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:07.043577" elapsed="0.000020"/>
</return>
<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="FAIL" start="2026-10-16T01:16:06.989911" elapsed="0.053877">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:16:07.044348" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:07.044042" elapsed="0.000421"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:07.043975" elapsed="0.000545"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:07.044636" elapsed="0.000049"/>
</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="FAIL" start="2026-10-16T01:16:06.987694" elapsed="0.057197">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:06.984328" elapsed="0.060720">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:16:06.984283" elapsed="0.060868">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:07.045494" elapsed="0.000033"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:16:07.046058" elapsed="0.000037"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:07.046445" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:16:07.046815" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:16:07.047257" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:07.047569" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:07.047956" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:16:07.048196" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:16:06.976535" elapsed="0.071763">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:16:07.048360" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:16:06.974693" elapsed="0.073756">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:07.048779" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:07.048565" elapsed="0.000268"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:07.049009" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:07.048856" elapsed="0.000204"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:07.049224" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:07.049082" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:07.048547" elapsed="0.000746"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:06.974364" elapsed="0.074972">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:06.973993" elapsed="0.075397">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:07.049438" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:16:06.965419" elapsed="0.084111">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:07.049751" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:07.049987" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:07.049832" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:07.049817" elapsed="0.000240"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:07.050182" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:07.050348" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:07.050407" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:16:06.963794" elapsed="0.086706">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:16:06.963318" elapsed="0.087244">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:16:06.963068" elapsed="0.087543">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:16:06.962269" elapsed="0.088492">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:07.050994" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:16:06.941096" elapsed="0.110005">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:16:08.070369" elapsed="0.000449"/>
</kw>
<msg time="2026-10-16T01:16:08.070959" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:08.069096" elapsed="0.001989"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:16:08.068152" elapsed="0.003095"/>
</kw>
<msg time="2026-10-16T01:16:08.071451" 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-10-16T01:16:08.061537" elapsed="0.010011"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:16:08.060650" elapsed="0.011215"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:08.073004" 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-10-16T01:16:08.072421" elapsed="0.000678"/>
</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-10-16T01:16:08.079679" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:08.078897" elapsed="0.000873"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:08.080769" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:08.080132" elapsed="0.000693"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:08.080944" elapsed="0.000067"/>
</return>
<msg time="2026-10-16T01:16:08.081240" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:08.078084" elapsed="0.003207"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:16:08.081615" elapsed="0.000336"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:08.083078" 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-10-16T01:16:08.082333" elapsed="0.000802"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:08.084026" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:08.083464" elapsed="0.000615"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:08.084950" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:08.084388" elapsed="0.000618"/>
</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-10-16T01:16:08.093623" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:08.092280" elapsed="0.001518"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:08.094012" elapsed="0.000141"/>
</return>
<msg time="2026-10-16T01:16:08.094576" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:08.089040" elapsed="0.005704"/>
</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-10-16T01:16:08.118001" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:08.117533" elapsed="0.000506"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:16:08.119046" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:16:08.118717" elapsed="0.000433">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:08.119271" 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-10-16T01:16:08.118256" elapsed="0.001047"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:08.120020" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:08.119538" elapsed="0.000518"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:16:08.120443" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:16:08.120647" 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-10-16T01:16:08.120282" elapsed="0.000398"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:08.121494" 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-10-16T01:16:08.121022" elapsed="0.000531"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:08.122818" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:08.122409" elapsed="0.000451"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:16:08.123323" 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-10-16T01:16:08.123060" 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-10-16T01:16:08.123643" elapsed="0.000020"/>
</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-10-16T01:16:08.123847" 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-10-16T01:16:08.124048" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:16:08.123513" elapsed="0.000590"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:16:08.123397" elapsed="0.000736"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:16:08.124175" elapsed="0.000029"/>
</return>
<msg time="2026-10-16T01:16:08.124311" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:16:08.122072" elapsed="0.002263"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:08.121648" elapsed="0.002716"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:08.124533" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:08.124390" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:08.121621" elapsed="0.002982"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:16:08.125182" 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-10-16T01:16:08.124773" elapsed="0.000434"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:16:08.125251" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:16:08.116814" elapsed="0.008536"/>
</kw>
<msg time="2026-10-16T01:16:08.125398" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:08.111119" elapsed="0.014325"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:08.129319" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:08.133335" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:08.137140" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:08.137318" elapsed="0.000020"/>
</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-10-16T01:16:08.137494" 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-10-16T01:16:08.137895" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:08.137715" elapsed="0.000250"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:08.137688" elapsed="0.000301"/>
</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-10-16T01:16:08.138143" elapsed="0.000019"/>
</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-10-16T01:16:08.138321" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:08.138481" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:16:08.137661" elapsed="0.000869"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:16:08.137571" elapsed="0.000982"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:08.138717" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:08.138787" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:16:08.138892" 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-10-16T01:16:08.110251" elapsed="0.028677"/>
</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-10-16T01:16:08.140057" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:08.139836" elapsed="0.000285">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:08.140205" 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-10-16T01:16:08.139497" elapsed="0.000731"/>
</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-10-16T01:16:08.140509" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:08.140292" elapsed="0.000268"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:16:08.141052" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:08.140770" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:08.140584" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:08.140275" elapsed="0.000853"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:08.141622" 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-10-16T01:16:08.141285" elapsed="0.000361"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:16:08.141692" elapsed="0.000042"/>
</return>
<msg time="2026-10-16T01:16:08.141832" 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-manganese/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-10-16T01:16:08.139200" elapsed="0.002655"/>
</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-10-16T01:16:08.142952" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:08.142747" elapsed="0.000265">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:08.143096" 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-10-16T01:16:08.142414" elapsed="0.000704"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:16:08.143286" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:16:08.143182" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:08.143165" elapsed="0.000198"/>
</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-10-16T01:16:08.143514" elapsed="0.000020"/>
</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-10-16T01:16:08.143686" elapsed="0.000034"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:08.143762" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:16:08.143888" 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-manganese/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-10-16T01:16:08.142117" elapsed="0.001839"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:08.145373" 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-10-16T01:16:08.145147" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:08.145843" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:08.145603" 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-10-16T01:16:08.150502" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:08.150567" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:08.150671" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:08.146191" elapsed="0.004935">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:08.145964" elapsed="0.005272">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:08.151490" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:08.151280" elapsed="0.000291"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:08.145947" elapsed="0.005654">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:08.152112" elapsed="0.000033"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:08.152279" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:08.152233" elapsed="0.000100"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:08.152211" elapsed="0.000150"/>
</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-10-16T01:16:08.152549" elapsed="0.000027"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:08.152635" elapsed="0.000020"/>
</return>
<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="FAIL" start="2026-10-16T01:16:08.144410" elapsed="0.008389">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:08.152895" elapsed="0.000036"/>
</return>
<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="FAIL" start="2026-10-16T01:16:08.100526" elapsed="0.052571">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:16:08.153634" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:08.153332" elapsed="0.000447"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:08.153265" elapsed="0.000572"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:08.153970" elapsed="0.000055"/>
</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="FAIL" start="2026-10-16T01:16:08.098406" elapsed="0.055800">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:08.095231" elapsed="0.059159">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:16:08.095186" elapsed="0.059316">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:08.154877" elapsed="0.000033"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:16:08.155387" elapsed="0.000029"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:08.155863" elapsed="0.000030"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:16:08.156375" elapsed="0.000032"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:16:08.157036" elapsed="0.000031"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:08.157478" elapsed="0.000028"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:08.158021" elapsed="0.000029"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:16:08.158361" elapsed="0.000024"/>
</return>
<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="FAIL" start="2026-10-16T01:16:08.087663" elapsed="0.070841">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:16:08.158589" elapsed="0.000021"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:16:08.085845" elapsed="0.072966">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:08.159159" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:08.158951" 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="NOT RUN" start="2026-10-16T01:16:08.159453" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:08.159262" elapsed="0.000258"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:08.159851" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:08.159551" elapsed="0.000393"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:08.158907" elapsed="0.001063"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:08.085481" elapsed="0.074528">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:08.085106" elapsed="0.074958">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:08.160112" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:16:08.076681" elapsed="0.083530">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:08.160391" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:08.160609" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:08.160469" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:08.160454" elapsed="0.000224"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:08.160840" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:08.161037" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:08.161097" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:16:08.075112" elapsed="0.086116">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:16:08.074602" elapsed="0.086690">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:16:08.074353" elapsed="0.086991">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:16:08.073546" elapsed="0.087883">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:08.161646" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:16:08.051960" elapsed="0.109811">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:16:09.180644" elapsed="0.000451"/>
</kw>
<msg time="2026-10-16T01:16:09.181212" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:09.179395" elapsed="0.001934"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:16:09.178469" elapsed="0.003016"/>
</kw>
<msg time="2026-10-16T01:16:09.181577" 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-10-16T01:16:09.171970" elapsed="0.009695"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:16:09.171089" elapsed="0.010754"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:09.182921" 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-10-16T01:16:09.182340" elapsed="0.000673"/>
</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-10-16T01:16:09.189499" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:09.188749" elapsed="0.000806"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:09.190526" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:09.189932" elapsed="0.000648"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:09.190672" elapsed="0.000091"/>
</return>
<msg time="2026-10-16T01:16:09.191013" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:09.187936" elapsed="0.003128"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:16:09.191392" elapsed="0.000279"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:09.192995" 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-10-16T01:16:09.192271" elapsed="0.000780"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:09.193899" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:09.193376" elapsed="0.000596"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:09.194814" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:09.194276" elapsed="0.000590"/>
</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-10-16T01:16:09.203476" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:09.202028" elapsed="0.001659"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:09.203939" elapsed="0.000147"/>
</return>
<msg time="2026-10-16T01:16:09.204539" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:09.198804" elapsed="0.005869"/>
</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-10-16T01:16:09.228592" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:09.228141" elapsed="0.000489"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:16:09.229675" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:16:09.229337" elapsed="0.000468">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:09.229938" 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-10-16T01:16:09.228877" elapsed="0.001094"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:09.230639" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:09.230209" elapsed="0.000465"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:16:09.231128" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:16:09.231442" 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-10-16T01:16:09.230963" elapsed="0.000513"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:09.232120" 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-10-16T01:16:09.231776" elapsed="0.000403"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:09.233724" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:09.233149" elapsed="0.000639"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:16:09.234439" 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-10-16T01:16:09.234062" elapsed="0.000413"/>
</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-10-16T01:16:09.234949" elapsed="0.000031"/>
</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-10-16T01:16:09.235220" elapsed="0.000032"/>
</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-10-16T01:16:09.235491" elapsed="0.000028"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:16:09.234736" elapsed="0.000831"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:16:09.234542" elapsed="0.001068"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:16:09.235672" elapsed="0.000089"/>
</return>
<msg time="2026-10-16T01:16:09.236038" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:16:09.232625" elapsed="0.003450"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:09.232271" elapsed="0.003848"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:09.236369" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:09.236155" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:09.232244" elapsed="0.004229"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:16:09.237329" 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-10-16T01:16:09.236723" elapsed="0.000643"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:16:09.237431" elapsed="0.000038"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:16:09.227405" elapsed="0.010172"/>
</kw>
<msg time="2026-10-16T01:16:09.237748" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:09.221689" elapsed="0.016134"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:09.243800" elapsed="0.000037"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:09.249508" elapsed="0.000037"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:09.255243" elapsed="0.000036"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:09.255515" elapsed="0.000029"/>
</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-10-16T01:16:09.255800" 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-10-16T01:16:09.256343" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:09.256129" elapsed="0.000289"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:09.256108" elapsed="0.000345"/>
</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-10-16T01:16:09.256678" elapsed="0.000059"/>
</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-10-16T01:16:09.256991" 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-10-16T01:16:09.257232" elapsed="0.000027"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:16:09.256067" elapsed="0.001236"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:16:09.255922" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:09.257561" elapsed="0.000027"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:09.257660" elapsed="0.000021"/>
</return>
<msg time="2026-10-16T01:16:09.257846" 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-10-16T01:16:09.220829" elapsed="0.037053"/>
</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-10-16T01:16:09.259600" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:09.259289" elapsed="0.000432">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:09.259849" 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-10-16T01:16:09.258772" elapsed="0.001111"/>
</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-10-16T01:16:09.260325" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:09.259999" elapsed="0.000455"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:16:09.261198" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:09.260772" elapsed="0.000462"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:09.260490" elapsed="0.000793"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:09.259973" elapsed="0.001340"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:09.262100" 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-10-16T01:16:09.261548" elapsed="0.000588"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:16:09.262203" elapsed="0.000040"/>
</return>
<msg time="2026-10-16T01:16:09.262387" 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-manganese/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-10-16T01:16:09.258296" elapsed="0.004125"/>
</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-10-16T01:16:09.264070" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:09.263770" elapsed="0.000388">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:09.264282" 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-10-16T01:16:09.263279" elapsed="0.001037"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:16:09.264554" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-10-16T01:16:09.264410" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:09.264386" elapsed="0.000280"/>
</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-10-16T01:16:09.264923" elapsed="0.000032"/>
</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-10-16T01:16:09.265184" elapsed="0.000027"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:09.265272" elapsed="0.000020"/>
</return>
<msg time="2026-10-16T01:16:09.265452" 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-manganese/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-10-16T01:16:09.262811" elapsed="0.002675"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:09.267435" 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-10-16T01:16:09.267204" elapsed="0.000274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:09.267916" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:09.267664" elapsed="0.000295"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:16:09.272823" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:09.272880" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:09.273001" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:09.268246" elapsed="0.005253">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:09.268020" elapsed="0.005595">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:09.273935" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:09.273660" elapsed="0.000364"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:09.268003" elapsed="0.006053">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:09.274566" elapsed="0.000034"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:09.274838" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:09.274787" elapsed="0.000108"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:09.274761" 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-10-16T01:16:09.275150" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:09.275244" elapsed="0.000020"/>
</return>
<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="FAIL" start="2026-10-16T01:16:09.266199" elapsed="0.009196">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:09.275498" elapsed="0.000022"/>
</return>
<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="FAIL" start="2026-10-16T01:16:09.211124" elapsed="0.064618">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:16:09.276341" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:09.276018" elapsed="0.000451"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:09.275947" elapsed="0.000581"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:09.276650" elapsed="0.000078"/>
</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="FAIL" start="2026-10-16T01:16:09.208961" elapsed="0.067981">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:09.205240" elapsed="0.071852">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:16:09.205192" elapsed="0.072011">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:09.277571" elapsed="0.000038"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:16:09.278157" elapsed="0.000030"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:09.278617" elapsed="0.000029"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:16:09.279179" elapsed="0.000033"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:16:09.279847" elapsed="0.000033"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:09.280336" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:09.280952" elapsed="0.000031"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:16:09.281307" elapsed="0.000024"/>
</return>
<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="FAIL" start="2026-10-16T01:16:09.197462" elapsed="0.083995">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:16:09.281549" elapsed="0.000022"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:16:09.195668" elapsed="0.086015">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:09.282141" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:09.281928" elapsed="0.000287"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:09.282503" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:09.282248" elapsed="0.000331"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:09.282883" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:09.282612" elapsed="0.000365"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:09.281886" elapsed="0.001124"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:09.195347" elapsed="0.087721">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:09.194981" elapsed="0.088167">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:09.283222" elapsed="0.000021"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:16:09.186542" elapsed="0.096816">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:09.283621" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:09.284002" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:09.283771" elapsed="0.000302"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:09.283747" elapsed="0.000358"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:09.284293" elapsed="0.000028"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:09.284541" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:09.284604" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:16:09.184980" elapsed="0.099753">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:16:09.184478" elapsed="0.100321">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:16:09.184239" elapsed="0.100610">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:16:09.183448" elapsed="0.101502">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:09.285166" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:16:09.162524" elapsed="0.122748">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:16:10.304389" elapsed="0.000433"/>
</kw>
<msg time="2026-10-16T01:16:10.304963" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:10.303124" elapsed="0.001959"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:16:10.302179" elapsed="0.003060"/>
</kw>
<msg time="2026-10-16T01:16:10.305328" 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-10-16T01:16:10.295643" elapsed="0.009774"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:16:10.294793" elapsed="0.010772"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:10.306765" 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-10-16T01:16:10.306210" elapsed="0.000653"/>
</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-10-16T01:16:10.313728" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:10.312958" elapsed="0.000832"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:10.314789" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:10.314152" elapsed="0.000693"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:10.314961" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:16:10.315250" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:10.312090" elapsed="0.003211"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:16:10.315636" elapsed="0.000342"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:10.317080" 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-10-16T01:16:10.316359" elapsed="0.000777"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:10.318026" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:10.317460" elapsed="0.000622"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:10.318937" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:10.318389" elapsed="0.000603"/>
</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-10-16T01:16:10.327552" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:10.326199" elapsed="0.001460"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:10.327961" elapsed="0.000136"/>
</return>
<msg time="2026-10-16T01:16:10.328519" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:10.322995" elapsed="0.005647"/>
</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-10-16T01:16:10.351881" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:10.351433" elapsed="0.000506"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:16:10.352952" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:16:10.352597" elapsed="0.000461">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:10.353177" 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-10-16T01:16:10.352154" elapsed="0.001055"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:10.353923" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:10.353445" elapsed="0.000515"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:16:10.354346" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:16:10.354621" 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-10-16T01:16:10.354188" elapsed="0.000467"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:10.355278" 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-10-16T01:16:10.354968" elapsed="0.000367"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:10.358672" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:10.358337" elapsed="0.000416"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:16:10.359444" 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-10-16T01:16:10.359016" elapsed="0.000464"/>
</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-10-16T01:16:10.359923" elapsed="0.000031"/>
</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-10-16T01:16:10.360186" 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-10-16T01:16:10.360436" elapsed="0.000028"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:16:10.359719" elapsed="0.000790"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:16:10.359544" elapsed="0.001003"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:16:10.360604" elapsed="0.000039"/>
</return>
<msg time="2026-10-16T01:16:10.360812" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:16:10.357804" elapsed="0.003041"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:10.357421" elapsed="0.003466"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:10.361153" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:10.360944" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:10.355397" elapsed="0.005854"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:16:10.362069" 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-10-16T01:16:10.361474" elapsed="0.000632"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:16:10.362168" elapsed="0.000037"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:16:10.350716" elapsed="0.011592"/>
</kw>
<msg time="2026-10-16T01:16:10.362375" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:10.344849" elapsed="0.017592"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:10.367901" elapsed="0.000037"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:10.373230" elapsed="0.000036"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:10.377992" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:10.378175" elapsed="0.000019"/>
</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-10-16T01:16:10.378352" elapsed="0.000019"/>
</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-10-16T01:16:10.378687" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:10.378546" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:10.378533" elapsed="0.000244"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:10.378946" 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-10-16T01:16:10.379124" elapsed="0.000018"/>
</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-10-16T01:16:10.379324" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:16:10.378507" elapsed="0.000866"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:16:10.378419" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:10.379546" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:10.379615" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:10.379735" 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-10-16T01:16:10.343996" elapsed="0.035764"/>
</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-10-16T01:16:10.380880" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:10.380659" elapsed="0.000304">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:10.381045" 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-10-16T01:16:10.380334" elapsed="0.000734"/>
</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-10-16T01:16:10.381351" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:10.381131" elapsed="0.000271"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:16:10.381873" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:10.381591" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:10.381425" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:10.381114" elapsed="0.000854"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:10.382478" 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-10-16T01:16:10.382128" elapsed="0.000374"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:16:10.382548" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:16:10.382670" 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-manganese/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-10-16T01:16:10.380034" elapsed="0.002659"/>
</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-10-16T01:16:10.383786" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:10.383582" elapsed="0.000263">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:10.383942" 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-10-16T01:16:10.383265" elapsed="0.000701"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:16:10.384303" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:16:10.384198" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:10.384014" elapsed="0.000368"/>
</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-10-16T01:16:10.384535" elapsed="0.000020"/>
</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-10-16T01:16:10.384723" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:10.384786" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:10.384927" 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-manganese/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-10-16T01:16:10.382970" elapsed="0.001982"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:10.386190" 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-10-16T01:16:10.385962" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:10.386680" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:10.386457" 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-10-16T01:16:10.391347" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:10.391410" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:10.391521" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:10.387037" elapsed="0.004894">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:10.386799" elapsed="0.005216">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:10.392200" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:10.392047" elapsed="0.000211"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:10.386782" elapsed="0.005498">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:10.392617" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:10.392756" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:10.392721" elapsed="0.000074"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:10.392687" elapsed="0.000128"/>
</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-10-16T01:16:10.392966" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:10.393030" elapsed="0.000013"/>
</return>
<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="FAIL" start="2026-10-16T01:16:10.385226" elapsed="0.007907">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:10.393200" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:16:10.334173" elapsed="0.059158">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:16:10.393741" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:10.393498" elapsed="0.000327"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:10.393451" elapsed="0.000414"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:10.393967" elapsed="0.000037"/>
</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="FAIL" start="2026-10-16T01:16:10.331962" elapsed="0.062170">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:10.329322" elapsed="0.064909">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:16:10.329279" elapsed="0.065025">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:10.394552" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:16:10.394962" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:10.395281" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:16:10.395629" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:16:10.396106" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:10.396419" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:10.396810" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:16:10.397059" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:16:10.321625" elapsed="0.075536">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:16:10.397223" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:16:10.319825" elapsed="0.077487">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:10.397532" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:10.397391" elapsed="0.000190"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:10.397767" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:10.397603" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:10.398002" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:10.397839" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:10.397376" elapsed="0.000699"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:10.319461" elapsed="0.078653">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:10.319090" elapsed="0.079077">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:10.398216" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:16:10.310488" elapsed="0.087818">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:10.398480" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:10.398697" elapsed="0.000107"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:10.398557" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:10.398543" elapsed="0.000313"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:10.398999" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:10.399167" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:10.399225" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:16:10.308877" elapsed="0.090440">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:16:10.308399" elapsed="0.090980">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:16:10.308157" elapsed="0.091309">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:16:10.307337" elapsed="0.092211">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:10.399833" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:16:10.286164" elapsed="0.113788">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:16:11.419209" elapsed="0.000420"/>
</kw>
<msg time="2026-10-16T01:16:11.419785" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:11.417941" elapsed="0.001995"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:16:11.417000" elapsed="0.003102"/>
</kw>
<msg time="2026-10-16T01:16:11.420195" 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-10-16T01:16:11.410369" elapsed="0.009918"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:16:11.409474" elapsed="0.010963"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:11.421498" 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-10-16T01:16:11.420973" elapsed="0.000618"/>
</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-10-16T01:16:11.428696" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:11.427876" elapsed="0.000916"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:11.429870" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:11.429180" elapsed="0.000771"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:11.430054" elapsed="0.000070"/>
</return>
<msg time="2026-10-16T01:16:11.430370" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:11.426975" elapsed="0.003449"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:16:11.430814" elapsed="0.000332"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:11.432525" 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-10-16T01:16:11.431546" elapsed="0.001039"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:11.433551" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:11.432999" elapsed="0.000608"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:11.434536" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:11.433996" elapsed="0.000598"/>
</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-10-16T01:16:11.444122" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:11.442502" elapsed="0.001739"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:11.444377" elapsed="0.000148"/>
</return>
<msg time="2026-10-16T01:16:11.445201" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:11.438973" elapsed="0.006365"/>
</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-10-16T01:16:11.469562" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:11.469133" elapsed="0.000466"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:16:11.470628" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:16:11.470325" elapsed="0.000439">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:11.470902" 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-10-16T01:16:11.469843" elapsed="0.001093"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:11.471609" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:11.471175" elapsed="0.000469"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:16:11.472080" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:16:11.472283" 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-10-16T01:16:11.471913" elapsed="0.000404"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:11.472948" 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-10-16T01:16:11.472592" elapsed="0.000414"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:11.474490" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:11.473961" elapsed="0.000587"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:16:11.475247" 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-10-16T01:16:11.474815" elapsed="0.000475"/>
</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-10-16T01:16:11.475717" elapsed="0.000031"/>
</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-10-16T01:16:11.476001" elapsed="0.000033"/>
</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-10-16T01:16:11.476256" elapsed="0.000028"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:16:11.475516" elapsed="0.000813"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:16:11.475359" elapsed="0.001011"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:16:11.476429" elapsed="0.000038"/>
</return>
<msg time="2026-10-16T01:16:11.476614" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:16:11.473446" elapsed="0.003200"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:11.473097" elapsed="0.003589"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:11.476965" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:11.476743" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:11.473071" elapsed="0.004003"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:16:11.477855" 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-10-16T01:16:11.477290" elapsed="0.000617"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:16:11.477971" elapsed="0.000038"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:16:11.468381" elapsed="0.009729"/>
</kw>
<msg time="2026-10-16T01:16:11.478177" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:11.462621" elapsed="0.015621"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:11.483591" elapsed="0.000035"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:11.489033" elapsed="0.000035"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:11.494140" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:11.494321" 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-10-16T01:16:11.494500" 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-10-16T01:16:11.494866" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:11.494722" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:11.494693" elapsed="0.000262"/>
</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-10-16T01:16:11.495115" 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-10-16T01:16:11.495296" elapsed="0.000018"/>
</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-10-16T01:16:11.495455" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:16:11.494665" elapsed="0.000839"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:16:11.494572" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:11.495678" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:11.495762" elapsed="0.000016"/>
</return>
<msg time="2026-10-16T01:16:11.495876" 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-10-16T01:16:11.461651" elapsed="0.034265"/>
</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-10-16T01:16:11.497095" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:11.496859" elapsed="0.000306">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:11.497251" 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-10-16T01:16:11.496499" elapsed="0.000775"/>
</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-10-16T01:16:11.497559" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:11.497337" elapsed="0.000274"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:16:11.498115" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:11.497826" elapsed="0.000313"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:11.497634" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:11.497320" elapsed="0.000871"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:11.498688" 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-10-16T01:16:11.498351" elapsed="0.000418"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:16:11.498827" elapsed="0.000028"/>
</return>
<msg time="2026-10-16T01:16:11.498970" 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-manganese/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-10-16T01:16:11.496189" elapsed="0.002805"/>
</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-10-16T01:16:11.500094" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:11.499901" elapsed="0.000252">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:11.500237" 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-10-16T01:16:11.499549" elapsed="0.000711"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:16:11.500423" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:16:11.500323" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:11.500306" elapsed="0.000194"/>
</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-10-16T01:16:11.500650" 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-10-16T01:16:11.500842" elapsed="0.000026"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:11.500924" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:16:11.501051" 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-manganese/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-10-16T01:16:11.499248" elapsed="0.001826"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:11.502505" 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-10-16T01:16:11.502276" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:11.502985" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:11.502748" elapsed="0.000278"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:16:11.507779" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:11.507838" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:11.507954" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:11.503312" elapsed="0.005005">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:11.503087" elapsed="0.005309">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:11.508576" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:11.508427" elapsed="0.000208"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:11.503070" elapsed="0.005587">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:11.509034" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:11.509159" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:11.509126" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:11.509110" elapsed="0.000107"/>
</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-10-16T01:16:11.509352" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:11.509447" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:16:11.501538" elapsed="0.008015">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:11.509622" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:16:11.451652" elapsed="0.058124">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:16:11.510186" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:11.509963" elapsed="0.000305"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:11.509914" elapsed="0.000396"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:11.510395" elapsed="0.000039"/>
</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="FAIL" start="2026-10-16T01:16:11.449429" elapsed="0.061138">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:11.445961" elapsed="0.064707">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:16:11.445912" elapsed="0.064858">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:11.511049" elapsed="0.000027"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:16:11.511404" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:11.511734" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:16:11.512118" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:16:11.512542" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:11.512953" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:11.513304" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:16:11.513545" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:16:11.437497" elapsed="0.076151">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:16:11.513736" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:16:11.435513" elapsed="0.078315">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:11.514075" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:11.513925" elapsed="0.000201"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:11.514286" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:11.514149" elapsed="0.000185"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:11.514500" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:11.514358" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:11.513908" elapsed="0.000692"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:11.435157" elapsed="0.079485">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:11.434726" elapsed="0.080009">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:11.514789" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:16:11.425452" elapsed="0.089449">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:11.515084" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:11.515305" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:11.515163" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:11.515148" elapsed="0.000226"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:11.515500" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:11.515669" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:11.515755" elapsed="0.000015"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:16:11.423678" elapsed="0.092173">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:16:11.423167" elapsed="0.092791">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:16:11.422877" elapsed="0.093133">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:16:11.422097" elapsed="0.093998">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:11.516311" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:16:11.400805" elapsed="0.115614">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:16:12.535610" elapsed="0.000460"/>
</kw>
<msg time="2026-10-16T01:16:12.536189" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:12.534353" elapsed="0.001957"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:16:12.533414" elapsed="0.003054"/>
</kw>
<msg time="2026-10-16T01:16:12.536559" 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-10-16T01:16:12.526805" elapsed="0.009842"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:16:12.525935" elapsed="0.010898"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:12.537922" 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-10-16T01:16:12.537348" elapsed="0.000668"/>
</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-10-16T01:16:12.544737" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:12.543967" elapsed="0.000831"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:12.545810" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:12.545156" elapsed="0.000709"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:12.545986" elapsed="0.000063"/>
</return>
<msg time="2026-10-16T01:16:12.546276" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:12.543135" elapsed="0.003192"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:16:12.546656" elapsed="0.000343"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:12.548093" 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-10-16T01:16:12.547373" elapsed="0.000776"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:12.549052" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:12.548478" elapsed="0.000635"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:12.550001" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:12.549443" elapsed="0.000611"/>
</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-10-16T01:16:12.559143" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:12.557669" elapsed="0.001603"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:12.559401" elapsed="0.000133"/>
</return>
<msg time="2026-10-16T01:16:12.560167" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:12.554379" elapsed="0.005914"/>
</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-10-16T01:16:12.583995" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:12.583505" elapsed="0.000526"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:16:12.585024" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:16:12.584686" elapsed="0.000446">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:12.585249" 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-10-16T01:16:12.584246" elapsed="0.001034"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:12.585989" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:12.585514" elapsed="0.000511"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:16:12.586407" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:16:12.586601" 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-10-16T01:16:12.586249" elapsed="0.000385"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:12.587254" 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-10-16T01:16:12.586944" elapsed="0.000367"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:12.588792" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:12.588259" elapsed="0.000592"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:16:12.589469" 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-10-16T01:16:12.589113" elapsed="0.000389"/>
</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-10-16T01:16:12.589933" elapsed="0.000030"/>
</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-10-16T01:16:12.590188" 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-10-16T01:16:12.590492" elapsed="0.000028"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:16:12.589733" elapsed="0.000833"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:16:12.589562" elapsed="0.001043"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:16:12.590662" elapsed="0.000055"/>
</return>
<msg time="2026-10-16T01:16:12.590888" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:16:12.587764" elapsed="0.003158"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:12.587396" elapsed="0.003568"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:12.591200" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:12.590999" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:12.587372" elapsed="0.003925"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:16:12.592099" 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-10-16T01:16:12.591510" elapsed="0.000625"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:16:12.592196" elapsed="0.000036"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:16:12.582787" elapsed="0.009547"/>
</kw>
<msg time="2026-10-16T01:16:12.592400" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:12.577125" elapsed="0.015338"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:12.597819" elapsed="0.000035"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:12.602991" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:12.606818" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:12.607011" elapsed="0.000019"/>
</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-10-16T01:16:12.607187" elapsed="0.000025"/>
</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-10-16T01:16:12.607535" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:12.607393" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:12.607380" elapsed="0.000227"/>
</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-10-16T01:16:12.607774" elapsed="0.000019"/>
</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-10-16T01:16:12.607966" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:12.608126" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:16:12.607353" elapsed="0.000820"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:16:12.607262" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:12.608387" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:12.608455" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:16:12.608560" 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-10-16T01:16:12.576268" elapsed="0.032316"/>
</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-10-16T01:16:12.609723" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:12.609507" elapsed="0.000282">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:12.609889" 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-10-16T01:16:12.609177" elapsed="0.000737"/>
</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-10-16T01:16:12.610193" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:12.609977" elapsed="0.000267"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:16:12.610695" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:12.610430" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:12.610266" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:12.609961" elapsed="0.000826"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:12.611295" 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-10-16T01:16:12.610958" elapsed="0.000361"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:16:12.611364" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:16:12.611486" 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-manganese/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-10-16T01:16:12.608861" elapsed="0.002647"/>
</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-10-16T01:16:12.612598" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:12.612410" elapsed="0.000246">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:12.612755" 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-10-16T01:16:12.612088" elapsed="0.000691"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:16:12.612959" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:16:12.612843" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:12.612827" elapsed="0.000210"/>
</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-10-16T01:16:12.613184" elapsed="0.000019"/>
</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-10-16T01:16:12.613353" elapsed="0.000024"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:12.613418" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:12.613541" 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-manganese/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-10-16T01:16:12.611778" elapsed="0.001786"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:12.614993" 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-10-16T01:16:12.614750" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:12.615435" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:12.615218" elapsed="0.000257"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:16:12.620141" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:12.620230" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:12.620330" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:12.615773" elapsed="0.004917">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:12.615535" elapsed="0.005257">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:12.620988" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:12.620823" elapsed="0.000224"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:12.615518" elapsed="0.005552">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:12.621407" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:12.621529" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:12.621495" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:12.621478" elapsed="0.000110"/>
</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-10-16T01:16:12.621744" elapsed="0.000025"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:12.621813" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:16:12.614040" elapsed="0.007888">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:12.621996" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:16:12.566463" elapsed="0.055666">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:16:12.622514" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:12.622295" elapsed="0.000300"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:12.622249" elapsed="0.000386"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:12.622742" elapsed="0.000039"/>
</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="FAIL" start="2026-10-16T01:16:12.564251" elapsed="0.058674">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:12.560921" elapsed="0.062104">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:16:12.560849" elapsed="0.062250">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:12.623346" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:16:12.623693" elapsed="0.000037"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:12.624036" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:16:12.624386" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:16:12.624882" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:12.625200" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:12.625546" elapsed="0.000019"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:16:12.625813" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:16:12.552947" elapsed="0.072988">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:16:12.625999" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:16:12.550901" elapsed="0.075189">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:12.626310" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:12.626170" elapsed="0.000190"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:12.626517" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:12.626382" elapsed="0.000184"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:12.626764" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:12.626588" elapsed="0.000225"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:12.626154" elapsed="0.000681"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:12.550517" elapsed="0.076374">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:12.550148" elapsed="0.076798">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:12.626995" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:16:12.541611" elapsed="0.085476">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:12.627261" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:12.627477" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:12.627337" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:12.627323" elapsed="0.000222"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:12.627670" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:12.627946" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:12.628007" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:16:12.540009" elapsed="0.088091">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:16:12.539507" elapsed="0.088656">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:16:12.539261" elapsed="0.088950">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:16:12.538458" elapsed="0.089836">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:12.628539" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:16:12.517307" elapsed="0.111337">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:16:13.647784" elapsed="0.000425"/>
</kw>
<msg time="2026-10-16T01:16:13.648325" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:13.646499" elapsed="0.001944"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:16:13.645572" elapsed="0.003026"/>
</kw>
<msg time="2026-10-16T01:16:13.648687" 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-10-16T01:16:13.638992" elapsed="0.009819"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:16:13.638118" elapsed="0.010868"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:13.650063" 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-10-16T01:16:13.649460" elapsed="0.000696"/>
</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-10-16T01:16:13.656786" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:13.656010" elapsed="0.000836"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:13.657854" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:13.657209" elapsed="0.000725"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:13.658029" elapsed="0.000063"/>
</return>
<msg time="2026-10-16T01:16:13.658322" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:13.655167" elapsed="0.003207"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:16:13.658740" elapsed="0.000310"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:13.660134" 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-10-16T01:16:13.659415" elapsed="0.000775"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:13.661073" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:13.660511" elapsed="0.000615"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:13.662088" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:13.661435" elapsed="0.000708"/>
</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-10-16T01:16:13.670854" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:13.669425" elapsed="0.001560"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:13.671197" elapsed="0.000144"/>
</return>
<msg time="2026-10-16T01:16:13.672196" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:13.666187" elapsed="0.006149"/>
</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-10-16T01:16:13.701832" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:13.701374" elapsed="0.000516"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:16:13.702997" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:16:13.702653" elapsed="0.000447">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:13.703220" 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-10-16T01:16:13.702206" elapsed="0.001046"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:13.703969" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:13.703488" elapsed="0.000517"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:16:13.704401" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:16:13.704601" 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-10-16T01:16:13.704232" elapsed="0.000402"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:13.705264" 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-10-16T01:16:13.704949" elapsed="0.000373"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:13.708786" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:13.708437" elapsed="0.000408"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:16:13.709459" 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-10-16T01:16:13.709101" elapsed="0.000393"/>
</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-10-16T01:16:13.709944" elapsed="0.000029"/>
</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-10-16T01:16:13.710200" 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-10-16T01:16:13.710448" elapsed="0.000027"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:16:13.709746" elapsed="0.000774"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:16:13.709557" elapsed="0.001002"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:16:13.710616" elapsed="0.000042"/>
</return>
<msg time="2026-10-16T01:16:13.710829" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:16:13.707961" elapsed="0.002914"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:13.707550" elapsed="0.003367"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:13.711152" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:13.710951" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:13.705387" elapsed="0.005862"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:16:13.712036" 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-10-16T01:16:13.711461" elapsed="0.000611"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:16:13.712143" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:16:13.700643" elapsed="0.011647"/>
</kw>
<msg time="2026-10-16T01:16:13.712356" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:13.694985" elapsed="0.017436"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:13.717730" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:13.721528" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:13.725382" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:13.725561" elapsed="0.000020"/>
</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-10-16T01:16:13.725752" 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-10-16T01:16:13.726109" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:13.725968" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:13.725954" elapsed="0.000229"/>
</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-10-16T01:16:13.726334" elapsed="0.000018"/>
</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-10-16T01:16:13.726508" elapsed="0.000018"/>
</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-10-16T01:16:13.726666" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:16:13.725927" elapsed="0.000803"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:16:13.725823" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:13.726917" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:13.726986" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:13.727090" 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-10-16T01:16:13.694102" elapsed="0.033011"/>
</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-10-16T01:16:13.728224" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:13.728018" elapsed="0.000269">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:13.728371" 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-10-16T01:16:13.727665" elapsed="0.000728"/>
</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-10-16T01:16:13.728670" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:13.728456" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:16:13.729215" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:13.728949" elapsed="0.000291"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:13.728763" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:13.728439" elapsed="0.000853"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:13.729806" 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-10-16T01:16:13.729450" elapsed="0.000381"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:16:13.729891" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:16:13.730017" 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-manganese/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-10-16T01:16:13.727371" elapsed="0.002669"/>
</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-10-16T01:16:13.731156" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:13.730964" elapsed="0.000251">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:13.731298" 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-10-16T01:16:13.730617" elapsed="0.000704"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:16:13.731650" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:16:13.731546" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:13.731368" elapsed="0.000378"/>
</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-10-16T01:16:13.731910" 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-10-16T01:16:13.732086" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:13.732147" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:13.732271" 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-manganese/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-10-16T01:16:13.730322" elapsed="0.001973"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:13.733512" 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-10-16T01:16:13.733287" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:13.733991" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:13.733755" elapsed="0.000276"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:16:13.738650" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:13.738725" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:13.738831" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:13.734320" elapsed="0.004890">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:13.734092" elapsed="0.005196">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:13.739469" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:13.739319" elapsed="0.000209"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:13.734075" elapsed="0.005475">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:13.739922" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:13.740043" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:13.740009" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:13.739993" elapsed="0.000108"/>
</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-10-16T01:16:13.740235" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:13.740297" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:16:13.732565" elapsed="0.007833">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:13.740498" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:16:13.680389" elapsed="0.060252">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:16:13.741105" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:13.740839" elapsed="0.000351"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:13.740789" elapsed="0.000441"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:13.741315" elapsed="0.000037"/>
</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="FAIL" start="2026-10-16T01:16:13.676663" elapsed="0.064820">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:13.672837" elapsed="0.068745">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:16:13.672793" elapsed="0.068862">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:13.741941" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:16:13.742291" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:13.742599" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:16:13.742996" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:16:13.743428" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:13.743769" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:13.744137" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:16:13.744379" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:16:13.664856" elapsed="0.079625">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:16:13.744543" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:16:13.663014" elapsed="0.081619">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:13.744891" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:13.744734" elapsed="0.000209"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:13.745101" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:13.744965" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:13.745319" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:13.745177" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:13.744698" elapsed="0.000689"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:13.662611" elapsed="0.082814">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:13.662240" elapsed="0.083238">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:13.745526" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:16:13.653768" elapsed="0.091887">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:13.745875" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:13.746096" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:13.745956" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:13.745941" elapsed="0.000224"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:13.746289" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:13.746455" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:13.746513" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:16:13.652147" elapsed="0.094458">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:16:13.651643" elapsed="0.095026">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:16:13.651390" elapsed="0.095374">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:16:13.650599" elapsed="0.096250">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:13.747079" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:16:13.629532" elapsed="0.117651">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:16:14.766395" elapsed="0.000438"/>
</kw>
<msg time="2026-10-16T01:16:14.766971" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:14.765117" elapsed="0.001972"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:16:14.764191" elapsed="0.003060"/>
</kw>
<msg time="2026-10-16T01:16:14.767339" 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-10-16T01:16:14.757621" elapsed="0.009809"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:16:14.756777" elapsed="0.010797"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:14.768691" 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-10-16T01:16:14.768171" elapsed="0.000643"/>
</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-10-16T01:16:14.775474" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:14.774683" elapsed="0.000849"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:14.776526" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:14.775918" elapsed="0.000662"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:14.776839" elapsed="0.000089"/>
</return>
<msg time="2026-10-16T01:16:14.777170" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:14.773904" elapsed="0.003321"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:16:14.777552" elapsed="0.000372"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:14.779024" 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-10-16T01:16:14.778296" elapsed="0.000784"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:14.780002" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:14.779412" elapsed="0.000644"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:14.780936" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:14.780368" elapsed="0.000622"/>
</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-10-16T01:16:14.789876" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:14.788415" elapsed="0.001574"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:14.790116" elapsed="0.000131"/>
</return>
<msg time="2026-10-16T01:16:14.790671" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:14.785132" elapsed="0.005775"/>
</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-10-16T01:16:14.818096" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:14.817622" elapsed="0.000510"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:16:14.819148" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:16:14.818827" elapsed="0.000428">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:14.819373" 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-10-16T01:16:14.818351" elapsed="0.001053"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:14.820120" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:14.819647" elapsed="0.000508"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:16:14.820541" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:16:14.820758" 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-10-16T01:16:14.820382" elapsed="0.000410"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:14.821394" 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-10-16T01:16:14.821085" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:14.822952" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:14.822402" elapsed="0.000610"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:16:14.823618" 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-10-16T01:16:14.823258" elapsed="0.000394"/>
</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-10-16T01:16:14.824087" elapsed="0.000028"/>
</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-10-16T01:16:14.824341" 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-10-16T01:16:14.824593" elapsed="0.000027"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:16:14.823904" elapsed="0.000761"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:16:14.823733" elapsed="0.000991"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:16:14.824786" elapsed="0.000037"/>
</return>
<msg time="2026-10-16T01:16:14.825038" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:16:14.821923" elapsed="0.003148"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:14.821536" elapsed="0.003576"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:14.825352" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:14.825147" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:14.821511" elapsed="0.003940"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:16:14.826259" 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-10-16T01:16:14.825667" elapsed="0.000628"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:16:14.826357" elapsed="0.000036"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:16:14.816926" elapsed="0.009569"/>
</kw>
<msg time="2026-10-16T01:16:14.826561" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:14.811230" elapsed="0.015396"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:14.831187" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:14.834991" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:14.838820" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:14.839010" elapsed="0.000020"/>
</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-10-16T01:16:14.839188" elapsed="0.000019"/>
</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-10-16T01:16:14.839527" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:14.839387" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:14.839373" elapsed="0.000226"/>
</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-10-16T01:16:14.839766" 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-10-16T01:16:14.839963" 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-10-16T01:16:14.840126" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:16:14.839346" elapsed="0.000828"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:16:14.839256" elapsed="0.000942"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:14.840347" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:14.840414" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:16:14.840518" 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-10-16T01:16:14.810356" elapsed="0.030186"/>
</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-10-16T01:16:14.841684" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:14.841493" elapsed="0.000271">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:14.841864" 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-10-16T01:16:14.841173" elapsed="0.000715"/>
</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-10-16T01:16:14.842169" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:14.841953" elapsed="0.000267"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:16:14.842671" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:14.842407" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:14.842243" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:14.841935" elapsed="0.000830"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:14.843278" 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-10-16T01:16:14.842940" elapsed="0.000363"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:16:14.843348" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:16:14.843473" 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-manganese/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-10-16T01:16:14.840874" elapsed="0.002622"/>
</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-10-16T01:16:14.844588" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:14.844391" elapsed="0.000256">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:14.844748" 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-10-16T01:16:14.844074" elapsed="0.000698"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:16:14.844951" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:16:14.844837" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:14.844820" elapsed="0.000207"/>
</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-10-16T01:16:14.845175" 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-10-16T01:16:14.845346" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:14.845404" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:14.845528" 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-manganese/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-10-16T01:16:14.843761" elapsed="0.001790"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:14.846984" 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-10-16T01:16:14.846740" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:14.847431" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:14.847212" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:16:14.863648" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:14.863728" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:14.863871" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:14.847771" elapsed="0.016453">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:14.847532" elapsed="0.016770">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:14.864483" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:14.864333" elapsed="0.000209"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:14.847514" elapsed="0.017050">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:14.864933" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:14.865057" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:14.865022" elapsed="0.000074"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:14.865005" elapsed="0.000112"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:14.865254" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:14.865318" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:16:14.846025" elapsed="0.019397">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:14.865492" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:16:14.799142" elapsed="0.066477">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:16:14.866049" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:14.865813" elapsed="0.000320"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:14.865764" elapsed="0.000413"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:14.866262" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:16:14.795556" elapsed="0.070874">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:14.791357" elapsed="0.075172">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:16:14.791313" elapsed="0.075290">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:14.866883" elapsed="0.000025"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:16:14.867228" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:14.867537" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:16:14.867927" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:16:14.868357" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:14.868669" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:14.869058" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:16:14.869334" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:16:14.783645" elapsed="0.085793">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:16:14.869500" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:16:14.781820" elapsed="0.087770">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:14.869837" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:14.869672" elapsed="0.000233"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:14.870066" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:14.869928" elapsed="0.000187"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:14.870284" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:14.870137" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:14.869656" elapsed="0.000698"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:14.781458" elapsed="0.088934">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:14.781087" elapsed="0.089358">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:14.870494" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:16:14.772501" elapsed="0.098084">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:14.870783" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:14.871020" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:14.870877" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:14.870860" elapsed="0.000235"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:14.871220" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:14.871387" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:14.871444" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:16:14.770935" elapsed="0.100602">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:16:14.770438" elapsed="0.101161">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:16:14.770190" elapsed="0.101463">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:16:14.769282" elapsed="0.102613">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:14.872108" elapsed="0.000028"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:16:14.748077" elapsed="0.124142">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:16:15.890936" elapsed="0.000387"/>
</kw>
<msg time="2026-10-16T01:16:15.891423" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:15.889639" elapsed="0.001888"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:16:15.888725" elapsed="0.002956"/>
</kw>
<msg time="2026-10-16T01:16:15.891944" 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-10-16T01:16:15.882122" elapsed="0.009915"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:16:15.881246" elapsed="0.010944"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:15.893219" 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-10-16T01:16:15.892650" elapsed="0.000662"/>
</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-10-16T01:16:15.899877" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:15.899089" elapsed="0.000848"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:15.900917" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:15.900265" elapsed="0.000707"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:15.901064" elapsed="0.000060"/>
</return>
<msg time="2026-10-16T01:16:15.901346" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:15.898258" elapsed="0.003138"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:16:15.901762" elapsed="0.000317"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:15.903167" 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-10-16T01:16:15.902446" elapsed="0.000776"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:15.904108" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:15.903544" elapsed="0.000617"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:15.905024" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:15.904471" elapsed="0.000606"/>
</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-10-16T01:16:15.913890" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:15.912423" elapsed="0.001578"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:15.914129" elapsed="0.000131"/>
</return>
<msg time="2026-10-16T01:16:15.914681" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:15.909076" elapsed="0.005997"/>
</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-10-16T01:16:15.938869" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:15.938408" elapsed="0.000498"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:16:15.939856" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:16:15.939556" elapsed="0.000388">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:15.940061" 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-10-16T01:16:15.939120" elapsed="0.000972"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:15.940899" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:15.940385" elapsed="0.000552"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:16:15.941329" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:16:15.941507" 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-10-16T01:16:15.941165" elapsed="0.000375"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:15.942164" 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-10-16T01:16:15.941834" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:15.943684" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:15.943173" elapsed="0.000594"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:16:15.944343" 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-10-16T01:16:15.944038" 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-10-16T01:16:15.944650" 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-10-16T01:16:15.944865" 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-10-16T01:16:15.945049" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:16:15.944522" elapsed="0.000579"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:16:15.944412" elapsed="0.000717"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:16:15.945169" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:16:15.945299" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:16:15.942660" elapsed="0.002662"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:15.942313" elapsed="0.003038"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:15.945520" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:15.945375" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:15.942289" elapsed="0.003301"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:16:15.946164" 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-10-16T01:16:15.945763" elapsed="0.000427"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:16:15.946239" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:16:15.937679" elapsed="0.008659"/>
</kw>
<msg time="2026-10-16T01:16:15.946385" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:15.932061" elapsed="0.014370"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:15.950250" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:15.954094" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:15.957894" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:15.958104" 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-10-16T01:16:15.958284" elapsed="0.000033"/>
</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-10-16T01:16:15.958640" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:15.958498" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:15.958484" elapsed="0.000244"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:15.958899" 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-10-16T01:16:15.959077" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:15.959237" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:16:15.958458" elapsed="0.000827"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:16:15.958365" elapsed="0.000943"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:15.959457" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:15.959524" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:15.959633" 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-10-16T01:16:15.931155" elapsed="0.028502"/>
</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-10-16T01:16:15.960774" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:15.960563" elapsed="0.000271">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:15.960934" 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-10-16T01:16:15.960245" elapsed="0.000711"/>
</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-10-16T01:16:15.961235" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:15.961019" elapsed="0.000268"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:16:15.961746" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:15.961468" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:15.961309" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:15.961003" elapsed="0.000820"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:15.962354" 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-10-16T01:16:15.962009" elapsed="0.000372"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:16:15.962426" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:16:15.962548" 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-manganese/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-10-16T01:16:15.959948" elapsed="0.002623"/>
</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-10-16T01:16:15.963668" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:15.963478" elapsed="0.000265">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:15.963827" 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-10-16T01:16:15.963153" elapsed="0.000714"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:16:15.964068" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:16:15.963968" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:15.963950" elapsed="0.000195"/>
</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-10-16T01:16:15.964295" 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-10-16T01:16:15.964467" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:15.964527" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:15.964651" 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-manganese/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-10-16T01:16:15.962853" elapsed="0.001821"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:15.966093" 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-10-16T01:16:15.965865" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:15.966546" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:15.966328" elapsed="0.000258"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:16:15.970760" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:15.970816" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:15.970925" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:15.966898" elapsed="0.004355">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:15.966646" elapsed="0.004682">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:15.971508" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:15.971359" elapsed="0.000207"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:15.966629" elapsed="0.004958">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:15.971945" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:15.972066" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:15.972033" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:15.972017" elapsed="0.000105"/>
</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-10-16T01:16:15.972262" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:15.972325" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:16:15.965140" elapsed="0.007285">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:15.972492" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:16:15.921488" elapsed="0.051127">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:16:15.973038" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:15.972807" elapsed="0.000344"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:15.972759" elapsed="0.000434"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:15.973279" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:16:15.919364" elapsed="0.054077">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:15.915549" elapsed="0.057994">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:16:15.915505" elapsed="0.058110">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:15.973891" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:16:15.974233" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:15.974540" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:16:15.974930" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:16:15.975350" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:15.975661" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:15.976039" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:16:15.976278" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:16:15.907743" elapsed="0.068636">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:16:15.976440" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:16:15.905932" elapsed="0.070596">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:15.976774" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:15.976608" elapsed="0.000217"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:15.976996" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:15.976859" elapsed="0.000186"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:15.977210" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:15.977067" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:15.976592" elapsed="0.000686"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:15.905547" elapsed="0.071769">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:15.905172" elapsed="0.072196">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:15.977415" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:16:15.896896" elapsed="0.080608">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:15.977676" elapsed="0.000138"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:15.978038" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:15.977894" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:15.977877" elapsed="0.000230"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:15.978231" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:15.978398" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:15.978456" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:16:15.895272" elapsed="0.083277">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:16:15.894816" elapsed="0.083794">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:16:15.894548" elapsed="0.084111">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:16:15.893784" elapsed="0.085035">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:15.979046" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:16:15.872918" elapsed="0.106232">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:16:17.000031" elapsed="0.000394"/>
</kw>
<msg time="2026-10-16T01:16:17.000530" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:16.998622" elapsed="0.002016"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:16:16.997688" elapsed="0.003156"/>
</kw>
<msg time="2026-10-16T01:16:17.000939" 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-10-16T01:16:16.989041" elapsed="0.011990"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:16:16.988168" elapsed="0.013009"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:17.002219" 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-10-16T01:16:17.001653" elapsed="0.000657"/>
</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-10-16T01:16:17.008764" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:17.008009" elapsed="0.000814"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:17.009809" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:17.009176" elapsed="0.000709"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:17.009978" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:16:17.010262" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:17.007194" elapsed="0.003118"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:16:17.010636" elapsed="0.000342"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:17.012186" 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-10-16T01:16:17.011357" elapsed="0.000887"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:17.013147" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:17.012576" elapsed="0.000625"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:17.014077" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:17.013519" elapsed="0.000612"/>
</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-10-16T01:16:17.022874" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:17.021365" elapsed="0.001620"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:17.023111" elapsed="0.000133"/>
</return>
<msg time="2026-10-16T01:16:17.023664" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:17.018107" elapsed="0.005913"/>
</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-10-16T01:16:17.047305" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:17.046872" elapsed="0.000468"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:16:17.048320" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:16:17.048036" elapsed="0.000377">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:17.048530" 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-10-16T01:16:17.047553" elapsed="0.001008"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:17.049276" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:17.048815" elapsed="0.000497"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:16:17.049687" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:16:17.049934" 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-10-16T01:16:17.049535" elapsed="0.000432"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:17.050542" 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-10-16T01:16:17.050237" elapsed="0.000362"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:17.053159" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:17.052924" elapsed="0.000277"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:16:17.053627" 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-10-16T01:16:17.053374" elapsed="0.000277"/>
</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-10-16T01:16:17.053963" 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-10-16T01:16:17.054145" elapsed="0.000022"/>
</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-10-16T01:16:17.054323" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:16:17.053819" elapsed="0.000556"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:16:17.053693" elapsed="0.000710"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:16:17.054443" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:16:17.054571" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:16:17.052547" elapsed="0.002047"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:17.052290" elapsed="0.002333"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:17.054807" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:17.054647" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:17.050658" elapsed="0.004234"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:16:17.055431" 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-10-16T01:16:17.055045" elapsed="0.000445"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:16:17.055535" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:16:17.046143" elapsed="0.009493"/>
</kw>
<msg time="2026-10-16T01:16:17.055683" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:17.040372" elapsed="0.015373"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:17.059534" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:17.063429" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:17.067273" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:17.067452" elapsed="0.000019"/>
</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-10-16T01:16:17.067630" 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-10-16T01:16:17.068007" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:17.067863" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:17.067848" 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-10-16T01:16:17.068232" elapsed="0.000019"/>
</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-10-16T01:16:17.068408" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:17.068567" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:16:17.067806" elapsed="0.000809"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:16:17.067714" elapsed="0.000924"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:17.068803" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:17.068890" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:16:17.068994" 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-10-16T01:16:17.039505" elapsed="0.029513"/>
</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-10-16T01:16:17.070155" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:17.069961" elapsed="0.000255">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:17.070299" 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-10-16T01:16:17.069603" elapsed="0.000719"/>
</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-10-16T01:16:17.070599" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:17.070385" elapsed="0.000267"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:16:17.071141" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:17.070876" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:17.070675" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:17.070369" elapsed="0.000849"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:17.071743" 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-10-16T01:16:17.071380" elapsed="0.000389"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:16:17.071814" elapsed="0.000065"/>
</return>
<msg time="2026-10-16T01:16:17.071981" 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-manganese/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-10-16T01:16:17.069273" elapsed="0.002731"/>
</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-10-16T01:16:17.073084" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:17.072894" elapsed="0.000250">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:17.073228" 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-10-16T01:16:17.072540" elapsed="0.000710"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:16:17.073580" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:16:17.073477" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:17.073297" elapsed="0.000361"/>
</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-10-16T01:16:17.073824" elapsed="0.000034"/>
</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-10-16T01:16:17.074013" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:17.074074" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:17.074201" 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-manganese/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-10-16T01:16:17.072245" elapsed="0.001979"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:17.075448" 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-10-16T01:16:17.075224" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:17.075979" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:17.075674" elapsed="0.000346"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:16:17.080392" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:17.080445" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:17.080547" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:17.076305" elapsed="0.004619">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:17.076079" elapsed="0.004954">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:17.081218" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:17.081065" elapsed="0.000212"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:17.076063" elapsed="0.005236">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:17.081631" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:17.081769" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:17.081736" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:17.081718" 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-10-16T01:16:17.081980" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:17.082043" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:16:17.074496" elapsed="0.007648">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:17.082212" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:16:17.029676" elapsed="0.052667">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:16:17.082752" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:17.082507" elapsed="0.000340"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:17.082461" elapsed="0.000429"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:17.082973" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:16:17.027495" elapsed="0.055642">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:17.024475" elapsed="0.058761">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:16:17.024434" elapsed="0.058878">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:17.083557" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:16:17.083967" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:17.084279" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:16:17.084622" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:16:17.085079" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:17.085390" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:17.085779" elapsed="0.000024"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:16:17.086031" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:16:17.016777" elapsed="0.069355">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:16:17.086245" elapsed="0.000019"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:16:17.014981" elapsed="0.071361">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:17.086565" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:17.086423" elapsed="0.000192"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:17.086875" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:17.086637" elapsed="0.000291"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:17.087094" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:17.086950" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:17.086407" elapsed="0.000755"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:17.014596" elapsed="0.072604">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:17.014224" elapsed="0.073028">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:17.087301" elapsed="0.000013"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:16:17.005852" elapsed="0.081538">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:17.087564" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:17.087865" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:17.087642" elapsed="0.000273"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:17.087627" elapsed="0.000310"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:17.088065" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:17.088233" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:17.088291" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:16:17.004247" elapsed="0.084136">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:16:17.003793" elapsed="0.084652">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:16:17.003525" elapsed="0.084968">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:16:17.002778" elapsed="0.085795">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:17.088811" elapsed="0.000037"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:16:16.979802" elapsed="0.109130">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:16:18.107661" elapsed="0.000440"/>
</kw>
<msg time="2026-10-16T01:16:18.108202" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:18.106427" elapsed="0.001956"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:16:18.105439" elapsed="0.003106"/>
</kw>
<msg time="2026-10-16T01:16:18.108636" 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-10-16T01:16:18.098788" elapsed="0.009970"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:16:18.097948" elapsed="0.010987"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:18.109961" 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-10-16T01:16:18.109394" elapsed="0.000660"/>
</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-10-16T01:16:18.116531" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:18.115768" elapsed="0.000821"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:18.117588" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:18.116980" elapsed="0.000662"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:18.117768" elapsed="0.000080"/>
</return>
<msg time="2026-10-16T01:16:18.118105" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:18.114941" elapsed="0.003218"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:16:18.118494" elapsed="0.000318"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:18.119950" 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-10-16T01:16:18.119204" elapsed="0.000804"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:18.120896" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:18.120333" elapsed="0.000618"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:18.121795" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:18.121263" elapsed="0.000606"/>
</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-10-16T01:16:18.130509" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:18.129107" elapsed="0.001512"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:18.130794" elapsed="0.000159"/>
</return>
<msg time="2026-10-16T01:16:18.131387" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:18.125869" elapsed="0.005643"/>
</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-10-16T01:16:18.155781" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:18.155331" elapsed="0.000500"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:16:18.156767" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:16:18.156487" elapsed="0.000382">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:18.156991" 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-10-16T01:16:18.156047" elapsed="0.000975"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:18.157695" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:18.157263" elapsed="0.000488"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:16:18.158148" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:16:18.158362" 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-10-16T01:16:18.157993" elapsed="0.000403"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:18.159028" 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-10-16T01:16:18.158670" elapsed="0.000416"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:18.160561" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:18.160031" elapsed="0.000589"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:16:18.161261" 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-10-16T01:16:18.160902" elapsed="0.000393"/>
</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-10-16T01:16:18.161584" elapsed="0.000020"/>
</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-10-16T01:16:18.161787" 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-10-16T01:16:18.161993" elapsed="0.000026"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:16:18.161447" elapsed="0.000605"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:16:18.161339" elapsed="0.000739"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:16:18.162118" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:16:18.162249" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:16:18.159515" elapsed="0.002759"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:18.159172" elapsed="0.003134"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:18.162472" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:18.162328" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:18.159148" elapsed="0.003399"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:16:18.163115" 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-10-16T01:16:18.162716" elapsed="0.000424"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:16:18.163184" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:16:18.154600" elapsed="0.008682"/>
</kw>
<msg time="2026-10-16T01:16:18.163329" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:18.148855" elapsed="0.014520"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:18.167228" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:18.171053" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:18.174846" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:18.175061" elapsed="0.000020"/>
</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-10-16T01:16:18.175241" elapsed="0.000019"/>
</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-10-16T01:16:18.175582" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:18.175441" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:18.175427" elapsed="0.000229"/>
</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-10-16T01:16:18.175845" 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-10-16T01:16:18.176025" elapsed="0.000018"/>
</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-10-16T01:16:18.176184" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:16:18.175400" elapsed="0.000833"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:16:18.175308" elapsed="0.000948"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:18.176404" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:18.176470" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:16:18.176574" 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-10-16T01:16:18.148001" elapsed="0.028597"/>
</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-10-16T01:16:18.177692" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:18.177501" elapsed="0.000267">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:18.177868" 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-10-16T01:16:18.177180" elapsed="0.000711"/>
</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-10-16T01:16:18.178167" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:18.177954" elapsed="0.000265"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:16:18.178660" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:18.178397" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:18.178241" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:18.177937" elapsed="0.000816"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:18.179258" 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-10-16T01:16:18.178923" elapsed="0.000360"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:16:18.179328" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:16:18.179449" 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-manganese/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-10-16T01:16:18.176883" elapsed="0.002588"/>
</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-10-16T01:16:18.180559" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:18.180364" elapsed="0.000253">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:18.180716" 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-10-16T01:16:18.180040" elapsed="0.000700"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:16:18.180920" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:16:18.180806" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:18.180788" elapsed="0.000208"/>
</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-10-16T01:16:18.181145" elapsed="0.000020"/>
</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-10-16T01:16:18.181353" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:18.181414" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:16:18.181540" 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-manganese/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-10-16T01:16:18.179727" elapsed="0.001837"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:18.182994" 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-10-16T01:16:18.182746" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:18.183446" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:18.183224" elapsed="0.000262"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:16:18.188317" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:18.188377" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:18.188472" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:18.183788" elapsed="0.005023">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:18.183548" elapsed="0.005357">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:18.189085" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:18.188936" elapsed="0.000208"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:18.183530" elapsed="0.005636">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:18.189507" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:18.189626" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:18.189593" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:18.189578" elapsed="0.000105"/>
</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-10-16T01:16:18.189852" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:18.189916" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:16:18.182036" elapsed="0.007981">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:18.190083" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:16:18.138281" elapsed="0.051925">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:16:18.190591" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:18.190376" elapsed="0.000296"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:18.190329" elapsed="0.000406"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:18.190836" elapsed="0.000037"/>
</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="FAIL" start="2026-10-16T01:16:18.136082" elapsed="0.054953">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:18.132224" elapsed="0.058910">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:16:18.132180" elapsed="0.059026">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:18.191454" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:16:18.191811" elapsed="0.000033"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:18.192133" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:16:18.192476" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:16:18.192937" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:18.193247" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:18.193589" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:16:18.193867" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:16:18.124496" elapsed="0.069473">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:16:18.194032" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:16:18.122666" elapsed="0.071454">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:18.194339" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:18.194199" elapsed="0.000196"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:18.194554" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:18.194417" elapsed="0.000187"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:18.194796" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:18.194625" elapsed="0.000233"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:18.194183" elapsed="0.000697"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:18.122341" elapsed="0.072578">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:18.121964" elapsed="0.073008">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:18.195020" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:16:18.113543" elapsed="0.081567">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:18.195284" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:18.195503" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:18.195363" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:18.195347" elapsed="0.000225"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:18.195873" elapsed="0.000026"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:18.196054" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:18.196113" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:16:18.111990" elapsed="0.084216">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:16:18.111505" elapsed="0.084765">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:16:18.111274" elapsed="0.085048">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:16:18.110489" elapsed="0.085915">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:18.196612" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:16:18.089541" elapsed="0.107191">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:16:19.216901" elapsed="0.000396"/>
</kw>
<msg time="2026-10-16T01:16:19.217417" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:19.215551" elapsed="0.001989"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:16:19.214550" elapsed="0.003195"/>
</kw>
<msg time="2026-10-16T01:16:19.217856" 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-10-16T01:16:19.207490" elapsed="0.010459"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:16:19.206559" elapsed="0.011535"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:19.219150" 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-10-16T01:16:19.218568" elapsed="0.000675"/>
</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-10-16T01:16:19.225776" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:19.225022" elapsed="0.000835"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:19.226840" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:19.226190" elapsed="0.000705"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:19.226986" elapsed="0.000059"/>
</return>
<msg time="2026-10-16T01:16:19.227268" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:19.224142" elapsed="0.003175"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:16:19.227638" elapsed="0.000351"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:19.229096" 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-10-16T01:16:19.228352" elapsed="0.000799"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:19.230043" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:19.229474" elapsed="0.000622"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:19.231069" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:19.230401" elapsed="0.000722"/>
</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-10-16T01:16:19.240040" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:19.238347" elapsed="0.001802"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:19.240277" elapsed="0.000131"/>
</return>
<msg time="2026-10-16T01:16:19.241067" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:19.235142" elapsed="0.006055"/>
</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-10-16T01:16:19.264540" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:19.264116" elapsed="0.000460"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:16:19.265560" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:16:19.265286" elapsed="0.000365">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:19.265794" 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-10-16T01:16:19.264839" elapsed="0.001009"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:19.266522" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:19.266089" elapsed="0.000468"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:16:19.266987" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:16:19.267166" 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-10-16T01:16:19.266825" elapsed="0.000375"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:19.267802" 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-10-16T01:16:19.267469" elapsed="0.000415"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:19.269048" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:19.268651" elapsed="0.000440"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:16:19.269517" 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-10-16T01:16:19.269262" elapsed="0.000280"/>
</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-10-16T01:16:19.269858" 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-10-16T01:16:19.270042" elapsed="0.000022"/>
</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-10-16T01:16:19.270221" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:16:19.269692" elapsed="0.000580"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:16:19.269584" elapsed="0.000716"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:16:19.270339" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:16:19.270469" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:16:19.268317" elapsed="0.002174"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:19.267971" elapsed="0.002549"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:19.270684" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:19.270543" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:19.267946" elapsed="0.002835"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:16:19.271337" 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-10-16T01:16:19.270950" elapsed="0.000413"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:16:19.271406" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:16:19.263380" elapsed="0.008125"/>
</kw>
<msg time="2026-10-16T01:16:19.271585" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:19.257644" elapsed="0.013994"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:19.275478" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:19.279229" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:19.282990" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:19.283165" elapsed="0.000020"/>
</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-10-16T01:16:19.283340" elapsed="0.000019"/>
</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-10-16T01:16:19.283673" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:19.283535" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:19.283522" 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-10-16T01:16:19.283937" 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-10-16T01:16:19.284114" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:19.284272" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:16:19.283495" elapsed="0.000824"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:16:19.283408" elapsed="0.000935"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:19.284490" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:19.284557" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:19.284660" 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-10-16T01:16:19.256805" elapsed="0.027878"/>
</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-10-16T01:16:19.285791" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:19.285586" elapsed="0.000283">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:19.285987" 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-10-16T01:16:19.285269" elapsed="0.000741"/>
</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-10-16T01:16:19.286289" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:19.286075" elapsed="0.000265"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:16:19.286819" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:19.286519" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:19.286363" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:19.286058" elapsed="0.000839"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:19.287388" 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-10-16T01:16:19.287053" elapsed="0.000359"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:16:19.287457" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:16:19.287578" 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-manganese/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-10-16T01:16:19.284974" elapsed="0.002627"/>
</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-10-16T01:16:19.288666" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:19.288480" elapsed="0.000260">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:19.288839" 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-10-16T01:16:19.288167" elapsed="0.000695"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:16:19.289025" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:16:19.288926" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:19.288909" elapsed="0.000194"/>
</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-10-16T01:16:19.289250" elapsed="0.000020"/>
</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-10-16T01:16:19.289419" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:19.289478" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:19.289601" 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-manganese/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-10-16T01:16:19.287873" elapsed="0.001751"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:19.291037" 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-10-16T01:16:19.290796" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:19.291483" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:19.291265" elapsed="0.000259"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:16:19.295847" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:19.295898" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:19.295993" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:19.291835" elapsed="0.004496">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:19.291583" elapsed="0.004824">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:19.296586" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:19.296438" elapsed="0.000236"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:19.291567" elapsed="0.005148">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:19.297067" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:19.297186" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:19.297153" elapsed="0.000074"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:19.297137" elapsed="0.000110"/>
</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-10-16T01:16:19.297382" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:19.297444" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:16:19.290088" elapsed="0.007458">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:19.297614" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:16:19.246885" elapsed="0.050879">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:16:19.298159" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:19.297943" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:19.297896" elapsed="0.000384"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:19.298362" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:16:19.244655" elapsed="0.053870">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:19.241645" elapsed="0.056976">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:16:19.241603" elapsed="0.057091">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:19.298975" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:16:19.299313" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:19.299619" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:16:19.300004" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:16:19.300425" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:19.300751" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:19.301109" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:16:19.301344" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:16:19.233844" elapsed="0.067602">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:16:19.301507" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:16:19.232000" elapsed="0.069595">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:19.301889" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:19.301732" elapsed="0.000209"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:19.302099" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:19.301964" elapsed="0.000185"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:19.302310" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:19.302170" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:19.301691" elapsed="0.000688"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:19.231609" elapsed="0.070809">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:19.231219" elapsed="0.071251">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:19.302518" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:16:19.222779" elapsed="0.079831">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:19.302877" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:19.303102" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:19.302958" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:19.302943" elapsed="0.000228"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:19.303293" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:19.303458" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:19.303515" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:16:19.221181" elapsed="0.082426">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:16:19.220695" elapsed="0.082973">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:16:19.220463" elapsed="0.083340">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:16:19.219680" elapsed="0.084221">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:19.304108" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:16:19.197368" elapsed="0.106844">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:16:20.322631" elapsed="0.000432"/>
</kw>
<msg time="2026-10-16T01:16:20.323165" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:20.321410" elapsed="0.001857"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:16:20.320484" elapsed="0.002933"/>
</kw>
<msg time="2026-10-16T01:16:20.323582" 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-10-16T01:16:20.313930" elapsed="0.009747"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:16:20.313066" elapsed="0.010816"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:20.324905" 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-10-16T01:16:20.324340" elapsed="0.000658"/>
</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-10-16T01:16:20.331448" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:20.330660" elapsed="0.000846"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:20.332487" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:20.331884" elapsed="0.000656"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:20.332633" elapsed="0.000060"/>
</return>
<msg time="2026-10-16T01:16:20.332975" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:20.329875" elapsed="0.003151"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:16:20.333360" elapsed="0.000282"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:20.334757" 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-10-16T01:16:20.334056" elapsed="0.000780"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:20.335659" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:20.335163" elapsed="0.000585"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:20.336572" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:20.336076" elapsed="0.000547"/>
</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-10-16T01:16:20.345273" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:20.343866" elapsed="0.001515"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:20.345510" elapsed="0.000132"/>
</return>
<msg time="2026-10-16T01:16:20.346150" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:20.340565" elapsed="0.005709"/>
</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-10-16T01:16:20.370249" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:20.369820" elapsed="0.000465"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:16:20.371237" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:16:20.370980" elapsed="0.000342">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:20.371437" 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-10-16T01:16:20.370498" elapsed="0.000970"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:20.372178" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:20.371719" elapsed="0.000494"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:16:20.372586" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:16:20.372771" 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-10-16T01:16:20.372435" elapsed="0.000388"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:20.373475" 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-10-16T01:16:20.373116" elapsed="0.000417"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:20.376495" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:20.376216" elapsed="0.000320"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:16:20.376993" 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-10-16T01:16:20.376722" 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-10-16T01:16:20.377294" 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-10-16T01:16:20.377474" elapsed="0.000021"/>
</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-10-16T01:16:20.377650" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:16:20.377168" elapsed="0.000548"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:16:20.377060" elapsed="0.000684"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:16:20.377784" elapsed="0.000041"/>
</return>
<msg time="2026-10-16T01:16:20.377931" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:16:20.375720" elapsed="0.002234"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:20.375341" elapsed="0.002641"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:20.378157" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:20.378006" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:20.373594" elapsed="0.004634"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:16:20.378769" 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-10-16T01:16:20.378378" elapsed="0.000417"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:16:20.378853" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:16:20.369077" elapsed="0.009876"/>
</kw>
<msg time="2026-10-16T01:16:20.378998" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:20.363349" elapsed="0.015696"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:20.382873" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:20.386665" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:20.390490" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:20.390667" elapsed="0.000020"/>
</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-10-16T01:16:20.390876" 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-10-16T01:16:20.391248" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:20.391075" elapsed="0.000225"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:20.391062" 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-10-16T01:16:20.391473" elapsed="0.000019"/>
</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-10-16T01:16:20.391649" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:20.391899" elapsed="0.000023"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:16:20.391035" elapsed="0.000921"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:16:20.390944" elapsed="0.001035"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:20.392126" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:20.392193" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:20.392296" 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-10-16T01:16:20.362486" elapsed="0.029834"/>
</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-10-16T01:16:20.393453" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:20.393258" elapsed="0.000255">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:20.393596" 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-10-16T01:16:20.392940" elapsed="0.000679"/>
</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-10-16T01:16:20.393936" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:20.393682" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:16:20.394430" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:20.394169" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:20.394012" elapsed="0.000474"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:20.393665" elapsed="0.000841"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:20.395030" 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-10-16T01:16:20.394662" elapsed="0.000392"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:16:20.395100" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:16:20.395223" 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-manganese/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-10-16T01:16:20.392579" elapsed="0.002667"/>
</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-10-16T01:16:20.396312" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:20.396124" elapsed="0.000247">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:20.396453" 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-10-16T01:16:20.395808" elapsed="0.000668"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:16:20.396841" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:16:20.396722" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:20.396523" elapsed="0.000397"/>
</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-10-16T01:16:20.397070" elapsed="0.000020"/>
</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-10-16T01:16:20.397240" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:20.397301" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:20.397425" 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-manganese/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-10-16T01:16:20.395487" elapsed="0.001991"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:20.398714" 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-10-16T01:16:20.398476" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:20.399177" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:20.398960" elapsed="0.000257"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:16:20.403369" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:20.403421" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:20.403524" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:20.399498" elapsed="0.004391">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:20.399277" elapsed="0.004689">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:20.404144" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:20.403996" elapsed="0.000208"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:20.399260" elapsed="0.004965">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:20.404557" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:20.404677" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:20.404644" elapsed="0.000090"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:20.404628" elapsed="0.000127"/>
</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-10-16T01:16:20.404904" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:20.404967" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:16:20.397769" elapsed="0.007299">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:20.405135" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:16:20.352840" elapsed="0.052418">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:16:20.405645" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:20.405428" elapsed="0.000326"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:20.405381" elapsed="0.000427"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:20.405896" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:16:20.350635" elapsed="0.055426">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:20.346979" elapsed="0.059212">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:16:20.346685" elapsed="0.059580">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:20.406511" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:16:20.406880" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:20.407190" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:16:20.407537" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:16:20.408002" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:20.408314" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:20.408656" elapsed="0.000024"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:16:20.408928" elapsed="0.000019"/>
</return>
<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="FAIL" start="2026-10-16T01:16:20.339264" elapsed="0.069768">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:16:20.409094" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:16:20.337469" elapsed="0.071715">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:20.409403" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:20.409264" elapsed="0.000190"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:20.409612" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:20.409476" elapsed="0.000186"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:20.409864" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:20.409683" elapsed="0.000230"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:20.409248" elapsed="0.000686"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:20.337143" elapsed="0.072829">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:20.336747" elapsed="0.073277">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:20.410073" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:16:20.328484" elapsed="0.081681">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:20.410338" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:20.410555" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:20.410416" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:20.410401" elapsed="0.000223"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:20.410778" elapsed="0.000032"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:20.410961" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:20.411019" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:16:20.326938" elapsed="0.084208">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:16:20.326453" elapsed="0.084755">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:16:20.326220" elapsed="0.085036">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:16:20.325433" elapsed="0.085904">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:20.411544" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:16:20.304869" elapsed="0.106780">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:16:21.430505" elapsed="0.000444"/>
</kw>
<msg time="2026-10-16T01:16:21.431054" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:21.429265" elapsed="0.001894"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:16:21.428326" elapsed="0.002988"/>
</kw>
<msg time="2026-10-16T01:16:21.431403" 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-10-16T01:16:21.421547" elapsed="0.009946"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:16:21.420684" elapsed="0.010958"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:21.432770" 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-10-16T01:16:21.432171" elapsed="0.000716"/>
</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-10-16T01:16:21.439455" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:21.438662" elapsed="0.000851"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:21.440542" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:21.439930" elapsed="0.000666"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:21.440689" elapsed="0.000094"/>
</return>
<msg time="2026-10-16T01:16:21.441031" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:21.437883" elapsed="0.003199"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:16:21.441412" elapsed="0.000324"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:21.442854" 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-10-16T01:16:21.442130" elapsed="0.000781"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:21.443775" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:21.443239" elapsed="0.000658"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:21.444738" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:21.444210" elapsed="0.000604"/>
</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-10-16T01:16:21.453598" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:21.452200" elapsed="0.001655"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:21.453996" elapsed="0.000136"/>
</return>
<msg time="2026-10-16T01:16:21.454568" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:21.448905" elapsed="0.005790"/>
</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-10-16T01:16:21.478315" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:21.477888" elapsed="0.000463"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:16:21.479320" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:16:21.479054" elapsed="0.000352">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:21.479523" 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-10-16T01:16:21.478566" elapsed="0.000989"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:21.480268" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:21.479836" elapsed="0.000468"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:16:21.480688" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:16:21.480906" 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-10-16T01:16:21.480534" elapsed="0.000406"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:21.481522" 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-10-16T01:16:21.481210" elapsed="0.000369"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:21.483061" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:21.482509" elapsed="0.000611"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:16:21.483809" 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-10-16T01:16:21.483390" elapsed="0.000445"/>
</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-10-16T01:16:21.484115" elapsed="0.000020"/>
</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-10-16T01:16:21.484295" elapsed="0.000028"/>
</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-10-16T01:16:21.484483" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:16:21.483987" elapsed="0.000547"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:16:21.483878" elapsed="0.000683"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:16:21.484602" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:16:21.484747" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:16:21.482047" elapsed="0.002724"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:21.481666" elapsed="0.003150"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:21.484984" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:21.484839" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:21.481642" elapsed="0.003412"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:16:21.485583" 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-10-16T01:16:21.485206" elapsed="0.000403"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:16:21.485652" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:16:21.477148" elapsed="0.008621"/>
</kw>
<msg time="2026-10-16T01:16:21.485901" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:21.471473" elapsed="0.014478"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:21.489752" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:21.493537" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:21.497335" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:21.497513" elapsed="0.000020"/>
</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-10-16T01:16:21.497689" 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-10-16T01:16:21.498056" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:21.497916" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:21.497902" elapsed="0.000226"/>
</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-10-16T01:16:21.498285" elapsed="0.000019"/>
</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-10-16T01:16:21.498460" elapsed="0.000018"/>
</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-10-16T01:16:21.498622" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:16:21.497876" elapsed="0.000794"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:16:21.497773" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:21.498874" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:21.498943" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:21.499046" 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-10-16T01:16:21.470592" elapsed="0.028478"/>
</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-10-16T01:16:21.500166" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:21.499976" elapsed="0.000250">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:21.500310" 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-10-16T01:16:21.499621" elapsed="0.000712"/>
</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-10-16T01:16:21.500610" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:21.500396" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:16:21.501179" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:21.500914" elapsed="0.000290"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:21.500739" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:21.500379" elapsed="0.000878"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:21.501775" 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-10-16T01:16:21.501419" elapsed="0.000395"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:16:21.501860" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:16:21.501984" 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-manganese/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-10-16T01:16:21.499326" elapsed="0.002680"/>
</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-10-16T01:16:21.503135" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:21.502939" elapsed="0.000255">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:21.503278" 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-10-16T01:16:21.502555" elapsed="0.000746"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:16:21.503463" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:16:21.503364" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:21.503347" elapsed="0.000192"/>
</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-10-16T01:16:21.503686" elapsed="0.000037"/>
</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-10-16T01:16:21.503899" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:21.503961" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:21.504084" 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-manganese/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-10-16T01:16:21.502246" elapsed="0.001860"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:21.505501" 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-10-16T01:16:21.505274" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:21.505983" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:21.505743" 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-10-16T01:16:21.510294" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:21.510352" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:21.510447" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:21.506304" elapsed="0.004509">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:21.506083" elapsed="0.004807">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:21.511069" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:21.510920" elapsed="0.000207"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:21.506067" elapsed="0.005082">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:21.511479" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:21.511630" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:21.511596" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:21.511579" elapsed="0.000109"/>
</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-10-16T01:16:21.511925" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:21.511992" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:16:21.504547" elapsed="0.007548">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:21.512163" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:16:21.460873" elapsed="0.051413">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:16:21.512671" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:21.512456" elapsed="0.000321"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:21.512408" elapsed="0.000423"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:21.512914" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:16:21.458568" elapsed="0.054510">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:21.455432" elapsed="0.057744">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:16:21.455390" elapsed="0.057858">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:21.513492" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:16:21.513866" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:21.514175" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:16:21.514519" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:16:21.514986" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:21.515293" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:21.515638" elapsed="0.000019"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:16:21.515916" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:16:21.447501" elapsed="0.068517">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:16:21.516078" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:16:21.445622" elapsed="0.070545">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:21.516386" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:21.516246" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:21.516628" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:21.516457" elapsed="0.000223"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:21.516888" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:21.516727" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:21.516230" elapsed="0.000729"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:21.445282" elapsed="0.071715">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:21.444909" elapsed="0.072141">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:21.517098" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:16:21.436462" elapsed="0.080729">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:21.517364" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:21.517589" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:21.517442" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:21.517427" elapsed="0.000231"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:21.517921" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:21.518092" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:21.518151" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:16:21.434844" elapsed="0.083400">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:16:21.434354" elapsed="0.083951">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:16:21.434120" elapsed="0.084234">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:16:21.433325" elapsed="0.085110">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:21.518642" elapsed="0.000021"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:16:21.412248" elapsed="0.106516">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:16:22.537337" elapsed="0.000413"/>
</kw>
<msg time="2026-10-16T01:16:22.537874" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:22.536109" elapsed="0.001871"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:16:22.535171" elapsed="0.002962"/>
</kw>
<msg time="2026-10-16T01:16:22.538222" 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-10-16T01:16:22.528527" elapsed="0.009782"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:16:22.527657" elapsed="0.010798"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:22.539575" 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-10-16T01:16:22.539050" elapsed="0.000618"/>
</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-10-16T01:16:22.546161" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:22.545386" elapsed="0.000831"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:22.547203" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:22.546545" elapsed="0.000711"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:22.547348" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:16:22.547626" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:22.544560" elapsed="0.003116"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:16:22.548376" elapsed="0.000296"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:22.551066" 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-10-16T01:16:22.549108" elapsed="0.002021"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:22.552019" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:22.551459" elapsed="0.000614"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:22.552942" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:22.552381" elapsed="0.000614"/>
</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-10-16T01:16:22.561563" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:22.560201" elapsed="0.001470"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:22.561860" elapsed="0.000134"/>
</return>
<msg time="2026-10-16T01:16:22.562415" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:22.556984" elapsed="0.005555"/>
</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-10-16T01:16:22.585440" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:22.585020" elapsed="0.000457"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:16:22.586432" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:16:22.586170" elapsed="0.000346">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:22.586633" 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-10-16T01:16:22.585689" elapsed="0.000975"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:22.587369" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:22.586938" elapsed="0.000466"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:16:22.587857" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:16:22.588029" 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-10-16T01:16:22.587629" elapsed="0.000433"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:22.588642" 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-10-16T01:16:22.588336" elapsed="0.000382"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:22.590176" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:22.589629" elapsed="0.000605"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:16:22.590940" 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-10-16T01:16:22.590488" elapsed="0.000477"/>
</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-10-16T01:16:22.591242" elapsed="0.000020"/>
</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-10-16T01:16:22.591421" elapsed="0.000022"/>
</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-10-16T01:16:22.591598" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:16:22.591116" elapsed="0.000533"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:16:22.591009" elapsed="0.000666"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:16:22.591733" elapsed="0.000028"/>
</return>
<msg time="2026-10-16T01:16:22.591876" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:16:22.589159" elapsed="0.002740"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:22.588819" elapsed="0.003109"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:22.592092" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:22.591951" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:22.588794" elapsed="0.003368"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:16:22.592691" 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-10-16T01:16:22.592311" elapsed="0.000430"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:16:22.592796" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:16:22.584289" elapsed="0.008607"/>
</kw>
<msg time="2026-10-16T01:16:22.592942" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:22.578650" elapsed="0.014338"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:22.596770" elapsed="0.000036"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:22.600541" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:22.604300" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:22.604475" elapsed="0.000020"/>
</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-10-16T01:16:22.604650" elapsed="0.000019"/>
</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-10-16T01:16:22.605011" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:22.604872" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:22.604858" elapsed="0.000226"/>
</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-10-16T01:16:22.605239" elapsed="0.000019"/>
</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-10-16T01:16:22.605413" 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-10-16T01:16:22.605627" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:16:22.604832" elapsed="0.000844"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:16:22.604731" elapsed="0.000983"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:22.605876" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:22.605946" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:22.606048" 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-10-16T01:16:22.577835" elapsed="0.028237"/>
</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-10-16T01:16:22.607159" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:22.606968" elapsed="0.000251">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:22.607302" 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-10-16T01:16:22.606620" elapsed="0.000705"/>
</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-10-16T01:16:22.607601" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:22.607388" elapsed="0.000265"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:16:22.608124" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:22.607861" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:22.607676" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:22.607371" elapsed="0.000828"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:22.608689" 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-10-16T01:16:22.608355" elapsed="0.000374"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:16:22.608774" elapsed="0.000036"/>
</return>
<msg time="2026-10-16T01:16:22.608909" 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-manganese/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-10-16T01:16:22.606325" elapsed="0.002606"/>
</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-10-16T01:16:22.610009" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:22.609814" elapsed="0.000253">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:22.610150" 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-10-16T01:16:22.609472" elapsed="0.000700"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:16:22.610333" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:16:22.610235" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:22.610218" elapsed="0.000192"/>
</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-10-16T01:16:22.610557" elapsed="0.000019"/>
</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-10-16T01:16:22.610742" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:22.610814" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:16:22.610939" 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-manganese/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-10-16T01:16:22.609171" elapsed="0.001791"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:22.612351" 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-10-16T01:16:22.612128" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:22.612877" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:22.612611" 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-10-16T01:16:22.617252" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:22.617308" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:22.617404" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:22.613198" elapsed="0.004546">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:22.612977" elapsed="0.004856">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:22.618013" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:22.617863" elapsed="0.000209"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:22.612960" elapsed="0.005133">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:22.618425" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:22.618549" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:22.618516" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:22.618501" elapsed="0.000107"/>
</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-10-16T01:16:22.618761" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:22.618839" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:16:22.611386" elapsed="0.007555">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:22.619008" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:16:22.568240" elapsed="0.050890">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:16:22.619514" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:22.619295" elapsed="0.000301"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:22.619248" elapsed="0.000388"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:22.619743" elapsed="0.000053"/>
</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="FAIL" start="2026-10-16T01:16:22.566110" elapsed="0.053816">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:22.563269" elapsed="0.056755">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:16:22.563226" elapsed="0.056870">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:22.620341" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:16:22.620731" elapsed="0.000023"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:22.621058" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:16:22.621399" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:16:22.621859" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:22.622170" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:22.622512" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:16:22.622794" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:16:22.555612" elapsed="0.067285">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:16:22.622959" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:16:22.553841" elapsed="0.069210">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:22.623272" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:22.623131" elapsed="0.000191"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:22.623480" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:22.623345" elapsed="0.000183"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:22.623689" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:22.623550" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:22.623115" elapsed="0.000692"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:22.553455" elapsed="0.070391">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:22.553089" elapsed="0.070809">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:22.623946" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:16:22.543225" elapsed="0.080811">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:22.624208" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:22.624429" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:22.624285" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:22.624270" elapsed="0.000228"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:22.624621" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:22.624890" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:22.624952" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:16:22.541609" elapsed="0.083434">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:16:22.541181" elapsed="0.083923">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:16:22.540948" elapsed="0.084241">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:16:22.540164" elapsed="0.085108">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:22.625479" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:16:22.519367" elapsed="0.106215">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:16:23.644895" elapsed="0.000392"/>
</kw>
<msg time="2026-10-16T01:16:23.645394" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:23.643606" elapsed="0.001904"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:16:23.642680" elapsed="0.002981"/>
</kw>
<msg time="2026-10-16T01:16:23.645802" 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-10-16T01:16:23.635970" elapsed="0.009925"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:16:23.635090" elapsed="0.010954"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:23.647082" 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-10-16T01:16:23.646515" elapsed="0.000657"/>
</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-10-16T01:16:23.653680" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:23.652954" elapsed="0.000833"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:23.654765" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:23.654125" elapsed="0.000713"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:23.654932" elapsed="0.000060"/>
</return>
<msg time="2026-10-16T01:16:23.655215" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:23.652108" elapsed="0.003157"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:16:23.655589" elapsed="0.000333"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:23.657023" 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-10-16T01:16:23.656290" elapsed="0.000789"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:23.657962" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:23.657403" elapsed="0.000613"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:23.658890" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:23.658322" elapsed="0.000621"/>
</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-10-16T01:16:23.667481" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:23.666116" elapsed="0.001472"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:23.667760" elapsed="0.000158"/>
</return>
<msg time="2026-10-16T01:16:23.668339" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:23.662886" elapsed="0.005579"/>
</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-10-16T01:16:23.692751" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:23.692309" elapsed="0.000491"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:16:23.693751" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:16:23.693455" elapsed="0.000403">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:23.693976" 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-10-16T01:16:23.693016" elapsed="0.000992"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:23.694678" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:23.694241" elapsed="0.000492"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:16:23.695142" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:16:23.695325" 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-10-16T01:16:23.694987" elapsed="0.000371"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:23.695975" 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-10-16T01:16:23.695629" elapsed="0.000402"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:23.698950" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:23.698691" elapsed="0.000301"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:16:23.699416" 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-10-16T01:16:23.699165" elapsed="0.000276"/>
</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-10-16T01:16:23.699733" 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-10-16T01:16:23.699926" elapsed="0.000022"/>
</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-10-16T01:16:23.700106" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:16:23.699591" elapsed="0.000566"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:16:23.699483" elapsed="0.000702"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:16:23.700225" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:16:23.700354" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:16:23.698299" elapsed="0.002078"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:23.697943" elapsed="0.002463"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:23.700573" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:23.700431" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:23.696092" elapsed="0.004551"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:16:23.701212" 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-10-16T01:16:23.700828" elapsed="0.000410"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:16:23.701281" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:16:23.691588" elapsed="0.009791"/>
</kw>
<msg time="2026-10-16T01:16:23.701425" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:23.685988" elapsed="0.015484"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:23.705292" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:23.709144" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:23.712936" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:23.713114" elapsed="0.000020"/>
</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-10-16T01:16:23.713292" elapsed="0.000019"/>
</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-10-16T01:16:23.713630" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:23.713489" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:23.713475" elapsed="0.000243"/>
</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-10-16T01:16:23.713886" 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-10-16T01:16:23.714064" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:23.714225" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:16:23.713449" elapsed="0.000824"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:16:23.713360" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:23.714444" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:23.714512" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:23.714615" 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-10-16T01:16:23.685128" elapsed="0.029511"/>
</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-10-16T01:16:23.715758" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:23.715541" elapsed="0.000288">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:23.715911" 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-10-16T01:16:23.715219" elapsed="0.000716"/>
</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-10-16T01:16:23.716212" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:23.715998" elapsed="0.000266"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:16:23.716727" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:23.716444" elapsed="0.000309"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:23.716287" elapsed="0.000509"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:23.715982" elapsed="0.000835"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:23.717321" 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-10-16T01:16:23.716981" elapsed="0.000395"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:16:23.717424" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:16:23.717551" 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-manganese/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-10-16T01:16:23.714922" elapsed="0.002652"/>
</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-10-16T01:16:23.718656" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:23.718467" elapsed="0.000264">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:23.718835" 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-10-16T01:16:23.718148" elapsed="0.000711"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:16:23.719187" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:16:23.719083" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:23.718907" elapsed="0.000359"/>
</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-10-16T01:16:23.719416" elapsed="0.000020"/>
</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-10-16T01:16:23.719588" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:23.719648" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:16:23.719808" 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-manganese/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-10-16T01:16:23.717850" elapsed="0.001983"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:23.721074" 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-10-16T01:16:23.720832" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:23.721518" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:23.721301" elapsed="0.000257"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:16:23.725907" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:23.725960" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:23.726065" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:23.721894" elapsed="0.004523">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:23.721617" elapsed="0.004880">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:23.726678" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:23.726527" elapsed="0.000227"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:23.721601" elapsed="0.005187">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:23.727124" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:23.727243" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:23.727210" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:23.727194" elapsed="0.000106"/>
</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-10-16T01:16:23.727434" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:23.727527" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:16:23.720104" elapsed="0.007529">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:23.727717" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:16:23.675505" elapsed="0.052354">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:16:23.728244" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:23.728027" elapsed="0.000298"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:23.727980" elapsed="0.000386"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:23.728448" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:16:23.673163" elapsed="0.055450">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:23.669118" elapsed="0.059617">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:16:23.669075" elapsed="0.059751">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:23.729075" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:16:23.729420" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:23.729749" elapsed="0.000032"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:16:23.730112" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:16:23.730532" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:23.730884" elapsed="0.000027"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:23.731236" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:16:23.731478" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:16:23.661536" elapsed="0.070043">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:16:23.731640" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:16:23.659762" elapsed="0.072023">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:23.732007" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:23.731868" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:23.732213" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:23.732079" elapsed="0.000183"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:23.732424" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:23.732283" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:23.731852" elapsed="0.000689"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:23.659401" elapsed="0.073182">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:23.659036" elapsed="0.073601">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:23.732685" elapsed="0.000038"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:16:23.650742" elapsed="0.082074">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:23.732995" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:23.733212" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:23.733073" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:23.733058" elapsed="0.000222"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:23.733404" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:23.733571" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:23.733629" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:16:23.649161" elapsed="0.084686">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:16:23.648652" elapsed="0.085261">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:16:23.648395" elapsed="0.085566">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:16:23.647611" elapsed="0.086430">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:23.734255" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:16:23.626223" elapsed="0.108137">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:16:24.746399" elapsed="0.000271"/>
</kw>
<msg time="2026-10-16T01:16:24.746775" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:24.745609" elapsed="0.001242"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:16:24.745058" elapsed="0.001892"/>
</kw>
<msg time="2026-10-16T01:16:24.747007" 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-10-16T01:16:24.740829" elapsed="0.006234"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:16:24.740240" elapsed="0.006916"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:24.747937" 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-10-16T01:16:24.747462" elapsed="0.000535"/>
</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-10-16T01:16:24.752156" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:24.751659" elapsed="0.000533"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:24.752812" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:24.752399" elapsed="0.000448"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:24.752906" elapsed="0.000039"/>
</return>
<msg time="2026-10-16T01:16:24.753087" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:24.751170" elapsed="0.001948"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:16:24.753322" elapsed="0.000179"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:24.754186" 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-10-16T01:16:24.753751" elapsed="0.000470"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:24.754758" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:24.754424" elapsed="0.000384"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:24.755323" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:24.755000" elapsed="0.000356"/>
</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-10-16T01:16:24.760840" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:24.759964" elapsed="0.000945"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:24.760990" elapsed="0.000084"/>
</return>
<msg time="2026-10-16T01:16:24.761343" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:24.757952" elapsed="0.003471"/>
</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-10-16T01:16:24.783818" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:24.783358" elapsed="0.000497"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:16:24.784832" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:16:24.784518" elapsed="0.000409">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:24.785045" 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-10-16T01:16:24.784069" elapsed="0.001008"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:24.785773" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:24.785310" elapsed="0.000501"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:16:24.786187" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:16:24.786377" 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-10-16T01:16:24.786033" elapsed="0.000377"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:24.787024" 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-10-16T01:16:24.786679" elapsed="0.000402"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:24.788363" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:24.787999" elapsed="0.000406"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:16:24.788862" 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-10-16T01:16:24.788580" elapsed="0.000307"/>
</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-10-16T01:16:24.789167" elapsed="0.000020"/>
</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-10-16T01:16:24.789349" elapsed="0.000022"/>
</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-10-16T01:16:24.789574" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:16:24.789039" elapsed="0.000588"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:16:24.788930" elapsed="0.000725"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:16:24.789695" elapsed="0.000043"/>
</return>
<msg time="2026-10-16T01:16:24.789855" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:16:24.787507" elapsed="0.002372"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:24.787166" elapsed="0.002742"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:24.790074" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:24.789932" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:24.787142" elapsed="0.003002"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:16:24.790686" 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-10-16T01:16:24.790297" elapsed="0.000437"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:16:24.790793" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:16:24.782634" elapsed="0.008261"/>
</kw>
<msg time="2026-10-16T01:16:24.790942" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:24.777017" elapsed="0.013971"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:24.794758" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:24.798530" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:24.802296" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:24.802473" elapsed="0.000019"/>
</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-10-16T01:16:24.802648" elapsed="0.000019"/>
</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-10-16T01:16:24.803018" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:24.802872" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:24.802859" 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-10-16T01:16:24.803243" elapsed="0.000019"/>
</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-10-16T01:16:24.803417" elapsed="0.000018"/>
</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-10-16T01:16:24.803574" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:16:24.802832" elapsed="0.000790"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:16:24.802729" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:24.803867" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:24.803936" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:16:24.804041" 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-10-16T01:16:24.776160" elapsed="0.027905"/>
</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-10-16T01:16:24.805172" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:24.804976" elapsed="0.000255">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:24.805313" 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-10-16T01:16:24.804627" elapsed="0.000709"/>
</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-10-16T01:16:24.805613" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:24.805397" elapsed="0.000268"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:16:24.806146" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:24.805877" elapsed="0.000293"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:24.805688" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:24.805381" elapsed="0.000841"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:24.806732" 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-10-16T01:16:24.806379" elapsed="0.000378"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:16:24.806819" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:16:24.806943" 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-manganese/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-10-16T01:16:24.804325" elapsed="0.002641"/>
</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-10-16T01:16:24.808049" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:24.807860" elapsed="0.000247">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:24.808188" 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-10-16T01:16:24.807509" elapsed="0.000702"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:16:24.808376" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:16:24.808274" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:24.808257" elapsed="0.000194"/>
</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-10-16T01:16:24.808604" elapsed="0.000020"/>
</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-10-16T01:16:24.808803" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:24.808864" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:24.808987" 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-manganese/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-10-16T01:16:24.807208" elapsed="0.001802"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:24.810399" 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-10-16T01:16:24.810173" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:24.810881" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:24.810626" 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-10-16T01:16:24.815578" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:24.815672" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:24.815805" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:24.811212" elapsed="0.004947">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:24.810987" elapsed="0.005250">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:24.816417" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:24.816268" elapsed="0.000207"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:24.810965" elapsed="0.005535">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:24.816869" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:24.816991" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:24.816957" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:24.816941" elapsed="0.000107"/>
</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-10-16T01:16:24.817183" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:24.817246" elapsed="0.000013"/>
</return>
<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="FAIL" start="2026-10-16T01:16:24.809446" elapsed="0.007901">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:24.817414" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:16:24.766467" elapsed="0.051072">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:16:24.817962" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:24.817730" elapsed="0.000314"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:24.817658" elapsed="0.000425"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:24.818164" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:16:24.764308" elapsed="0.054025">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:24.761795" elapsed="0.056637">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:16:24.761685" elapsed="0.056821">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:24.818786" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:16:24.819131" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:24.819437" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:16:24.819828" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:16:24.820283" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:24.820592" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:24.820974" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:16:24.821210" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:16:24.757120" elapsed="0.064192">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:16:24.821375" elapsed="0.000014"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:16:24.755986" elapsed="0.065477">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:24.821691" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:24.821548" elapsed="0.000232"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:24.821942" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:24.821803" elapsed="0.000188"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:24.822151" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:24.822013" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:24.821527" elapsed="0.000693"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:24.755747" elapsed="0.066511">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:24.755414" elapsed="0.066897">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:24.822359" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:16:24.750218" elapsed="0.072232">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:24.822623" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:24.822990" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:24.822839" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:24.822685" elapsed="0.000379"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:24.823190" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:24.823361" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:24.823419" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:16:24.749221" elapsed="0.074291">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:16:24.748938" elapsed="0.074639">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:16:24.748778" elapsed="0.074849">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:16:24.748275" elapsed="0.075449">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:24.823985" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:16:24.734851" elapsed="0.089239">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:16:25.836969" elapsed="0.000279"/>
</kw>
<msg time="2026-10-16T01:16:25.837330" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:25.836113" elapsed="0.001301"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:16:25.835473" elapsed="0.002048"/>
</kw>
<msg time="2026-10-16T01:16:25.837585" 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-10-16T01:16:25.831123" elapsed="0.006524"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:16:25.830514" elapsed="0.007284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:25.838482" 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-10-16T01:16:25.838125" elapsed="0.000422"/>
</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-10-16T01:16:25.842995" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:25.842447" elapsed="0.000589"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:25.843675" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:25.843261" elapsed="0.000474"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:25.843822" elapsed="0.000042"/>
</return>
<msg time="2026-10-16T01:16:25.844020" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:25.841906" elapsed="0.002151"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:16:25.844280" elapsed="0.000191"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:25.845220" 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-10-16T01:16:25.844745" elapsed="0.000514"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:25.845870" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:25.845479" elapsed="0.000427"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:25.846460" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:25.846117" elapsed="0.000379"/>
</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-10-16T01:16:25.852457" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:25.851584" elapsed="0.000941"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:25.852604" elapsed="0.000083"/>
</return>
<msg time="2026-10-16T01:16:25.853010" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:25.849203" elapsed="0.003886"/>
</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-10-16T01:16:25.875731" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:25.875290" elapsed="0.000493"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:16:25.876997" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:16:25.876568" elapsed="0.000529">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:25.877215" 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-10-16T01:16:25.876121" elapsed="0.001126"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:25.877953" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:25.877481" elapsed="0.000507"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:16:25.878375" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:16:25.878566" 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-10-16T01:16:25.878216" elapsed="0.000383"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:25.879205" 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-10-16T01:16:25.878897" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:25.880769" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:25.880222" elapsed="0.000608"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:16:25.881425" 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-10-16T01:16:25.881072" elapsed="0.000387"/>
</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-10-16T01:16:25.881787" 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-10-16T01:16:25.881969" elapsed="0.000022"/>
</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-10-16T01:16:25.882152" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:16:25.881634" elapsed="0.000569"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:16:25.881519" elapsed="0.000711"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:16:25.882269" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:16:25.882396" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:16:25.879689" elapsed="0.002730"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:25.879346" elapsed="0.003102"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:25.882613" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:25.882472" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:25.879322" elapsed="0.003360"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:16:25.883288" 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-10-16T01:16:25.882885" elapsed="0.000429"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:16:25.883357" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:16:25.874564" elapsed="0.008891"/>
</kw>
<msg time="2026-10-16T01:16:25.883502" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:25.868853" elapsed="0.014696"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:25.887329" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:25.891065" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:25.894856" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:25.895031" elapsed="0.000020"/>
</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-10-16T01:16:25.895206" elapsed="0.000019"/>
</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-10-16T01:16:25.895538" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:25.895401" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:25.895387" elapsed="0.000224"/>
</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-10-16T01:16:25.895789" 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-10-16T01:16:25.895971" elapsed="0.000018"/>
</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-10-16T01:16:25.896130" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:16:25.895362" elapsed="0.000816"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:16:25.895273" elapsed="0.000928"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:25.896348" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:25.896414" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:25.896517" 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-10-16T01:16:25.867996" elapsed="0.028544"/>
</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-10-16T01:16:25.897639" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:25.897443" elapsed="0.000270">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:25.897812" 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-10-16T01:16:25.897126" elapsed="0.000709"/>
</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-10-16T01:16:25.898110" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:25.897898" elapsed="0.000264"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:16:25.898602" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:25.898340" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:25.898184" elapsed="0.000474"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:25.897882" elapsed="0.000796"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:25.899197" 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-10-16T01:16:25.898863" elapsed="0.000359"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:16:25.899267" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:16:25.899389" 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-manganese/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-10-16T01:16:25.896831" elapsed="0.002581"/>
</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-10-16T01:16:25.900522" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:25.900330" elapsed="0.000250">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:25.900662" 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-10-16T01:16:25.900008" elapsed="0.000676"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:16:25.900874" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:16:25.900775" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:25.900747" elapsed="0.000204"/>
</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-10-16T01:16:25.901098" 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-10-16T01:16:25.901268" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:25.901327" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:25.901450" 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-manganese/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-10-16T01:16:25.899683" elapsed="0.001790"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:25.902873" 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-10-16T01:16:25.902619" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:25.903314" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:25.903099" elapsed="0.000255"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:16:25.907896" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:25.907959" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:25.908055" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:25.903638" elapsed="0.004770">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:25.903413" elapsed="0.005072">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:25.908669" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:25.908516" elapsed="0.000227"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:25.903397" elapsed="0.005381">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:25.909113" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:25.909231" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:25.909199" elapsed="0.000069"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:25.909183" elapsed="0.000106"/>
</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-10-16T01:16:25.909421" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:25.909483" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:16:25.901936" elapsed="0.007648">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:25.909680" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:16:25.858237" elapsed="0.051602">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:16:25.910226" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:25.910009" elapsed="0.000298"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:25.909960" elapsed="0.000388"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:25.910432" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:16:25.856076" elapsed="0.054518">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:25.853383" elapsed="0.057311">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:16:25.853356" elapsed="0.057453">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:25.911056" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:16:25.911398" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:25.911722" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:16:25.912081" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:16:25.912503" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:25.912853" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:25.913203" elapsed="0.000019"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:16:25.913437" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:16:25.848309" elapsed="0.065228">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:16:25.913599" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:16:25.847077" elapsed="0.066611">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:25.913965" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:25.913824" elapsed="0.000191"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:25.914174" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:25.914038" elapsed="0.000185"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:25.914385" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:25.914244" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:25.913808" elapsed="0.000646"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:25.846853" elapsed="0.067639">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:25.846561" elapsed="0.067983">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:25.914592" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:16:25.840972" elapsed="0.073768">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:25.914931" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:25.915149" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:25.915010" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:25.914994" elapsed="0.000226"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:25.915343" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:25.915512" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:25.915571" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:16:25.839903" elapsed="0.075760">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:16:25.839561" elapsed="0.076293">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:16:25.839396" elapsed="0.076510">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:16:25.838890" elapsed="0.077098">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:25.916196" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:16:25.824692" elapsed="0.091610">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:16:26.935544" elapsed="0.000455"/>
</kw>
<msg time="2026-10-16T01:16:26.936114" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:26.934266" elapsed="0.001965"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:16:26.933335" elapsed="0.003050"/>
</kw>
<msg time="2026-10-16T01:16:26.936474" 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-10-16T01:16:26.926800" elapsed="0.009762"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:16:26.925916" elapsed="0.010823"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:26.937941" 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-10-16T01:16:26.937268" elapsed="0.000773"/>
</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-10-16T01:16:26.944696" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:26.943943" elapsed="0.000868"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:26.945811" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:26.945154" elapsed="0.000716"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:26.946060" elapsed="0.000065"/>
</return>
<msg time="2026-10-16T01:16:26.946356" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:26.943107" elapsed="0.003300"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:16:26.946783" elapsed="0.000291"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:26.948164" 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-10-16T01:16:26.947441" elapsed="0.000779"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:26.949115" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:26.948548" elapsed="0.000620"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:26.950030" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:26.949478" elapsed="0.000605"/>
</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-10-16T01:16:26.958931" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:26.957287" elapsed="0.001755"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:26.959171" elapsed="0.000134"/>
</return>
<msg time="2026-10-16T01:16:26.959797" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:26.954023" elapsed="0.005905"/>
</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-10-16T01:16:26.990116" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:26.989620" elapsed="0.000534"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:16:26.991183" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:16:26.990874" elapsed="0.000411">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:26.991421" 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-10-16T01:16:26.990372" elapsed="0.001083"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:26.992210" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:26.991693" elapsed="0.000554"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:16:26.992641" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:16:26.992949" 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-10-16T01:16:26.992478" elapsed="0.000509"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:26.993593" 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-10-16T01:16:26.993268" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:26.997046" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:26.996657" elapsed="0.000452"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:16:26.997785" 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-10-16T01:16:26.997358" elapsed="0.000465"/>
</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-10-16T01:16:26.998236" elapsed="0.000031"/>
</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-10-16T01:16:26.998495" elapsed="0.000032"/>
</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-10-16T01:16:26.998784" elapsed="0.000031"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:16:26.998051" elapsed="0.000811"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:16:26.997893" elapsed="0.001007"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:16:26.998958" elapsed="0.000038"/>
</return>
<msg time="2026-10-16T01:16:26.999199" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:16:26.996151" elapsed="0.003082"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:26.995737" elapsed="0.003537"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:26.999532" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:26.999327" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:26.993738" elapsed="0.005894"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:16:27.000503" 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-10-16T01:16:26.999936" elapsed="0.000603"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:16:27.000603" elapsed="0.000037"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:16:26.988846" elapsed="0.011964"/>
</kw>
<msg time="2026-10-16T01:16:27.000882" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:26.983141" elapsed="0.017809"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:27.005571" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:27.009471" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:27.013289" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:27.013468" elapsed="0.000019"/>
</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-10-16T01:16:27.013648" elapsed="0.000019"/>
</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-10-16T01:16:27.014011" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:27.013871" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:27.013858" elapsed="0.000225"/>
</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-10-16T01:16:27.014234" elapsed="0.000019"/>
</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-10-16T01:16:27.014408" elapsed="0.000018"/>
</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-10-16T01:16:27.014604" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:16:27.013831" elapsed="0.000832"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:16:27.013729" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:27.014886" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:27.014973" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:27.015078" 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-10-16T01:16:26.982283" elapsed="0.032819"/>
</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-10-16T01:16:27.016331" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:27.016129" elapsed="0.000265">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:27.016476" 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-10-16T01:16:27.015720" elapsed="0.000779"/>
</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-10-16T01:16:27.016962" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:27.016562" elapsed="0.000454"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:16:27.017469" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:27.017206" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:27.017039" elapsed="0.000486"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:27.016545" elapsed="0.001000"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:27.018069" 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-10-16T01:16:27.017720" elapsed="0.000374"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:16:27.018140" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:16:27.018263" 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-manganese/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-10-16T01:16:27.015397" elapsed="0.002889"/>
</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-10-16T01:16:27.019439" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:27.019249" elapsed="0.000248">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:27.019579" 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-10-16T01:16:27.018931" elapsed="0.000671"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:16:27.019964" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:16:27.019857" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:27.019649" elapsed="0.000394"/>
</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-10-16T01:16:27.020192" 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-10-16T01:16:27.020370" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:27.020431" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:27.020556" 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-manganese/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-10-16T01:16:27.018533" elapsed="0.002049"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:27.021860" 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-10-16T01:16:27.021604" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:27.022306" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:27.022090" elapsed="0.000256"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:16:27.026602" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:27.026654" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:27.026822" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:27.022629" elapsed="0.004556">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:27.022405" elapsed="0.004859">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:27.027447" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:27.027295" elapsed="0.000211"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:27.022389" elapsed="0.005139">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:27.027912" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:27.028033" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:27.028001" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:27.027985" elapsed="0.000106"/>
</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-10-16T01:16:27.028226" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:27.028288" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:16:27.020902" elapsed="0.007487">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:27.028456" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:16:26.968509" elapsed="0.060076">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:16:27.029009" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:27.028789" elapsed="0.000305"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:27.028727" elapsed="0.000406"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:27.029217" elapsed="0.000034"/>
</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="FAIL" start="2026-10-16T01:16:26.964997" elapsed="0.064381">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:26.960386" elapsed="0.069091">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:16:26.960343" elapsed="0.069255">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:27.029901" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:16:27.030243" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:27.030552" elapsed="0.000022"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:16:27.030954" elapsed="0.000032"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:16:27.031386" elapsed="0.000026"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:27.031722" elapsed="0.000036"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:27.032082" elapsed="0.000019"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:16:27.032351" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:16:26.952669" elapsed="0.079784">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:16:27.032515" elapsed="0.000014"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:16:26.950925" elapsed="0.081678">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:27.032864" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:27.032683" elapsed="0.000233"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:27.033073" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:27.032937" elapsed="0.000185"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:27.033283" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:27.033144" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:27.032668" elapsed="0.000682"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:26.950542" elapsed="0.082845">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:26.950176" elapsed="0.083264">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:27.033488" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:16:26.941684" elapsed="0.091894">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:27.033848" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:27.034074" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:27.033934" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:27.033919" elapsed="0.000221"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:27.034263" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:27.034440" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:27.034499" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:16:26.940119" elapsed="0.094471">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:16:26.939592" elapsed="0.095058">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:16:26.939348" elapsed="0.095437">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:16:26.938481" elapsed="0.096392">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:27.035082" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:16:26.917171" elapsed="0.118015">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:16:28.055270" elapsed="0.000416"/>
</kw>
<msg time="2026-10-16T01:16:28.055874" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:28.053989" elapsed="0.002006"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:16:28.052983" elapsed="0.003173"/>
</kw>
<msg time="2026-10-16T01:16:28.056250" 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-10-16T01:16:28.046083" elapsed="0.010257"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:16:28.045134" elapsed="0.011355"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:28.057546" 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-10-16T01:16:28.057025" elapsed="0.000613"/>
</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-10-16T01:16:28.064361" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:28.063513" elapsed="0.000906"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:28.065689" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:28.064832" elapsed="0.000984"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:28.065949" elapsed="0.000075"/>
</return>
<msg time="2026-10-16T01:16:28.066290" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:28.062669" elapsed="0.003675"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:16:28.066694" elapsed="0.000389"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:28.068299" 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-10-16T01:16:28.067471" elapsed="0.000888"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:28.069338" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:28.068767" elapsed="0.000628"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:28.070379" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:28.069774" elapsed="0.000667"/>
</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-10-16T01:16:28.080058" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:28.078586" elapsed="0.001581"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:28.080295" elapsed="0.000135"/>
</return>
<msg time="2026-10-16T01:16:28.081058" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:28.075099" elapsed="0.006086"/>
</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-10-16T01:16:28.105920" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:28.105460" elapsed="0.000496"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:16:28.106957" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:16:28.106614" elapsed="0.000443">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:28.107175" 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-10-16T01:16:28.106174" elapsed="0.001033"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:28.108760" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:28.108279" elapsed="0.000519"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:16:28.109199" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:16:28.109396" 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-10-16T01:16:28.109035" elapsed="0.000394"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:28.110056" 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-10-16T01:16:28.109694" elapsed="0.000421"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:28.111599" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:28.111077" elapsed="0.000581"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:16:28.112303" 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-10-16T01:16:28.111941" elapsed="0.000397"/>
</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-10-16T01:16:28.112774" elapsed="0.000031"/>
</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-10-16T01:16:28.113034" 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-10-16T01:16:28.113284" elapsed="0.000027"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:16:28.112555" elapsed="0.000801"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:16:28.112401" elapsed="0.000995"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:16:28.113453" elapsed="0.000038"/>
</return>
<msg time="2026-10-16T01:16:28.113637" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:16:28.110559" elapsed="0.003117"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:28.110205" elapsed="0.003562"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:28.114025" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:28.113811" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:28.110180" elapsed="0.003921"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:16:28.114651" 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-10-16T01:16:28.114254" elapsed="0.000422"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:16:28.114752" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:16:28.104766" elapsed="0.010088"/>
</kw>
<msg time="2026-10-16T01:16:28.114902" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:28.099118" elapsed="0.015830"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:28.118818" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:28.122552" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:28.126327" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:28.126543" elapsed="0.000020"/>
</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-10-16T01:16:28.126748" 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-10-16T01:16:28.127093" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:28.126951" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:28.126937" elapsed="0.000229"/>
</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-10-16T01:16:28.127316" elapsed="0.000019"/>
</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-10-16T01:16:28.127496" elapsed="0.000018"/>
</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-10-16T01:16:28.127654" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:16:28.126911" elapsed="0.000805"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:16:28.126821" elapsed="0.000941"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:28.127918" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:28.127985" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:28.128090" 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-10-16T01:16:28.098251" elapsed="0.029862"/>
</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-10-16T01:16:28.129233" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:28.129026" elapsed="0.000272">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:28.129380" 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-10-16T01:16:28.128672" elapsed="0.000731"/>
</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-10-16T01:16:28.129680" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:28.129466" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:16:28.130215" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:28.129953" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:28.129786" elapsed="0.000485"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:28.129449" elapsed="0.000842"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:28.130830" 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-10-16T01:16:28.130458" elapsed="0.000396"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:16:28.130899" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:16:28.131022" 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-manganese/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-10-16T01:16:28.128379" elapsed="0.002665"/>
</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-10-16T01:16:28.132132" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:28.131941" elapsed="0.000249">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:28.132273" 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-10-16T01:16:28.131583" elapsed="0.000718"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:16:28.132500" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:16:28.132399" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:28.132381" elapsed="0.000198"/>
</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-10-16T01:16:28.132757" 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-10-16T01:16:28.132937" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:28.132999" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:28.133124" 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-manganese/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-10-16T01:16:28.131288" elapsed="0.001858"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:28.134553" 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-10-16T01:16:28.134328" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:28.135030" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:28.134809" elapsed="0.000262"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:16:28.139915" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:28.139974" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:28.140071" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:28.135363" elapsed="0.005065">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:28.135131" elapsed="0.005377">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:28.140692" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:28.140538" elapsed="0.000240"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:28.135114" elapsed="0.005687">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:28.141147" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:28.141268" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:28.141235" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:28.141219" elapsed="0.000108"/>
</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-10-16T01:16:28.141462" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:28.141525" elapsed="0.000013"/>
</return>
<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="FAIL" start="2026-10-16T01:16:28.133588" elapsed="0.008039">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:28.141694" elapsed="0.000032"/>
</return>
<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="FAIL" start="2026-10-16T01:16:28.088612" elapsed="0.053243">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:16:28.142241" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:28.142021" elapsed="0.000333"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:28.141973" elapsed="0.000421"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:28.142477" elapsed="0.000038"/>
</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="FAIL" start="2026-10-16T01:16:28.085650" elapsed="0.056994">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:28.081647" elapsed="0.061135">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:16:28.081602" elapsed="0.061255">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:28.143105" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:16:28.143451" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:28.143798" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:16:28.144152" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:16:28.144581" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:28.144932" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:28.145277" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:16:28.145515" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:16:28.073618" elapsed="0.071998">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:16:28.145678" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:16:28.071560" elapsed="0.074266">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:28.146046" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:28.145907" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:28.146259" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:28.146118" elapsed="0.000190"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:28.146470" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:28.146330" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:28.145891" elapsed="0.000646"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:28.071195" elapsed="0.075380">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:28.070545" elapsed="0.076083">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:28.146677" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:16:28.061318" elapsed="0.085488">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:28.146981" elapsed="0.000056"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:28.147243" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:28.147101" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:28.147084" elapsed="0.000228"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:28.147437" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:28.147605" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:28.147667" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:16:28.059691" elapsed="0.088195">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:16:28.059243" elapsed="0.088708">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:16:28.058997" elapsed="0.089003">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:16:28.058137" elapsed="0.089945">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:28.148293" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:16:28.036100" elapsed="0.112298">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:16:29.169128" elapsed="0.000420"/>
</kw>
<msg time="2026-10-16T01:16:29.169666" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:29.167801" elapsed="0.002043"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:16:29.166805" elapsed="0.003203"/>
</kw>
<msg time="2026-10-16T01:16:29.170099" 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-10-16T01:16:29.160186" elapsed="0.010002"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:16:29.159269" elapsed="0.011065"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:29.171393" 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-10-16T01:16:29.170870" elapsed="0.000614"/>
</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-10-16T01:16:29.178344" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:29.177544" elapsed="0.000858"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:29.179392" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:29.178785" elapsed="0.000660"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:29.179538" elapsed="0.000074"/>
</return>
<msg time="2026-10-16T01:16:29.179901" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:29.176691" elapsed="0.003262"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:16:29.180278" elapsed="0.000285"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:29.181843" 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-10-16T01:16:29.180981" elapsed="0.000920"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:29.182798" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:29.182232" elapsed="0.000624"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:29.183676" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:29.183168" elapsed="0.000620"/>
</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-10-16T01:16:29.193152" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:29.191383" elapsed="0.001898"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:29.193437" elapsed="0.000161"/>
</return>
<msg time="2026-10-16T01:16:29.194408" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:29.187813" elapsed="0.006746"/>
</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-10-16T01:16:29.221952" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:29.221487" elapsed="0.000502"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:16:29.222985" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:16:29.222647" elapsed="0.000438">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:29.223204" 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-10-16T01:16:29.222208" elapsed="0.001027"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:29.223962" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:29.223479" elapsed="0.000518"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:16:29.224381" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:16:29.224579" 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-10-16T01:16:29.224221" elapsed="0.000390"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:29.225232" 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-10-16T01:16:29.224918" elapsed="0.000372"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:29.226452" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:29.226080" elapsed="0.000414"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:16:29.226957" 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-10-16T01:16:29.226668" 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-10-16T01:16:29.227273" 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-10-16T01:16:29.227457" elapsed="0.000022"/>
</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-10-16T01:16:29.227635" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:16:29.227144" elapsed="0.000543"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:16:29.227029" elapsed="0.000718"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:16:29.227794" elapsed="0.000029"/>
</return>
<msg time="2026-10-16T01:16:29.227928" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:16:29.225745" elapsed="0.002206"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:29.225379" 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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:29.228146" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:29.228004" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:29.225353" elapsed="0.002862"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:16:29.228806" 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-10-16T01:16:29.228368" elapsed="0.000515"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:16:29.228930" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:16:29.220687" elapsed="0.008345"/>
</kw>
<msg time="2026-10-16T01:16:29.229080" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:29.215053" elapsed="0.014077"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:29.232914" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:29.236650" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:29.240426" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:29.240603" elapsed="0.000019"/>
</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-10-16T01:16:29.240809" 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-10-16T01:16:29.241151" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:29.241006" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:29.240993" 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-10-16T01:16:29.241372" elapsed="0.000019"/>
</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-10-16T01:16:29.241551" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:29.241746" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:16:29.240967" elapsed="0.000831"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:16:29.240878" elapsed="0.000943"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:29.241970" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:29.242036" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:29.242139" 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-10-16T01:16:29.214192" elapsed="0.027970"/>
</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-10-16T01:16:29.243295" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:29.243102" elapsed="0.000253">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:29.243438" 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-10-16T01:16:29.242781" elapsed="0.000679"/>
</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-10-16T01:16:29.243766" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:29.243522" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:16:29.244288" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:29.244012" elapsed="0.000300"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:29.243843" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:29.243506" elapsed="0.000858"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:29.244892" 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-10-16T01:16:29.244519" elapsed="0.000398"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:16:29.244962" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:16:29.245089" 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-manganese/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-10-16T01:16:29.242423" elapsed="0.002688"/>
</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-10-16T01:16:29.246195" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:29.246006" elapsed="0.000248">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:29.246343" 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-10-16T01:16:29.245648" elapsed="0.000717"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:16:29.246532" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:16:29.246428" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:29.246412" elapsed="0.000197"/>
</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-10-16T01:16:29.246793" 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-10-16T01:16:29.246974" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:29.247037" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:29.247160" 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-manganese/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-10-16T01:16:29.245354" elapsed="0.001829"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:29.248571" 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-10-16T01:16:29.248346" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:29.249054" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:29.248834" elapsed="0.000264"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:16:29.253519" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:29.253579" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:29.253676" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:29.249381" elapsed="0.004679">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:29.249158" elapsed="0.005009">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:29.254349" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:29.254200" elapsed="0.000207"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:29.249141" elapsed="0.005288">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:29.254797" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:29.254917" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:29.254884" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:29.254868" elapsed="0.000108"/>
</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-10-16T01:16:29.255112" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:29.255175" elapsed="0.000013"/>
</return>
<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="FAIL" start="2026-10-16T01:16:29.247619" elapsed="0.007656">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:29.255342" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:16:29.203086" elapsed="0.052388">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:16:29.255900" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:29.255640" elapsed="0.000341"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:29.255594" elapsed="0.000428"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:29.256106" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:16:29.200155" elapsed="0.056114">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:29.195167" elapsed="0.061201">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:16:29.195109" elapsed="0.061330">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:29.256686" elapsed="0.000051"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:16:29.257065" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:29.257372" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:16:29.257758" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:16:29.258186" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:29.258498" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:29.258908" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:16:29.259148" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:16:29.186429" elapsed="0.072818">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:16:29.259340" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:16:29.184603" elapsed="0.074829">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:29.259653" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:29.259514" elapsed="0.000223"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:29.259902" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:29.259763" elapsed="0.000187"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:29.260120" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:29.259972" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:29.259499" elapsed="0.000693"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:29.184262" elapsed="0.075969">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:29.183891" elapsed="0.076394">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:29.260336" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:16:29.175344" elapsed="0.085086">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:29.260609" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:29.260922" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:29.260688" elapsed="0.000282"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:29.260672" elapsed="0.000320"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:29.261116" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:29.261287" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:29.261346" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:16:29.173775" elapsed="0.087663">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:16:29.173249" elapsed="0.088251">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:16:29.172797" elapsed="0.088752">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:16:29.171991" elapsed="0.089638">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:29.261939" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:16:29.149394" elapsed="0.112653">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:16:30.280560" elapsed="0.000535"/>
</kw>
<msg time="2026-10-16T01:16:30.281194" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:30.279287" elapsed="0.002085"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:16:30.278355" elapsed="0.003174"/>
</kw>
<msg time="2026-10-16T01:16:30.281618" 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-10-16T01:16:30.271767" elapsed="0.010001"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:16:30.270901" elapsed="0.011025"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:30.282951" 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-10-16T01:16:30.282385" elapsed="0.000657"/>
</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-10-16T01:16:30.289656" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:30.288910" elapsed="0.000853"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:30.290755" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:30.290102" elapsed="0.000712"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:30.290906" elapsed="0.000059"/>
</return>
<msg time="2026-10-16T01:16:30.291188" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:30.287990" elapsed="0.003247"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:16:30.291575" elapsed="0.000495"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:30.293216" 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-10-16T01:16:30.292459" elapsed="0.000813"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:30.294179" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:30.293599" elapsed="0.000634"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:30.295163" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:30.294545" elapsed="0.000670"/>
</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-10-16T01:16:30.303883" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:30.302447" elapsed="0.001544"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:30.304120" elapsed="0.000132"/>
</return>
<msg time="2026-10-16T01:16:30.304672" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:30.299249" elapsed="0.005813"/>
</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-10-16T01:16:30.327917" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:30.327459" elapsed="0.000494"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:16:30.328909" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:16:30.328600" elapsed="0.000394">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:30.329111" 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-10-16T01:16:30.328166" elapsed="0.000976"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:30.329865" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:30.329387" elapsed="0.000521"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:16:30.330286" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:16:30.330504" 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-10-16T01:16:30.330133" elapsed="0.000405"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:30.331154" 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-10-16T01:16:30.330846" elapsed="0.000364"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:30.333641" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:30.333407" elapsed="0.000275"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:16:30.334139" 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-10-16T01:16:30.333885" elapsed="0.000278"/>
</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-10-16T01:16:30.334442" elapsed="0.000020"/>
</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-10-16T01:16:30.334621" elapsed="0.000022"/>
</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-10-16T01:16:30.334831" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:16:30.334314" elapsed="0.000570"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:16:30.334207" elapsed="0.000704"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:16:30.334950" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:16:30.335080" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:16:30.333071" elapsed="0.002032"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:30.332811" elapsed="0.002321"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:30.335299" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:30.335155" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:30.331271" elapsed="0.004097"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:16:30.335931" 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-10-16T01:16:30.335519" elapsed="0.000438"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:16:30.336001" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:16:30.326767" elapsed="0.009333"/>
</kw>
<msg time="2026-10-16T01:16:30.336147" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:30.321105" elapsed="0.015088"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:30.339982" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:30.343787" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:30.347561" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:30.347802" 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-10-16T01:16:30.347985" elapsed="0.000019"/>
</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-10-16T01:16:30.348320" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:30.348182" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:30.348168" elapsed="0.000226"/>
</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-10-16T01:16:30.348545" elapsed="0.000019"/>
</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-10-16T01:16:30.348752" 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-10-16T01:16:30.348921" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:16:30.348142" elapsed="0.000828"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:16:30.348053" elapsed="0.000940"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:30.349141" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:30.349209" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:16:30.349314" 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-10-16T01:16:30.320198" elapsed="0.029140"/>
</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-10-16T01:16:30.350457" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:30.350266" elapsed="0.000252">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:30.350600" 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-10-16T01:16:30.349946" elapsed="0.000677"/>
</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-10-16T01:16:30.350933" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:30.350686" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:16:30.351429" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:30.351165" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:30.351009" elapsed="0.000477"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:30.350670" elapsed="0.000836"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:30.352031" 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-10-16T01:16:30.351663" elapsed="0.000392"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:16:30.352100" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:16:30.352222" 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-manganese/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-10-16T01:16:30.349620" elapsed="0.002625"/>
</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-10-16T01:16:30.353323" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:30.353136" elapsed="0.000245">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:30.353462" 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-10-16T01:16:30.352813" elapsed="0.000671"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:16:30.353844" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:16:30.353739" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:30.353531" elapsed="0.000393"/>
</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-10-16T01:16:30.354074" elapsed="0.000020"/>
</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-10-16T01:16:30.354279" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:30.354341" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:30.354466" 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-manganese/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-10-16T01:16:30.352483" elapsed="0.002007"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:30.355819" 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-10-16T01:16:30.355488" elapsed="0.000376"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:30.356269" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:30.356051" elapsed="0.000259"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:16:30.361279" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:30.361329" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:30.361431" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:30.356592" elapsed="0.005204">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:30.356370" elapsed="0.005501">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:30.362052" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:30.361903" elapsed="0.000206"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:30.356353" elapsed="0.005777">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:30.362458" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:30.362576" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:30.362544" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:30.362528" elapsed="0.000107"/>
</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-10-16T01:16:30.362801" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:30.362865" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:16:30.354797" elapsed="0.008169">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:30.363034" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:16:30.310445" elapsed="0.052714">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:16:30.363538" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:30.363322" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:30.363275" elapsed="0.000384"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:30.363782" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:16:30.308358" elapsed="0.055620">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:30.305513" elapsed="0.058565">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:16:30.305471" elapsed="0.058679">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:30.364396" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:16:30.364769" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:30.365090" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:16:30.365431" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:16:30.365884" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:30.366193" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:30.366533" elapsed="0.000019"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:16:30.366861" elapsed="0.000019"/>
</return>
<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="FAIL" start="2026-10-16T01:16:30.297963" elapsed="0.069002">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:16:30.367026" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:16:30.296128" elapsed="0.070985">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:30.367331" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:30.367190" elapsed="0.000190"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:30.367538" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:30.367403" elapsed="0.000184"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:30.367785" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:30.367609" elapsed="0.000225"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:30.367175" elapsed="0.000681"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:30.295683" elapsed="0.072211">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:30.295311" elapsed="0.072635">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:30.367994" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:16:30.286583" elapsed="0.081501">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:30.368256" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:30.368482" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:30.368339" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:30.368324" elapsed="0.000226"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:30.368847" elapsed="0.000022"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:30.369022" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:30.369080" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:16:30.285031" elapsed="0.084141">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:16:30.284511" elapsed="0.084723">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:16:30.284279" elapsed="0.085004">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:16:30.283482" elapsed="0.085881">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:30.369569" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:16:30.262644" elapsed="0.107028">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:16:31.388894" elapsed="0.000409"/>
</kw>
<msg time="2026-10-16T01:16:31.389416" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:31.387380" elapsed="0.002149"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:16:31.386441" elapsed="0.003243"/>
</kw>
<msg time="2026-10-16T01:16:31.389836" 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-10-16T01:16:31.379930" elapsed="0.010000"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:16:31.379049" elapsed="0.011029"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:31.391119" 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-10-16T01:16:31.390544" elapsed="0.000667"/>
</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-10-16T01:16:31.397882" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:31.397077" elapsed="0.000863"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:31.398933" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:31.398273" elapsed="0.000713"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:31.399082" elapsed="0.000063"/>
</return>
<msg time="2026-10-16T01:16:31.399372" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:31.396233" elapsed="0.003190"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:16:31.399802" elapsed="0.000290"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:31.401180" 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-10-16T01:16:31.400455" elapsed="0.000780"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:31.402118" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:31.401556" elapsed="0.000614"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:31.403137" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:31.402474" elapsed="0.000718"/>
</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-10-16T01:16:31.411923" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:31.410474" elapsed="0.001563"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:31.412166" elapsed="0.000136"/>
</return>
<msg time="2026-10-16T01:16:31.413004" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:31.407214" elapsed="0.005923"/>
</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-10-16T01:16:31.437768" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:31.437305" elapsed="0.000502"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:16:31.438805" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:16:31.438461" elapsed="0.000445">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:31.439025" 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-10-16T01:16:31.438023" elapsed="0.001034"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:31.439756" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:31.439290" elapsed="0.000503"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:16:31.440185" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:16:31.440376" 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-10-16T01:16:31.440018" elapsed="0.000392"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:31.441034" 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-10-16T01:16:31.440678" elapsed="0.000413"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:31.442535" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:31.442036" elapsed="0.000556"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:16:31.443226" 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-10-16T01:16:31.442867" elapsed="0.000393"/>
</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-10-16T01:16:31.443652" elapsed="0.000028"/>
</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-10-16T01:16:31.444001" elapsed="0.000032"/>
</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-10-16T01:16:31.444252" elapsed="0.000027"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:16:31.443475" elapsed="0.000849"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:16:31.443322" elapsed="0.001041"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:16:31.444419" elapsed="0.000036"/>
</return>
<msg time="2026-10-16T01:16:31.444599" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:16:31.441532" elapsed="0.003099"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:31.441177" elapsed="0.003494"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:31.444893" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:31.444738" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:31.441153" elapsed="0.003811"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:16:31.445505" 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-10-16T01:16:31.445117" elapsed="0.000414"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:16:31.445574" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:16:31.436566" elapsed="0.009106"/>
</kw>
<msg time="2026-10-16T01:16:31.445787" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:31.431005" elapsed="0.014831"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:31.449638" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:31.453424" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:31.457201" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:31.457378" elapsed="0.000020"/>
</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-10-16T01:16:31.457556" elapsed="0.000019"/>
</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-10-16T01:16:31.457921" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:31.457780" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:31.457767" elapsed="0.000227"/>
</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-10-16T01:16:31.458143" elapsed="0.000019"/>
</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-10-16T01:16:31.458316" elapsed="0.000018"/>
</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-10-16T01:16:31.458473" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:16:31.457739" elapsed="0.000782"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:16:31.457622" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:31.458733" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:31.458806" elapsed="0.000016"/>
</return>
<msg time="2026-10-16T01:16:31.458914" 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-10-16T01:16:31.430147" elapsed="0.028790"/>
</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-10-16T01:16:31.460048" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:31.459855" elapsed="0.000252">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:31.460223" 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-10-16T01:16:31.459500" elapsed="0.000747"/>
</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-10-16T01:16:31.460528" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:31.460312" elapsed="0.000269"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:16:31.461059" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:31.460793" elapsed="0.000290"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:31.460604" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:31.460295" elapsed="0.000841"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:31.461630" 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-10-16T01:16:31.461292" elapsed="0.000362"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:16:31.461700" elapsed="0.000057"/>
</return>
<msg time="2026-10-16T01:16:31.461858" 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-manganese/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-10-16T01:16:31.459206" elapsed="0.002675"/>
</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-10-16T01:16:31.462981" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:31.462783" elapsed="0.000256">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:31.463128" 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-10-16T01:16:31.462427" elapsed="0.000723"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:16:31.463311" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:16:31.463214" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:31.463198" elapsed="0.000190"/>
</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-10-16T01:16:31.463573" elapsed="0.000020"/>
</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-10-16T01:16:31.463778" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:31.463840" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:31.463963" 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-manganese/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-10-16T01:16:31.462129" elapsed="0.001858"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:31.465369" 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-10-16T01:16:31.465144" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:31.465852" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:31.465602" 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-10-16T01:16:31.470887" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:31.470946" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:31.471042" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:31.466175" elapsed="0.005219">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:31.465952" elapsed="0.005521">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:31.471652" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:31.471503" elapsed="0.000268"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:31.465936" elapsed="0.005860">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:31.472132" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:31.472252" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:31.472219" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:31.472203" elapsed="0.000106"/>
</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-10-16T01:16:31.472444" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:31.472506" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:16:31.464423" elapsed="0.008184">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:31.472675" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:16:31.420563" elapsed="0.052280">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:16:31.473227" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:31.473010" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:31.472962" elapsed="0.000386"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:31.473430" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:16:31.417461" elapsed="0.056131">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:31.413597" elapsed="0.060094">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:16:31.413555" elapsed="0.060249">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:31.474049" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:16:31.474392" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:31.474731" elapsed="0.000026"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:16:31.475085" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:16:31.475511" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:31.475875" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:31.476223" elapsed="0.000019"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:16:31.476457" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:16:31.405904" elapsed="0.070653">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:16:31.476618" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:16:31.404047" elapsed="0.072718">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:31.477020" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:31.476881" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:31.477257" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:31.477093" elapsed="0.000220"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:31.477477" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:31.477335" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:31.476864" elapsed="0.000682"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:31.403661" elapsed="0.073923">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:31.403291" elapsed="0.074345">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:31.477685" elapsed="0.000047"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:16:31.394818" elapsed="0.083001">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:31.477992" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:31.478208" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:31.478070" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:31.478055" elapsed="0.000222"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:31.478400" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:31.478571" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:31.478630" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:16:31.393178" elapsed="0.085646">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:16:31.392678" elapsed="0.086211">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:16:31.392436" elapsed="0.086503">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:16:31.391644" elapsed="0.087376">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:31.479226" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:16:31.370401" elapsed="0.108928">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:16:32.498358" elapsed="0.000470"/>
</kw>
<msg time="2026-10-16T01:16:32.498959" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:32.497070" elapsed="0.002004"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:16:32.496128" elapsed="0.003100"/>
</kw>
<msg time="2026-10-16T01:16:32.499435" 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-10-16T01:16:32.489532" elapsed="0.010000"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:16:32.488641" elapsed="0.011043"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:32.500855" 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-10-16T01:16:32.500225" elapsed="0.000726"/>
</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-10-16T01:16:32.507616" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:32.506869" elapsed="0.000804"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:32.508652" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:32.508055" elapsed="0.000692"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:32.508849" elapsed="0.000063"/>
</return>
<msg time="2026-10-16T01:16:32.509141" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:32.506018" elapsed="0.003173"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:16:32.509516" elapsed="0.000355"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:32.510949" 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-10-16T01:16:32.510238" elapsed="0.000767"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:32.511881" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:32.511326" elapsed="0.000608"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:32.512806" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:32.512248" elapsed="0.000627"/>
</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-10-16T01:16:32.521495" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:32.520123" elapsed="0.001480"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:32.521824" elapsed="0.000139"/>
</return>
<msg time="2026-10-16T01:16:32.522393" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:32.516877" elapsed="0.005640"/>
</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-10-16T01:16:32.547026" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:32.546557" elapsed="0.000505"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:16:32.548050" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:16:32.547748" elapsed="0.000401">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:32.548266" 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-10-16T01:16:32.547277" elapsed="0.001020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:32.548991" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:32.548528" elapsed="0.000498"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:16:32.549407" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:16:32.549601" 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-10-16T01:16:32.549251" elapsed="0.000384"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:32.550298" 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-10-16T01:16:32.549940" elapsed="0.000416"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:32.551854" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:32.551293" elapsed="0.000634"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:16:32.552435" 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-10-16T01:16:32.552184" elapsed="0.000275"/>
</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-10-16T01:16:32.552766" 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-10-16T01:16:32.552952" elapsed="0.000021"/>
</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-10-16T01:16:32.553130" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:16:32.552611" elapsed="0.000570"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:16:32.552502" elapsed="0.000709"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:16:32.553252" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:16:32.553380" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:16:32.550828" elapsed="0.002575"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:32.550442" elapsed="0.002989"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:32.553600" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:32.553457" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:32.550418" elapsed="0.003251"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:16:32.554263" 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-10-16T01:16:32.553862" elapsed="0.000426"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:16:32.554332" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:16:32.545863" elapsed="0.008567"/>
</kw>
<msg time="2026-10-16T01:16:32.554475" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:32.540190" elapsed="0.014331"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:32.558324" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:32.562107" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:32.565894" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:32.566069" elapsed="0.000020"/>
</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-10-16T01:16:32.566245" elapsed="0.000019"/>
</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-10-16T01:16:32.566609" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:32.566434" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:32.566421" elapsed="0.000263"/>
</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-10-16T01:16:32.566869" 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-10-16T01:16:32.567047" elapsed="0.000018"/>
</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-10-16T01:16:32.567206" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:16:32.566396" elapsed="0.000859"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:16:32.566309" elapsed="0.000969"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:32.567428" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:32.567494" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:32.567597" 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-10-16T01:16:32.539331" elapsed="0.028290"/>
</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-10-16T01:16:32.568747" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:32.568525" elapsed="0.000284">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:32.568890" 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-10-16T01:16:32.568206" elapsed="0.000707"/>
</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-10-16T01:16:32.569200" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:32.568975" elapsed="0.000276"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:16:32.569692" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:32.569431" elapsed="0.000458"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:32.569274" elapsed="0.000649"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:32.568959" elapsed="0.000984"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:32.570450" 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-10-16T01:16:32.570101" elapsed="0.000373"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:16:32.570518" elapsed="0.000028"/>
</return>
<msg time="2026-10-16T01:16:32.570642" 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-manganese/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-10-16T01:16:32.567907" elapsed="0.002757"/>
</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-10-16T01:16:32.571793" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:32.571573" elapsed="0.000280">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:32.571941" 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-10-16T01:16:32.571236" elapsed="0.000727"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:16:32.572126" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:16:32.572028" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:32.572011" elapsed="0.000191"/>
</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-10-16T01:16:32.572351" elapsed="0.000019"/>
</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-10-16T01:16:32.572528" elapsed="0.000023"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:32.572592" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:32.572744" 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-manganese/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-10-16T01:16:32.570944" elapsed="0.001865"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:32.574188" 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-10-16T01:16:32.573966" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:32.574626" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:32.574412" elapsed="0.000253"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:16:32.579614" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:32.579674" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:32.579808" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:32.574985" elapsed="0.005179">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:32.574760" elapsed="0.005482">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:32.580422" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:32.580272" elapsed="0.000207"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:32.574741" elapsed="0.005760">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:32.580858" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:32.580978" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:32.580945" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:32.580929" elapsed="0.000107"/>
</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-10-16T01:16:32.581170" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:32.581232" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:16:32.573246" elapsed="0.008087">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:32.581399" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:16:32.529592" elapsed="0.051929">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:16:32.581945" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:32.581684" elapsed="0.000343"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:32.581638" elapsed="0.000428"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:32.582150" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:16:32.527140" elapsed="0.055171">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:32.523043" elapsed="0.059396">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:16:32.523000" elapsed="0.059512">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:32.582785" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:16:32.583133" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:32.583438" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:16:32.583818" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:16:32.584242" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:32.584547" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:32.584927" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:16:32.585160" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:16:32.515505" elapsed="0.069754">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:16:32.585319" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:16:32.513674" elapsed="0.071733">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:32.585623" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:32.585485" elapsed="0.000187"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:32.585868" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:32.585694" elapsed="0.000223"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:32.586078" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:32.585939" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:32.585469" elapsed="0.000676"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:32.513347" elapsed="0.072835">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:32.512971" elapsed="0.073263">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:32.586281" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:16:32.504614" elapsed="0.081763">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:32.586550" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:32.586895" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:32.586627" elapsed="0.000317"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:32.586612" elapsed="0.000354"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:32.587090" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:32.587255" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:32.587311" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:16:32.502926" elapsed="0.084507">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:16:32.502430" elapsed="0.085065">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:16:32.502188" elapsed="0.085354">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:16:32.501393" elapsed="0.086230">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:32.587888" elapsed="0.000028"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:16:32.480152" elapsed="0.107847">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:16:33.606406" elapsed="0.000431"/>
</kw>
<msg time="2026-10-16T01:16:33.606938" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:33.605185" elapsed="0.001856"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:16:33.604220" elapsed="0.002972"/>
</kw>
<msg time="2026-10-16T01:16:33.607280" 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-10-16T01:16:33.597563" elapsed="0.009804"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:16:33.596757" elapsed="0.010755"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:33.608857" 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-10-16T01:16:33.608136" elapsed="0.000816"/>
</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-10-16T01:16:33.615516" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:33.614787" elapsed="0.000785"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:33.616577" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:33.615975" elapsed="0.000655"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:33.616765" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:16:33.617071" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:33.613953" elapsed="0.003169"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:16:33.617444" elapsed="0.000326"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:33.618850" 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-10-16T01:16:33.618137" elapsed="0.000769"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:33.619774" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:33.619229" elapsed="0.000600"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:33.620623" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:33.620132" elapsed="0.000543"/>
</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-10-16T01:16:33.629293" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:33.627915" elapsed="0.001558"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:33.629606" elapsed="0.000198"/>
</return>
<msg time="2026-10-16T01:16:33.630264" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:33.624638" elapsed="0.005752"/>
</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-10-16T01:16:33.655501" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:33.655080" elapsed="0.000457"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:16:33.656481" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:16:33.656219" elapsed="0.000348">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:33.656684" 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-10-16T01:16:33.655781" elapsed="0.000968"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:33.657410" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:33.656985" elapsed="0.000460"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:16:33.657887" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:16:33.658064" 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-10-16T01:16:33.657665" elapsed="0.000431"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:33.658675" 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-10-16T01:16:33.658369" elapsed="0.000397"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:33.661740" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:33.661386" elapsed="0.000414"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:16:33.662390" 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-10-16T01:16:33.662042" elapsed="0.000382"/>
</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-10-16T01:16:33.662863" elapsed="0.000037"/>
</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-10-16T01:16:33.663155" elapsed="0.000027"/>
</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-10-16T01:16:33.663342" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:16:33.662635" elapsed="0.000759"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:16:33.662484" elapsed="0.000938"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:16:33.663461" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:16:33.663590" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:16:33.660914" elapsed="0.002699"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:33.660522" elapsed="0.003121"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:33.663837" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:33.663666" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:33.658829" elapsed="0.005081"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:16:33.664436" 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-10-16T01:16:33.664061" elapsed="0.000400"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:16:33.664505" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:16:33.654358" elapsed="0.010244"/>
</kw>
<msg time="2026-10-16T01:16:33.664680" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:33.648761" elapsed="0.015993"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:33.668503" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:33.672318" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:33.676091" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:33.676265" elapsed="0.000020"/>
</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-10-16T01:16:33.676444" elapsed="0.000018"/>
</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-10-16T01:16:33.676800" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:33.676637" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:33.676623" 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-10-16T01:16:33.677026" elapsed="0.000018"/>
</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-10-16T01:16:33.677199" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:33.677357" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:16:33.676598" elapsed="0.000807"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:16:33.676508" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:33.677575" elapsed="0.000024"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:33.677648" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:16:33.677781" 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-10-16T01:16:33.647907" elapsed="0.029898"/>
</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-10-16T01:16:33.678888" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:33.678669" elapsed="0.000279">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:33.679029" 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-10-16T01:16:33.678353" elapsed="0.000699"/>
</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-10-16T01:16:33.679328" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:33.679115" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:16:33.679885" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:33.679592" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:33.679434" elapsed="0.000509"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:33.679098" elapsed="0.000864"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:33.680455" 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-10-16T01:16:33.680119" elapsed="0.000360"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:16:33.680524" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:16:33.680647" 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-manganese/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-10-16T01:16:33.678060" elapsed="0.002610"/>
</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-10-16T01:16:33.681793" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:33.681570" elapsed="0.000288">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:33.681942" 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-10-16T01:16:33.681258" elapsed="0.000706"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:16:33.682289" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:16:33.682185" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:33.682011" elapsed="0.000356"/>
</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-10-16T01:16:33.682517" elapsed="0.000020"/>
</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-10-16T01:16:33.682687" elapsed="0.000045"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:33.682776" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:33.682902" 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-manganese/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-10-16T01:16:33.680964" elapsed="0.001962"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:33.684136" 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-10-16T01:16:33.683913" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:33.684577" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:33.684362" elapsed="0.000255"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:16:33.689975" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:33.690025" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:33.690126" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:33.685039" elapsed="0.005418">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:33.684676" elapsed="0.005858">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:33.690744" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:33.690564" elapsed="0.000241"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:33.684660" elapsed="0.006167">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:33.691162" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:33.691315" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:33.691281" elapsed="0.000073"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:33.691264" elapsed="0.000111"/>
</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-10-16T01:16:33.691509" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:33.691572" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:16:33.683195" elapsed="0.008477">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:33.691776" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:16:33.638252" elapsed="0.053656">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:16:33.692288" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:33.692071" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:33.692025" elapsed="0.000384"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:33.692492" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:16:33.635034" elapsed="0.057619">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:33.631104" elapsed="0.061704">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:16:33.631059" elapsed="0.061823">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:33.693124" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:16:33.693464" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:33.693797" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:16:33.694146" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:16:33.694564" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:33.694913" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:33.695253" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:16:33.695491" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:16:33.623290" elapsed="0.072300">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:16:33.695650" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:16:33.621520" elapsed="0.074268">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:33.696008" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:33.695870" elapsed="0.000188"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:33.696248" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:33.696080" elapsed="0.000219"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:33.696461" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:33.696321" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:33.695854" elapsed="0.000676"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:33.621195" elapsed="0.075373">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:33.620816" elapsed="0.075804">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:33.696668" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:16:33.612523" elapsed="0.084271">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:33.696967" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:33.697183" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:33.697045" elapsed="0.000184"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:33.697029" elapsed="0.000221"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:33.697373" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:33.697538" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:33.697595" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:16:33.610903" elapsed="0.086782">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:16:33.610388" elapsed="0.087465">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:16:33.610157" elapsed="0.087745">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:16:33.609386" elapsed="0.088597">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:33.698190" elapsed="0.000021"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:16:33.588589" elapsed="0.109703">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:16:34.718785" elapsed="0.000434"/>
</kw>
<msg time="2026-10-16T01:16:34.719345" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:34.717442" elapsed="0.002040"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:16:34.716470" elapsed="0.003177"/>
</kw>
<msg time="2026-10-16T01:16:34.719805" 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-10-16T01:16:34.709397" elapsed="0.010505"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:16:34.708488" elapsed="0.011566"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:34.721298" 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-10-16T01:16:34.720674" elapsed="0.000719"/>
</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-10-16T01:16:34.728518" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:34.727533" elapsed="0.001045"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:34.729590" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:34.728976" elapsed="0.000669"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:34.729804" elapsed="0.000068"/>
</return>
<msg time="2026-10-16T01:16:34.730108" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:34.726685" elapsed="0.003473"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:16:34.730489" elapsed="0.000351"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:34.731950" 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-10-16T01:16:34.731216" elapsed="0.000790"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:34.732944" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:34.732338" elapsed="0.000676"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:34.734056" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:34.733409" elapsed="0.000703"/>
</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-10-16T01:16:34.743408" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:34.742022" elapsed="0.001514"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:34.743794" elapsed="0.000162"/>
</return>
<msg time="2026-10-16T01:16:34.744416" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:34.738620" elapsed="0.005952"/>
</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-10-16T01:16:34.768243" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:34.767811" elapsed="0.000468"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:16:34.769292" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:16:34.768990" elapsed="0.000404">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:34.769514" 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-10-16T01:16:34.768507" elapsed="0.001039"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:34.770309" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:34.769825" elapsed="0.000523"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:16:34.770822" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:16:34.771060" 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-10-16T01:16:34.770595" elapsed="0.000509"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:34.771776" 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-10-16T01:16:34.771408" elapsed="0.000447"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:34.773115" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:34.772634" elapsed="0.000525"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:16:34.773640" 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-10-16T01:16:34.773336" elapsed="0.000329"/>
</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-10-16T01:16:34.774055" 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-10-16T01:16:34.774243" elapsed="0.000022"/>
</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-10-16T01:16:34.774424" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:16:34.773899" elapsed="0.000576"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:16:34.773750" elapsed="0.000758"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:16:34.774555" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:16:34.774687" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:16:34.772301" elapsed="0.002450"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:34.771971" elapsed="0.002820"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:34.775018" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:34.774824" elapsed="0.000259"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:34.771939" elapsed="0.003169"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:16:34.775667" 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-10-16T01:16:34.775264" elapsed="0.000469"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:16:34.775792" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:16:34.767071" elapsed="0.008858"/>
</kw>
<msg time="2026-10-16T01:16:34.775986" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:34.761065" elapsed="0.014970"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:34.779959" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:34.783761" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:34.787608" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:34.787835" elapsed="0.000020"/>
</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-10-16T01:16:34.788013" elapsed="0.000019"/>
</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-10-16T01:16:34.788350" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:34.788209" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:34.788196" elapsed="0.000226"/>
</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-10-16T01:16:34.788578" elapsed="0.000019"/>
</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-10-16T01:16:34.788785" 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-10-16T01:16:34.788986" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:16:34.788170" elapsed="0.000865"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:16:34.788080" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:34.789210" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:34.789277" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:16:34.789384" 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-10-16T01:16:34.760126" elapsed="0.029282"/>
</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-10-16T01:16:34.790520" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:34.790328" elapsed="0.000253">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:34.790664" 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-10-16T01:16:34.790006" elapsed="0.000707"/>
</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-10-16T01:16:34.791015" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:34.790790" elapsed="0.000277"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:16:34.791527" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:34.791251" elapsed="0.000300"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:34.791090" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:34.790772" elapsed="0.000831"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:34.792127" 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-10-16T01:16:34.791787" elapsed="0.000364"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:16:34.792196" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:16:34.792320" 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-manganese/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-10-16T01:16:34.789670" elapsed="0.002673"/>
</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-10-16T01:16:34.793422" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:34.793232" elapsed="0.000248">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:34.793570" 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-10-16T01:16:34.792917" elapsed="0.000675"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:16:34.793805" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-10-16T01:16:34.793656" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:34.793639" elapsed="0.000278"/>
</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-10-16T01:16:34.794077" 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-10-16T01:16:34.794252" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:34.794313" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:34.794450" 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-manganese/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-10-16T01:16:34.792588" elapsed="0.001888"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:34.795919" 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-10-16T01:16:34.795660" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:34.796412" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:34.796188" elapsed="0.000266"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:16:34.801136" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:34.801195" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:34.801294" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:34.796779" elapsed="0.004879">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:34.796517" elapsed="0.005261">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:34.801969" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:34.801810" elapsed="0.000218"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:34.796499" elapsed="0.005551">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:34.802393" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:34.802511" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:34.802479" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:34.802463" elapsed="0.000107"/>
</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-10-16T01:16:34.802740" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:34.802808" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:16:34.794972" elapsed="0.007944">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:34.802984" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:16:34.750221" elapsed="0.052895">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:16:34.803502" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:34.803280" elapsed="0.000304"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:34.803232" elapsed="0.000392"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:34.803741" elapsed="0.000046"/>
</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="FAIL" start="2026-10-16T01:16:34.748077" elapsed="0.055875">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:34.745172" elapsed="0.058904">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:16:34.745125" elapsed="0.059041">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:34.804451" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:16:34.804877" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:34.805198" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:16:34.805547" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:16:34.806013" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:34.806326" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:34.806671" elapsed="0.000050"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:16:34.806943" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:16:34.737249" elapsed="0.069797">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:16:34.807107" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:16:34.735074" elapsed="0.072123">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:34.807420" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:34.807275" elapsed="0.000196"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:34.807630" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:34.807493" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:34.807901" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:34.807746" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:34.807260" elapsed="0.000708"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:34.734605" elapsed="0.073401">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:34.734211" elapsed="0.073849">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:34.808108" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:16:34.725114" elapsed="0.083085">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:34.808373" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:34.808590" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:34.808451" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:34.808436" elapsed="0.000222"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:34.808850" elapsed="0.000024"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:34.809066" elapsed="0.000024"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:34.809140" elapsed="0.000018"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:16:34.723457" elapsed="0.085783">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:16:34.722997" elapsed="0.086312">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:16:34.722731" elapsed="0.086668">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:16:34.721916" elapsed="0.087569">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:34.809828" elapsed="0.000026"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:16:34.699235" elapsed="0.110709">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:16:35.830530" elapsed="0.000462"/>
</kw>
<msg time="2026-10-16T01:16:35.831111" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:35.829273" elapsed="0.001959"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:16:35.828225" elapsed="0.003163"/>
</kw>
<msg time="2026-10-16T01:16:35.831477" 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-10-16T01:16:35.821272" elapsed="0.010293"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:16:35.820175" elapsed="0.011593"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:35.832830" 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-10-16T01:16:35.832254" elapsed="0.000692"/>
</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-10-16T01:16:35.839873" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:35.839076" elapsed="0.000857"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:35.840950" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:35.840268" elapsed="0.000736"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:35.841101" elapsed="0.000064"/>
</return>
<msg time="2026-10-16T01:16:35.841391" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:35.838222" elapsed="0.003219"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:16:35.841840" elapsed="0.000291"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:35.843261" 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-10-16T01:16:35.842496" elapsed="0.000821"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:35.844213" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:35.843644" elapsed="0.000621"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:35.845133" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:35.844570" elapsed="0.000615"/>
</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-10-16T01:16:35.854349" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:35.852951" elapsed="0.001506"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:35.854583" elapsed="0.000183"/>
</return>
<msg time="2026-10-16T01:16:35.855195" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:35.849625" elapsed="0.005695"/>
</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-10-16T01:16:35.879056" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:35.878513" elapsed="0.000588"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:16:35.880256" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:16:35.879897" elapsed="0.000461">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:35.880476" 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-10-16T01:16:35.879353" elapsed="0.001153"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:35.881267" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:35.880802" elapsed="0.000490"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:16:35.881572" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:16:35.881785" 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-10-16T01:16:35.881456" elapsed="0.000360"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:35.882273" 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-10-16T01:16:35.882048" elapsed="0.000266"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:35.883482" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:35.883115" elapsed="0.000408"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:16:35.883995" 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-10-16T01:16:35.883735" 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-10-16T01:16:35.884305" 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-10-16T01:16:35.884488" elapsed="0.000022"/>
</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-10-16T01:16:35.884679" elapsed="0.000051"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:16:35.884175" elapsed="0.000594"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:16:35.884063" elapsed="0.000739"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:16:35.884845" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:16:35.884979" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:16:35.882628" elapsed="0.002374"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:35.882376" elapsed="0.002655"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:35.885200" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:35.885056" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:35.882359" elapsed="0.002919"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:16:35.885854" 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-10-16T01:16:35.885434" elapsed="0.000446"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:16:35.885923" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:16:35.877797" elapsed="0.008225"/>
</kw>
<msg time="2026-10-16T01:16:35.886069" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:35.871822" elapsed="0.014293"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:35.889947" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:35.893957" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:35.897821" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:35.898058" elapsed="0.000026"/>
</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-10-16T01:16:35.898255" elapsed="0.000019"/>
</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-10-16T01:16:35.898594" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:35.898454" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:35.898441" elapsed="0.000228"/>
</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-10-16T01:16:35.898904" elapsed="0.000034"/>
</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-10-16T01:16:35.899111" 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-10-16T01:16:35.899272" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:16:35.898414" elapsed="0.000906"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:16:35.898324" elapsed="0.001019"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:35.899490" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:35.899557" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:35.899662" 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-10-16T01:16:35.870911" elapsed="0.028905"/>
</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-10-16T01:16:35.900972" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:35.900769" elapsed="0.000263">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:35.901115" 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-10-16T01:16:35.900419" elapsed="0.000718"/>
</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-10-16T01:16:35.901420" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:35.901200" elapsed="0.000271"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:16:35.901955" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:35.901652" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:35.901494" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:35.901183" elapsed="0.000848"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:35.902519" 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-10-16T01:16:35.902187" elapsed="0.000386"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:16:35.902620" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:16:35.902797" 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-manganese/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-10-16T01:16:35.900117" elapsed="0.002715"/>
</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-10-16T01:16:35.903946" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:35.903739" elapsed="0.000267">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:35.904089" 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-10-16T01:16:35.903386" elapsed="0.000725"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:16:35.904273" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:16:35.904175" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:35.904158" elapsed="0.000191"/>
</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-10-16T01:16:35.904503" elapsed="0.000020"/>
</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-10-16T01:16:35.904677" elapsed="0.000074"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:35.904795" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:35.904919" 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-manganese/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-10-16T01:16:35.903091" elapsed="0.001854"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:35.906343" 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-10-16T01:16:35.906115" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:35.906822" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:35.906570" 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-10-16T01:16:35.911432" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:35.911497" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:35.911613" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:35.907146" elapsed="0.004898">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:35.906923" elapsed="0.005208">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:35.912348" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:35.912165" elapsed="0.000243"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:35.906906" elapsed="0.005523">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:35.912853" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:35.912983" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:35.912949" elapsed="0.000073"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:35.912930" elapsed="0.000112"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:35.913178" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:35.913287" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:16:35.905376" elapsed="0.008018">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:35.913464" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:16:35.860788" elapsed="0.052813">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:16:35.914045" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:35.913816" elapsed="0.000310"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:35.913766" elapsed="0.000399"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:35.914252" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:16:35.858498" elapsed="0.055920">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:35.855851" elapsed="0.058666">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:16:35.855803" elapsed="0.058787">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:35.914888" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:16:35.915248" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:35.915559" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:16:35.915992" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:16:35.916419" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:35.916777" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:35.917135" elapsed="0.000019"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:16:35.917372" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:16:35.848296" elapsed="0.069181">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:16:35.917543" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:16:35.846049" elapsed="0.071587">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:35.917898" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:35.917758" elapsed="0.000192"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:35.918108" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:35.917972" elapsed="0.000184"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:35.918317" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:35.918177" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:35.917740" elapsed="0.000681"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:35.845658" elapsed="0.072806">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:35.845283" elapsed="0.073236">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:35.918570" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:16:35.836864" elapsed="0.081798">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:35.918983" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:35.919203" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:35.919063" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:35.919047" elapsed="0.000224"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:35.919397" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:35.919565" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:35.919622" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:16:35.835172" elapsed="0.084581">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:16:35.834582" elapsed="0.085253">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:16:35.834332" elapsed="0.085553">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:16:35.833510" elapsed="0.086462">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:35.920186" elapsed="0.000028"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:16:35.810792" elapsed="0.109507">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:16:36.940941" elapsed="0.000421"/>
</kw>
<msg time="2026-10-16T01:16:36.941483" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:36.939548" elapsed="0.002058"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:16:36.938547" elapsed="0.003283"/>
</kw>
<msg time="2026-10-16T01:16:36.941931" 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-10-16T01:16:36.931469" elapsed="0.010568"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:16:36.930477" elapsed="0.011728"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:36.943336" 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-10-16T01:16:36.942795" elapsed="0.000633"/>
</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-10-16T01:16:36.950813" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:36.949790" elapsed="0.001088"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:36.951964" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:36.951261" elapsed="0.000759"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:36.952117" elapsed="0.000066"/>
</return>
<msg time="2026-10-16T01:16:36.952411" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:36.948844" elapsed="0.003619"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:16:36.952847" elapsed="0.000327"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:36.954299" 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-10-16T01:16:36.953539" elapsed="0.000815"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:36.955362" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:36.954730" elapsed="0.000687"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:36.956308" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:36.955783" elapsed="0.000577"/>
</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-10-16T01:16:36.965210" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:36.963796" elapsed="0.001520"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:36.965439" elapsed="0.000131"/>
</return>
<msg time="2026-10-16T01:16:36.966060" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:36.960460" elapsed="0.005723"/>
</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-10-16T01:16:36.989874" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:36.989395" elapsed="0.000521"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:16:36.990996" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:16:36.990652" elapsed="0.000442">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:36.991210" 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-10-16T01:16:36.990183" elapsed="0.001058"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:36.991954" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:36.991480" elapsed="0.000517"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:16:36.992302" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:16:36.992454" 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-10-16T01:16:36.992187" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:36.992925" 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-10-16T01:16:36.992686" elapsed="0.000280"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:36.995490" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:36.995254" elapsed="0.000279"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:16:36.995995" 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-10-16T01:16:36.995733" 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-10-16T01:16:36.996301" elapsed="0.000020"/>
</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-10-16T01:16:36.996483" 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-10-16T01:16:36.996746" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:16:36.996173" elapsed="0.000628"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:16:36.996063" elapsed="0.000766"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:16:36.996869" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:16:36.996999" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:16:36.994918" elapsed="0.002105"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:36.994623" 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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:36.997220" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:36.997076" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:36.993009" elapsed="0.004281"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:16:36.997868" 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-10-16T01:16:36.997442" elapsed="0.000452"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:16:36.997938" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:16:36.988667" elapsed="0.009372"/>
</kw>
<msg time="2026-10-16T01:16:36.998085" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:36.982817" elapsed="0.015315"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:37.002234" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:37.006022" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:37.009775" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:37.009952" elapsed="0.000019"/>
</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-10-16T01:16:37.010125" elapsed="0.000019"/>
</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-10-16T01:16:37.010455" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:37.010316" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:37.010303" elapsed="0.000224"/>
</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-10-16T01:16:37.010691" elapsed="0.000037"/>
</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-10-16T01:16:37.010900" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:37.011060" elapsed="0.000025"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:16:37.010277" elapsed="0.000837"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:16:37.010190" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:37.011319" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:37.011387" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:37.011492" 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-10-16T01:16:36.981860" elapsed="0.029655"/>
</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-10-16T01:16:37.012633" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:37.012438" elapsed="0.000285">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:37.012808" 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-10-16T01:16:37.012117" elapsed="0.000714"/>
</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-10-16T01:16:37.013108" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:37.012894" elapsed="0.000264"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:16:37.013613" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:37.013352" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:37.013181" elapsed="0.000488"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:37.012878" elapsed="0.000847"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:37.014319" 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-10-16T01:16:37.013927" elapsed="0.000417"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:16:37.014390" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:16:37.014514" 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-manganese/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-10-16T01:16:37.011820" elapsed="0.002717"/>
</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-10-16T01:16:37.015662" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:37.015473" elapsed="0.000285">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:37.015843" 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-10-16T01:16:37.015158" elapsed="0.000708"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:16:37.016191" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:16:37.016087" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:37.015913" elapsed="0.000356"/>
</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-10-16T01:16:37.016418" elapsed="0.000020"/>
</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-10-16T01:16:37.016588" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:37.016647" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:37.016804" 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-manganese/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-10-16T01:16:37.014838" elapsed="0.001989"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:37.018130" 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-10-16T01:16:37.017859" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:37.018575" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:37.018360" elapsed="0.000255"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:16:37.023308" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:37.023397" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:37.023507" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:37.018978" elapsed="0.004988">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:37.018690" elapsed="0.005362">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:37.024235" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:37.024083" elapsed="0.000210"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:37.018658" elapsed="0.005657">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:37.024666" elapsed="0.000067"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:37.024858" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:37.024816" elapsed="0.000091"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:37.024795" 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-10-16T01:16:37.025083" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:37.025148" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:16:37.017099" elapsed="0.008151">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:37.025318" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:16:36.971902" elapsed="0.053541">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:16:37.025877" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:37.025606" elapsed="0.000357"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:37.025560" elapsed="0.000444"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:37.026086" elapsed="0.000034"/>
</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="FAIL" start="2026-10-16T01:16:36.969603" elapsed="0.056644">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:36.966641" elapsed="0.059704">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:16:36.966596" elapsed="0.059819">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:37.026665" elapsed="0.000056"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:16:37.027050" elapsed="0.000024"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:37.027361" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:16:37.027745" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:16:37.028247" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:37.028562" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:37.028949" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:16:37.029186" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:16:36.959121" elapsed="0.070167">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:16:37.029349" elapsed="0.000014"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:16:36.957251" elapsed="0.072184">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:37.029672" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:37.029512" elapsed="0.000260"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:37.029982" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:37.029802" elapsed="0.000233"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:37.030198" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:37.030057" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:37.029497" elapsed="0.000769"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:36.956913" elapsed="0.073392">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:36.956456" elapsed="0.073901">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:37.030405" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:16:36.947253" elapsed="0.083242">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:37.030669" elapsed="0.000155"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:37.031029" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:37.030888" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:37.030871" elapsed="0.000226"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:37.031221" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:37.031384" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:37.031442" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:16:36.945433" elapsed="0.086100">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:16:36.944989" elapsed="0.086605">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:16:36.944730" elapsed="0.086911">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:16:36.943927" elapsed="0.087841">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:37.032077" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:16:36.921139" elapsed="0.111045">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:16:38.052639" elapsed="0.000537"/>
</kw>
<msg time="2026-10-16T01:16:38.053299" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:38.051254" elapsed="0.002166"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:16:38.050304" elapsed="0.003279"/>
</kw>
<msg time="2026-10-16T01:16:38.053729" 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-10-16T01:16:38.043448" elapsed="0.010383"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:16:38.042547" elapsed="0.011441"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:38.055189" 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-10-16T01:16:38.054514" elapsed="0.000769"/>
</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-10-16T01:16:38.062399" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:38.061476" elapsed="0.000981"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:38.063499" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:38.062854" elapsed="0.000700"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:38.063650" elapsed="0.000116"/>
</return>
<msg time="2026-10-16T01:16:38.064021" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:38.060599" elapsed="0.003482"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:16:38.064459" elapsed="0.000339"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:38.065926" 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-10-16T01:16:38.065164" elapsed="0.000834"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:38.066996" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:38.066406" elapsed="0.000653"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:38.068100" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:38.067390" elapsed="0.000766"/>
</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-10-16T01:16:38.077579" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:38.076081" elapsed="0.001680"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:38.077929" elapsed="0.000170"/>
</return>
<msg time="2026-10-16T01:16:38.078543" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:38.072500" elapsed="0.006166"/>
</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-10-16T01:16:38.102232" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:38.101754" elapsed="0.000515"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:16:38.103477" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:16:38.103111" elapsed="0.000477">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:38.103760" 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-10-16T01:16:38.102557" elapsed="0.001247"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:38.104555" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:38.104110" elapsed="0.000481"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:16:38.105133" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:16:38.105339" 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-10-16T01:16:38.104920" elapsed="0.000448"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:38.105847" 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-10-16T01:16:38.105561" elapsed="0.000337"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:38.107019" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:38.106615" elapsed="0.000447"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:16:38.107498" 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-10-16T01:16:38.107238" 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-10-16T01:16:38.107856" 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-10-16T01:16:38.108043" elapsed="0.000022"/>
</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-10-16T01:16:38.108223" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:16:38.107695" elapsed="0.000580"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:16:38.107567" elapsed="0.000738"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:16:38.108346" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:16:38.108476" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:16:38.106249" elapsed="0.002250"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:38.105977" 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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:38.108738" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:38.108553" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:38.105955" elapsed="0.002865"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:16:38.109382" 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-10-16T01:16:38.108982" elapsed="0.000425"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:16:38.109451" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:16:38.101001" elapsed="0.008548"/>
</kw>
<msg time="2026-10-16T01:16:38.109597" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:38.095191" elapsed="0.014452"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:38.113618" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:38.117522" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:38.121577" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:38.121816" 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-10-16T01:16:38.122045" 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-10-16T01:16:38.122393" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:38.122250" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:38.122236" 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-10-16T01:16:38.122622" elapsed="0.000019"/>
</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-10-16T01:16:38.122837" 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-10-16T01:16:38.123025" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:16:38.122209" elapsed="0.000868"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:16:38.122117" elapsed="0.000982"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:38.123249" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:38.123315" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:38.123420" 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-10-16T01:16:38.094299" elapsed="0.029144"/>
</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-10-16T01:16:38.124560" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:38.124362" elapsed="0.000263">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:38.124735" 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-10-16T01:16:38.124040" elapsed="0.000719"/>
</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-10-16T01:16:38.125041" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:38.124822" elapsed="0.000271"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:16:38.125540" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:38.125276" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:38.125116" elapsed="0.000479"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:38.124805" elapsed="0.000810"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:38.126228" 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-10-16T01:16:38.125837" elapsed="0.000416"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:16:38.126298" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:16:38.126421" 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-manganese/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-10-16T01:16:38.123734" elapsed="0.002710"/>
</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-10-16T01:16:38.127567" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:38.127380" elapsed="0.000246">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:38.127748" 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-10-16T01:16:38.127064" elapsed="0.000709"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:16:38.127937" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:16:38.127837" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:38.127820" elapsed="0.000198"/>
</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-10-16T01:16:38.128173" 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-10-16T01:16:38.128346" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:38.128411" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:38.128534" 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-manganese/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-10-16T01:16:38.126767" elapsed="0.001790"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:38.130054" 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-10-16T01:16:38.129769" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:38.130517" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:38.130299" elapsed="0.000258"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:16:38.135178" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:38.135235" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:38.135334" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:38.130877" elapsed="0.004869">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:38.130618" elapsed="0.005217">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:38.136015" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:38.135865" elapsed="0.000208"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:38.130601" elapsed="0.005493">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:38.136431" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:38.136549" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:38.136517" elapsed="0.000069"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:38.136501" elapsed="0.000105"/>
</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-10-16T01:16:38.136771" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:38.136836" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:16:38.129028" elapsed="0.007910">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:38.137037" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:16:38.084010" elapsed="0.053155">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:16:38.137550" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:38.137329" elapsed="0.000303"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:38.137282" elapsed="0.000405"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:38.137817" elapsed="0.000045"/>
</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="FAIL" start="2026-10-16T01:16:38.081799" elapsed="0.056221">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:38.079228" elapsed="0.058904">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:16:38.079197" elapsed="0.059009">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:38.138454" elapsed="0.000027"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:16:38.138845" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:38.139158" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:16:38.139502" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:16:38.140012" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:38.140327" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:38.140729" elapsed="0.000022"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:16:38.140981" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:16:38.071087" elapsed="0.069996">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:16:38.141145" elapsed="0.000014"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:16:38.069075" elapsed="0.072157">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:38.141450" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:38.141311" elapsed="0.000195"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:38.141663" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:38.141528" elapsed="0.000232"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:38.141975" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:38.141787" elapsed="0.000250"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:38.141295" elapsed="0.000769"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:38.068620" elapsed="0.073492">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:38.068253" elapsed="0.073918">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:38.142219" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:16:38.059186" elapsed="0.083163">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:38.142528" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:38.142881" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:38.142606" elapsed="0.000326"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:38.142591" elapsed="0.000363"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:38.143086" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:38.143251" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:38.143309" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:16:38.057346" elapsed="0.086055">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:16:38.056879" elapsed="0.086584">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:16:38.056546" elapsed="0.086966">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:16:38.055797" elapsed="0.087795">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:38.143832" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:16:38.033013" elapsed="0.110924">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:16:39.163347" elapsed="0.000468"/>
</kw>
<msg time="2026-10-16T01:16:39.163942" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:39.162093" elapsed="0.001972"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:16:39.161083" elapsed="0.003139"/>
</kw>
<msg time="2026-10-16T01:16:39.164311" 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-10-16T01:16:39.154438" elapsed="0.009961"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:16:39.153526" elapsed="0.011017"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:39.165651" 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-10-16T01:16:39.165098" elapsed="0.000697"/>
</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-10-16T01:16:39.172416" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:39.171619" elapsed="0.000854"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:39.173456" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:39.172855" elapsed="0.000656"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:39.173755" elapsed="0.000069"/>
</return>
<msg time="2026-10-16T01:16:39.174063" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:39.170837" elapsed="0.003277"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:16:39.174444" elapsed="0.000334"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:39.175875" 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-10-16T01:16:39.175150" elapsed="0.000782"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:39.176815" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:39.176260" elapsed="0.000610"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:39.177733" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:39.177179" elapsed="0.000612"/>
</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-10-16T01:16:39.186513" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:39.185123" elapsed="0.001511"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:39.186824" elapsed="0.000138"/>
</return>
<msg time="2026-10-16T01:16:39.187386" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:39.181873" elapsed="0.005637"/>
</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-10-16T01:16:39.211216" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:39.210790" elapsed="0.000461"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:16:39.212246" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:16:39.211951" elapsed="0.000397">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:39.212466" 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-10-16T01:16:39.211467" elapsed="0.001030"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:39.213212" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:39.212762" elapsed="0.000485"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:16:39.213638" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:16:39.213871" 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-10-16T01:16:39.213482" elapsed="0.000422"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:39.214480" 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-10-16T01:16:39.214174" elapsed="0.000362"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:39.216015" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:39.215475" elapsed="0.000597"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:16:39.216686" 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-10-16T01:16:39.216315" elapsed="0.000424"/>
</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-10-16T01:16:39.217140" elapsed="0.000028"/>
</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-10-16T01:16:39.217393" 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-10-16T01:16:39.217680" elapsed="0.000040"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:16:39.216962" elapsed="0.000796"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:16:39.216810" elapsed="0.000977"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:16:39.217828" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:16:39.218000" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:16:39.215012" elapsed="0.003012"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:39.214620" elapsed="0.003433"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:39.218224" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:39.218080" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:39.214596" elapsed="0.003698"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:16:39.218866" 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-10-16T01:16:39.218448" elapsed="0.000444"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:16:39.218936" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:16:39.210062" elapsed="0.008973"/>
</kw>
<msg time="2026-10-16T01:16:39.219081" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:39.204372" elapsed="0.014755"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:39.222905" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:39.226626" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:39.230433" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:39.230610" elapsed="0.000019"/>
</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-10-16T01:16:39.230811" 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-10-16T01:16:39.231163" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:39.231023" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:39.231007" elapsed="0.000228"/>
</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-10-16T01:16:39.231384" elapsed="0.000019"/>
</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-10-16T01:16:39.231557" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:39.231742" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:16:39.230981" elapsed="0.000816"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:16:39.230885" elapsed="0.000935"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:39.231970" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:39.232041" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:39.232144" 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-10-16T01:16:39.203516" elapsed="0.028651"/>
</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-10-16T01:16:39.233290" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:39.233100" elapsed="0.000250">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:39.233432" 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-10-16T01:16:39.232783" elapsed="0.000677"/>
</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-10-16T01:16:39.233775" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:39.233529" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:16:39.234275" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:39.234009" elapsed="0.000290"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:39.233851" elapsed="0.000480"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:39.233512" elapsed="0.000838"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:39.234888" 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-10-16T01:16:39.234504" elapsed="0.000408"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:16:39.234957" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:16:39.235078" 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-manganese/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-10-16T01:16:39.232458" elapsed="0.002642"/>
</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-10-16T01:16:39.236178" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:39.235986" elapsed="0.000249">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:39.236316" 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-10-16T01:16:39.235643" elapsed="0.000695"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:16:39.236501" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:16:39.236400" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:39.236384" elapsed="0.000198"/>
</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-10-16T01:16:39.236757" 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-10-16T01:16:39.236937" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:39.236996" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:39.237119" 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-manganese/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-10-16T01:16:39.235347" elapsed="0.001794"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:39.238613" 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-10-16T01:16:39.238372" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:39.239135" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:39.238899" elapsed="0.000276"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:16:39.244022" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:39.244086" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:39.244237" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:39.239465" elapsed="0.005141">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:39.239237" elapsed="0.005478">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:39.244898" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:39.244749" elapsed="0.000208"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:39.239220" elapsed="0.005759">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:39.245332" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:39.245454" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:39.245419" elapsed="0.000075"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:39.245403" elapsed="0.000111"/>
</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-10-16T01:16:39.245650" elapsed="0.000038"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:39.245747" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:16:39.237578" elapsed="0.008273">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:39.245918" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:16:39.193855" elapsed="0.052200">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:16:39.246440" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:39.246221" elapsed="0.000300"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:39.246174" elapsed="0.000387"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:39.246646" elapsed="0.000069"/>
</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="FAIL" start="2026-10-16T01:16:39.191677" elapsed="0.055171">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:39.188240" elapsed="0.058706">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:16:39.188195" elapsed="0.058825">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:39.247269" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:16:39.247624" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:39.247981" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:16:39.248330" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:16:39.248790" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:39.249105" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:39.249450" elapsed="0.000019"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:16:39.249770" elapsed="0.000028"/>
</return>
<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="FAIL" start="2026-10-16T01:16:39.180505" elapsed="0.069380">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:16:39.249947" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:16:39.178611" elapsed="0.071424">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:39.250255" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:39.250116" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:39.250460" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:39.250326" elapsed="0.000183"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:39.250688" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:39.250530" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:39.250101" elapsed="0.000675"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:39.178274" elapsed="0.072540">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:39.177889" elapsed="0.072980">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:39.250919" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:16:39.169428" elapsed="0.081583">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:39.251186" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:39.251401" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:39.251263" elapsed="0.000184"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:39.251248" elapsed="0.000220"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:39.251591" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:39.251880" elapsed="0.000025"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:39.251946" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:16:39.167793" elapsed="0.084246">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:16:39.167291" elapsed="0.084811">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:16:39.167031" elapsed="0.085119">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:16:39.166239" elapsed="0.085993">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:39.252450" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:16:39.144763" elapsed="0.107796">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:16:40.272644" elapsed="0.000495"/>
</kw>
<msg time="2026-10-16T01:16:40.273262" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:40.271327" elapsed="0.002057"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:16:40.270219" elapsed="0.003323"/>
</kw>
<msg time="2026-10-16T01:16:40.273633" 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-10-16T01:16:40.263116" elapsed="0.010705"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:16:40.262228" elapsed="0.011769"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:40.275175" 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-10-16T01:16:40.274521" elapsed="0.000748"/>
</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-10-16T01:16:40.282112" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:40.281285" elapsed="0.000885"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:40.283167" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:40.282511" elapsed="0.000710"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:40.283315" elapsed="0.000067"/>
</return>
<msg time="2026-10-16T01:16:40.283606" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:40.280418" elapsed="0.003262"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:16:40.284036" elapsed="0.000288"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:40.285412" 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-10-16T01:16:40.284725" elapsed="0.000743"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:40.286342" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:40.285840" elapsed="0.000555"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:40.287253" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:40.286746" elapsed="0.000559"/>
</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-10-16T01:16:40.296196" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:40.294779" elapsed="0.001527"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:40.296432" elapsed="0.000135"/>
</return>
<msg time="2026-10-16T01:16:40.297303" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:40.291385" elapsed="0.006044"/>
</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-10-16T01:16:40.320629" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:40.320209" elapsed="0.000480"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:16:40.321752" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:16:40.321415" elapsed="0.000439">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:40.321971" 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-10-16T01:16:40.320922" elapsed="0.001080"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:40.322799" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:40.322326" elapsed="0.000509"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:16:40.323216" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:16:40.323410" 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-10-16T01:16:40.323060" elapsed="0.000383"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:40.324059" 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-10-16T01:16:40.323749" elapsed="0.000366"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:40.326871" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:40.326600" elapsed="0.000313"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:16:40.327342" 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-10-16T01:16:40.327086" elapsed="0.000281"/>
</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-10-16T01:16:40.327648" elapsed="0.000038"/>
</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-10-16T01:16:40.327944" 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-10-16T01:16:40.328123" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:16:40.327522" elapsed="0.000652"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:16:40.327411" elapsed="0.000791"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:16:40.328242" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:16:40.328372" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:16:40.326262" elapsed="0.002133"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:40.326001" 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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:40.328590" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:40.328448" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:40.324177" elapsed="0.004498"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:16:40.329233" 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-10-16T01:16:40.328844" elapsed="0.000414"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:16:40.329301" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:16:40.319480" elapsed="0.009919"/>
</kw>
<msg time="2026-10-16T01:16:40.329447" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:40.313639" elapsed="0.015854"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:40.333258" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:40.337026" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:40.340923" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:40.341140" 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-10-16T01:16:40.341318" elapsed="0.000019"/>
</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-10-16T01:16:40.341670" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:40.341514" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:40.341501" elapsed="0.000258"/>
</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-10-16T01:16:40.341910" elapsed="0.000019"/>
</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-10-16T01:16:40.342088" elapsed="0.000018"/>
</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-10-16T01:16:40.342244" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:16:40.341475" elapsed="0.000816"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:16:40.341384" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:40.342459" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:40.342527" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:40.342632" 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-10-16T01:16:40.312803" elapsed="0.029871"/>
</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-10-16T01:16:40.343794" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:40.343566" elapsed="0.000291">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:40.343940" 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-10-16T01:16:40.343247" elapsed="0.000716"/>
</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-10-16T01:16:40.344240" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:40.344026" elapsed="0.000266"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:16:40.344779" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:40.344487" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:40.344315" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:40.344009" elapsed="0.000847"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:40.345354" 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-10-16T01:16:40.345012" elapsed="0.000366"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:16:40.345423" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:16:40.345545" 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-manganese/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-10-16T01:16:40.342950" elapsed="0.002617"/>
</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-10-16T01:16:40.346646" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:40.346457" elapsed="0.000281">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:40.346824" 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-10-16T01:16:40.346135" elapsed="0.000712"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:16:40.399144" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-10-16T01:16:40.398918" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:40.346927" elapsed="0.052340"/>
</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-10-16T01:16:40.399477" elapsed="0.000026"/>
</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-10-16T01:16:40.399682" elapsed="0.000034"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:40.399760" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:40.399932" 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-manganese/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-10-16T01:16:40.345842" elapsed="0.054116"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:40.401349" 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-10-16T01:16:40.401057" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:40.401848" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:40.401584" 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-10-16T01:16:40.406453" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:40.406508" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:40.406627" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:40.402182" elapsed="0.004868">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:40.401952" elapsed="0.005179">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:40.407312" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:40.407161" elapsed="0.000209"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:40.401935" elapsed="0.005458">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:40.407761" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:40.407881" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:40.407849" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:40.407833" elapsed="0.000106"/>
</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-10-16T01:16:40.408075" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:40.408141" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:16:40.400278" elapsed="0.007964">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:40.408308" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:16:40.303063" elapsed="0.105402">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:16:40.408908" elapsed="0.000074"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:40.408633" elapsed="0.000415"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:40.408585" elapsed="0.000505"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:40.409179" elapsed="0.000037"/>
</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="FAIL" start="2026-10-16T01:16:40.300888" elapsed="0.108462">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:40.297970" elapsed="0.111486">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:16:40.297923" elapsed="0.111611">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:40.409833" elapsed="0.000025"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:16:40.410200" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:40.410525" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:16:40.410932" elapsed="0.000025"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:16:40.411378" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:40.411741" elapsed="0.000024"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:40.412109" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:16:40.412355" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:16:40.290012" elapsed="0.122446">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:16:40.412521" elapsed="0.000014"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:16:40.288168" elapsed="0.124443">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:40.412884" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:40.412734" elapsed="0.000203"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:40.413098" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:40.412960" elapsed="0.000186"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:40.413310" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:40.413168" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:40.412693" elapsed="0.000684"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:40.287839" elapsed="0.125578">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:40.287400" elapsed="0.126073">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:40.413526" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:16:40.278939" elapsed="0.134680">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:40.413952" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:40.414218" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:40.414075" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:40.414057" elapsed="0.000230"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:40.414413" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:40.414580" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:40.414639" elapsed="0.000032"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:16:40.277295" elapsed="0.137490">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:16:40.276845" elapsed="0.138007">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:16:40.276543" elapsed="0.138358">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:16:40.275770" elapsed="0.139212">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:40.415202" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:16:40.253356" elapsed="0.161953">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:16:41.435783" elapsed="0.000449"/>
</kw>
<msg time="2026-10-16T01:16:41.436358" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:41.434398" elapsed="0.002088"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:16:41.433411" elapsed="0.003327"/>
</kw>
<msg time="2026-10-16T01:16:41.436839" 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-10-16T01:16:41.426388" elapsed="0.010548"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:16:41.425300" elapsed="0.011785"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:41.438204" 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-10-16T01:16:41.437595" elapsed="0.000702"/>
</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-10-16T01:16:41.445310" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:41.444427" elapsed="0.000941"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:41.446496" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:41.445793" elapsed="0.000758"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:41.446679" elapsed="0.000118"/>
</return>
<msg time="2026-10-16T01:16:41.447069" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:41.443459" elapsed="0.003662"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:16:41.447452" elapsed="0.000542"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:41.449355" 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-10-16T01:16:41.448386" elapsed="0.001027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:41.450863" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:41.449830" elapsed="0.001108"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:41.451853" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:41.451270" elapsed="0.000638"/>
</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-10-16T01:16:41.460530" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:41.459340" elapsed="0.001257"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:41.460733" elapsed="0.000104"/>
</return>
<msg time="2026-10-16T01:16:41.461116" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:41.455951" elapsed="0.005245"/>
</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-10-16T01:16:41.485509" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:41.485035" elapsed="0.000528"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:16:41.486774" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:16:41.486465" elapsed="0.000397">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:41.486952" 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-10-16T01:16:41.485867" elapsed="0.001108"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:41.487504" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:41.487179" elapsed="0.000361"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:16:41.487899" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:16:41.488060" 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-10-16T01:16:41.487753" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:41.488572" 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-10-16T01:16:41.488303" 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-10-16T01:16:41.489616" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:41.489370" elapsed="0.000304"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:16:41.490225" 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-10-16T01:16:41.489888" elapsed="0.000368"/>
</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-10-16T01:16:41.490669" elapsed="0.000026"/>
</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-10-16T01:16:41.490886" 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-10-16T01:16:41.491092" elapsed="0.000024"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:16:41.490476" elapsed="0.000674"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:16:41.490320" elapsed="0.000861"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:16:41.491225" elapsed="0.000029"/>
</return>
<msg time="2026-10-16T01:16:41.491388" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:16:41.489001" elapsed="0.002413"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:41.488714" elapsed="0.002731"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:41.491621" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:41.491473" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:41.488679" elapsed="0.003058"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:16:41.492360" 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-10-16T01:16:41.491918" elapsed="0.000521"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:16:41.492486" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:16:41.484204" elapsed="0.008394"/>
</kw>
<msg time="2026-10-16T01:16:41.492675" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:41.477925" elapsed="0.014822"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:41.496810" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:41.501123" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:41.505405" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:41.505609" 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-10-16T01:16:41.505860" 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-10-16T01:16:41.506231" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:41.506068" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:41.506055" elapsed="0.000256"/>
</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-10-16T01:16:41.506498" elapsed="0.000024"/>
</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-10-16T01:16:41.506720" 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-10-16T01:16:41.506904" elapsed="0.000023"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:16:41.506028" elapsed="0.000934"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:16:41.505937" elapsed="0.001049"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:41.507145" elapsed="0.000031"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:41.507241" elapsed="0.000016"/>
</return>
<msg time="2026-10-16T01:16:41.507353" 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-10-16T01:16:41.477050" elapsed="0.030327"/>
</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-10-16T01:16:41.508745" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:41.508486" elapsed="0.000323">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:41.508895" 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-10-16T01:16:41.508137" elapsed="0.000781"/>
</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-10-16T01:16:41.509238" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:41.508995" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:16:41.509842" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:41.509510" elapsed="0.000357"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:41.509331" elapsed="0.000579"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:41.508971" elapsed="0.000970"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:41.510491" 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-10-16T01:16:41.510118" elapsed="0.000399"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:16:41.510565" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:16:41.510752" 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-manganese/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-10-16T01:16:41.507764" elapsed="0.003015"/>
</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-10-16T01:16:41.511943" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:41.511730" elapsed="0.000274">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:41.512088" 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-10-16T01:16:41.511372" elapsed="0.000739"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:16:41.512274" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:16:41.512174" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:41.512158" elapsed="0.000192"/>
</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-10-16T01:16:41.512500" elapsed="0.000020"/>
</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-10-16T01:16:41.512686" elapsed="0.000034"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:41.512763" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:16:41.512888" 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-manganese/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-10-16T01:16:41.511030" elapsed="0.001882"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:41.514148" 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-10-16T01:16:41.513920" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:41.514593" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:41.514374" elapsed="0.000259"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:16:41.519639" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:41.519729" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:41.519834" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:41.514963" elapsed="0.005247">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:41.514738" elapsed="0.005586">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:41.520513" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:41.520358" elapsed="0.000215"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:41.514720" elapsed="0.005875">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:41.520973" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:41.521096" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:41.521062" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:41.521046" elapsed="0.000109"/>
</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-10-16T01:16:41.521293" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:41.521357" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:16:41.513188" elapsed="0.008272">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:41.521528" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:16:41.466538" elapsed="0.055143">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:16:41.522094" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:41.521871" elapsed="0.000309"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:41.521824" elapsed="0.000398"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:41.522306" elapsed="0.000034"/>
</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="FAIL" start="2026-10-16T01:16:41.464299" elapsed="0.058171">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:41.461494" elapsed="0.061075">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:16:41.461465" elapsed="0.061178">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:41.522923" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:16:41.523271" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:41.523583" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:16:41.523966" elapsed="0.000024"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:16:41.524395" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:41.524748" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:41.525098" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:16:41.525335" elapsed="0.000019"/>
</return>
<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="FAIL" start="2026-10-16T01:16:41.454418" elapsed="0.071021">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:16:41.525533" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:16:41.452803" elapsed="0.072825">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:41.525892" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:41.525749" elapsed="0.000193"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:41.526101" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:41.525965" elapsed="0.000186"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:41.526314" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:41.526173" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:41.525732" elapsed="0.000652"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:41.452380" elapsed="0.074044">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:41.452007" elapsed="0.074472">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:41.526529" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:16:41.442037" elapsed="0.084587">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:41.526990" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:41.527230" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:41.527082" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:41.527064" elapsed="0.000239"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:41.527448" elapsed="0.000022"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:41.527626" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:41.527796" elapsed="0.000016"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:16:41.440330" elapsed="0.087565">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:16:41.439879" elapsed="0.088081">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:16:41.439570" elapsed="0.088440">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:16:41.438799" elapsed="0.089296">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:41.528336" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:16:41.416198" elapsed="0.112248">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:16:42.548127" elapsed="0.000432"/>
</kw>
<msg time="2026-10-16T01:16:42.548729" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:42.546837" elapsed="0.002141"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:16:42.545868" elapsed="0.003282"/>
</kw>
<msg time="2026-10-16T01:16:42.549245" 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-10-16T01:16:42.538555" elapsed="0.010783"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:16:42.537555" elapsed="0.011934"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:42.550563" 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-10-16T01:16:42.550026" elapsed="0.000656"/>
</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-10-16T01:16:42.557414" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:42.556570" elapsed="0.000902"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:42.558473" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:42.557858" elapsed="0.000669"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:42.558625" elapsed="0.000121"/>
</return>
<msg time="2026-10-16T01:16:42.558988" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:42.555776" elapsed="0.003263"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:16:42.559399" elapsed="0.000345"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:42.560919" 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-10-16T01:16:42.560120" elapsed="0.000859"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:42.561919" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:42.561312" elapsed="0.000664"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:42.562886" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:42.562320" elapsed="0.000620"/>
</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-10-16T01:16:42.572615" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:42.570734" elapsed="0.002354"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:42.573238" elapsed="0.000152"/>
</return>
<msg time="2026-10-16T01:16:42.573950" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:42.567118" elapsed="0.006962"/>
</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-10-16T01:16:42.596884" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:42.596417" elapsed="0.000504"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:16:42.597936" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:16:42.597585" elapsed="0.000453">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:42.598157" 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-10-16T01:16:42.597140" elapsed="0.001049"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:42.598905" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:42.598425" elapsed="0.000516"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:16:42.599334" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:16:42.599609" 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-10-16T01:16:42.599170" elapsed="0.000492"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:42.600292" 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-10-16T01:16:42.599953" elapsed="0.000403"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:42.601319" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:42.601085" elapsed="0.000275"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:16:42.601968" 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-10-16T01:16:42.601535" elapsed="0.000459"/>
</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-10-16T01:16:42.602300" elapsed="0.000020"/>
</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-10-16T01:16:42.602490" elapsed="0.000028"/>
</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-10-16T01:16:42.602709" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:16:42.602166" elapsed="0.000598"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:16:42.602043" elapsed="0.000752"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:16:42.602837" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:16:42.602969" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:16:42.600745" elapsed="0.002247"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:42.600446" elapsed="0.002575"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:42.603198" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:42.603048" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:42.600424" elapsed="0.002844"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:16:42.603851" 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-10-16T01:16:42.603423" elapsed="0.000454"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:16:42.603921" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:16:42.595713" elapsed="0.008308"/>
</kw>
<msg time="2026-10-16T01:16:42.604070" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:42.590005" elapsed="0.014112"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:42.608006" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:42.611962" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:42.615775" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:42.615989" 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-10-16T01:16:42.616170" elapsed="0.000019"/>
</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-10-16T01:16:42.616515" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:42.616371" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:42.616357" 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-10-16T01:16:42.616767" 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-10-16T01:16:42.616946" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:42.617105" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:16:42.616331" elapsed="0.000822"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:16:42.616237" elapsed="0.000939"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:42.617327" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:42.617394" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:16:42.617500" 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-10-16T01:16:42.589133" elapsed="0.028391"/>
</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-10-16T01:16:42.618665" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:42.618454" elapsed="0.000287">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:42.618825" 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-10-16T01:16:42.618133" elapsed="0.000715"/>
</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-10-16T01:16:42.619129" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:42.618911" elapsed="0.000275"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:16:42.619669" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:42.619385" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:42.619210" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:42.618894" elapsed="0.000869"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:42.620263" 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-10-16T01:16:42.619924" elapsed="0.000364"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:16:42.620333" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:16:42.620457" 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-manganese/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-10-16T01:16:42.617831" elapsed="0.002649"/>
</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-10-16T01:16:42.621576" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:42.621386" elapsed="0.000249">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:42.621757" 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-10-16T01:16:42.621072" elapsed="0.000708"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:16:42.621947" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:16:42.621845" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:42.621827" elapsed="0.000197"/>
</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-10-16T01:16:42.622181" elapsed="0.000020"/>
</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-10-16T01:16:42.622393" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:42.622461" elapsed="0.000016"/>
</return>
<msg time="2026-10-16T01:16:42.622589" 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-manganese/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-10-16T01:16:42.620768" elapsed="0.001844"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:42.624069" 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-10-16T01:16:42.623835" elapsed="0.000277"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:42.624519" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:42.624301" elapsed="0.000258"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:16:42.628912" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:42.628967" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:42.629070" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:42.624876" elapsed="0.004563">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:42.624619" elapsed="0.004902">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:42.629735" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:42.629552" elapsed="0.000244"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:42.624603" elapsed="0.005215">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:42.630179" elapsed="0.000032"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:42.630322" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:42.630289" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:42.630271" elapsed="0.000109"/>
</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-10-16T01:16:42.630548" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:42.630616" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:16:42.623104" elapsed="0.007671">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:42.630845" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:16:42.579296" elapsed="0.051678">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:16:42.631374" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:42.631140" elapsed="0.000318"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:42.631094" elapsed="0.000404"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:42.631582" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:16:42.577044" elapsed="0.054804">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:42.574560" elapsed="0.057389">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:16:42.574525" elapsed="0.057497">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:42.632278" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:16:42.632625" elapsed="0.000037"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:42.632975" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:16:42.633326" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:16:42.633809" elapsed="0.000024"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:42.634133" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:42.634478" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:16:42.634770" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:16:42.565368" elapsed="0.069507">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:16:42.634937" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:16:42.563837" elapsed="0.071188">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:42.635249" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:42.635105" elapsed="0.000194"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:42.635459" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:42.635322" elapsed="0.000187"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:42.635691" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:42.635531" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:42.635089" elapsed="0.000692"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:42.563447" elapsed="0.072373">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:42.563035" elapsed="0.072838">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:42.635922" elapsed="0.000013"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:16:42.554360" elapsed="0.081653">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:42.636192" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:42.636409" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:42.636270" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:42.636255" elapsed="0.000231"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:42.636666" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:42.636955" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:42.637015" elapsed="0.000015"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:16:42.552756" elapsed="0.084355">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:16:42.552246" elapsed="0.084928">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:16:42.551986" elapsed="0.085238">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:16:42.551169" elapsed="0.086138">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:42.637523" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:16:42.529268" elapsed="0.108361">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:16:43.657108" elapsed="0.000419"/>
</kw>
<msg time="2026-10-16T01:16:43.657673" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:43.655832" elapsed="0.002009"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:16:43.654879" elapsed="0.003146"/>
</kw>
<msg time="2026-10-16T01:16:43.658120" 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-10-16T01:16:43.648136" elapsed="0.010076"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:16:43.647225" elapsed="0.011138"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:43.659423" 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-10-16T01:16:43.658899" elapsed="0.000617"/>
</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-10-16T01:16:43.666249" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:43.665402" elapsed="0.000907"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:43.667318" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:43.666670" elapsed="0.000702"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:43.667470" elapsed="0.000064"/>
</return>
<msg time="2026-10-16T01:16:43.667826" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:43.664566" elapsed="0.003314"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:16:43.668227" elapsed="0.000322"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:43.669741" 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-10-16T01:16:43.669006" elapsed="0.000818"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:43.670878" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:43.670218" elapsed="0.000716"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:43.671977" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:43.671254" elapsed="0.000781"/>
</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-10-16T01:16:43.681128" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:43.679429" elapsed="0.001845"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:43.681452" elapsed="0.000180"/>
</return>
<msg time="2026-10-16T01:16:43.682318" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:43.676178" elapsed="0.006235"/>
</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-10-16T01:16:43.706670" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:43.706222" elapsed="0.000505"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:16:43.707736" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:16:43.707399" elapsed="0.000442">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:43.707962" 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-10-16T01:16:43.706952" elapsed="0.001042"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:43.708542" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:43.708230" elapsed="0.000338"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:16:43.708879" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:16:43.709032" 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-10-16T01:16:43.708759" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:43.709474" 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-10-16T01:16:43.709251" elapsed="0.000264"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:43.712228" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:43.711985" elapsed="0.000287"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:16:43.712737" 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-10-16T01:16:43.712447" elapsed="0.000316"/>
</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-10-16T01:16:43.713058" elapsed="0.000020"/>
</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-10-16T01:16:43.713240" elapsed="0.000022"/>
</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-10-16T01:16:43.713423" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:16:43.712926" elapsed="0.000549"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:16:43.712810" elapsed="0.000694"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:16:43.713547" elapsed="0.000028"/>
</return>
<msg time="2026-10-16T01:16:43.713694" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:16:43.711608" elapsed="0.002125"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:43.711338" 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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:43.713954" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:43.713803" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:43.709560" elapsed="0.004466"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:16:43.714575" 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-10-16T01:16:43.714181" elapsed="0.000420"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:16:43.714659" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:16:43.705459" elapsed="0.009321"/>
</kw>
<msg time="2026-10-16T01:16:43.714972" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:43.699278" elapsed="0.015746"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:43.718877" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:43.722722" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:43.726527" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:43.726738" 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-10-16T01:16:43.726921" elapsed="0.000019"/>
</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-10-16T01:16:43.727259" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:43.727117" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:43.727103" 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-10-16T01:16:43.727492" elapsed="0.000019"/>
</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-10-16T01:16:43.727682" elapsed="0.000033"/>
</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-10-16T01:16:43.727862" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:16:43.727077" elapsed="0.000833"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:16:43.726988" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:43.728083" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:43.728151" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:16:43.728257" 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-10-16T01:16:43.698225" elapsed="0.030056"/>
</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-10-16T01:16:43.729427" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:43.729192" elapsed="0.000306">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:43.729624" 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-10-16T01:16:43.728865" elapsed="0.000809"/>
</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-10-16T01:16:43.730003" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:43.729766" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:16:43.730527" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:43.730255" elapsed="0.000296"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:43.730080" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:43.729743" elapsed="0.000861"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:43.731142" 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-10-16T01:16:43.730795" elapsed="0.000372"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:16:43.731213" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:16:43.731339" 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-manganese/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-10-16T01:16:43.728538" elapsed="0.002824"/>
</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-10-16T01:16:43.732756" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:43.732522" elapsed="0.000297">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:43.732904" 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-10-16T01:16:43.732197" elapsed="0.000730"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:16:43.733275" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:16:43.733167" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:43.732974" elapsed="0.000380"/>
</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-10-16T01:16:43.733509" 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-10-16T01:16:43.733717" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:43.733795" elapsed="0.000021"/>
</return>
<msg time="2026-10-16T01:16:43.733933" 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-manganese/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-10-16T01:16:43.731605" elapsed="0.002352"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:43.735199" 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-10-16T01:16:43.734966" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:43.735672" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:43.735433" elapsed="0.000295"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:16:43.740050" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:43.740127" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:43.740279" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:43.736017" elapsed="0.004661">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:43.735790" elapsed="0.004987">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:43.740964" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:43.740809" elapsed="0.000250"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:43.735773" elapsed="0.005313">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:43.741436" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:43.741572" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:43.741526" elapsed="0.000101"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:43.741509" 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-10-16T01:16:43.741888" elapsed="0.000028"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:43.741982" elapsed="0.000023"/>
</return>
<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="FAIL" start="2026-10-16T01:16:43.734230" elapsed="0.007899">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:43.742226" elapsed="0.000019"/>
</return>
<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="FAIL" start="2026-10-16T01:16:43.687475" elapsed="0.054903">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:16:43.742817" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:43.742550" elapsed="0.000375"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:43.742501" elapsed="0.000477"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:43.743085" elapsed="0.000039"/>
</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="FAIL" start="2026-10-16T01:16:43.685303" elapsed="0.057956">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:43.682868" elapsed="0.060511">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:16:43.682829" elapsed="0.060646">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:43.743868" elapsed="0.000033"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:16:43.744289" elapsed="0.000023"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:43.744619" elapsed="0.000037"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:16:43.745082" elapsed="0.000025"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:16:43.745522" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:43.745908" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:43.746258" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:16:43.746497" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:16:43.674869" elapsed="0.071731">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:16:43.746733" elapsed="0.000025"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:16:43.672936" elapsed="0.073913">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:43.747134" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:43.746988" elapsed="0.000197"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:43.747349" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:43.747207" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:43.747566" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:43.747421" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:43.746969" elapsed="0.000683"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:43.672530" elapsed="0.075164">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:43.672138" elapsed="0.075681">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:43.747873" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:16:43.663205" elapsed="0.084763">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:43.748151" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:43.748375" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:43.748232" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:43.748216" elapsed="0.000229"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:43.748572" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:43.748840" elapsed="0.000022"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:43.748908" elapsed="0.000020"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:16:43.661527" elapsed="0.087511">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:16:43.661073" elapsed="0.088036">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:16:43.660819" elapsed="0.088341">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:16:43.660021" elapsed="0.089223">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:43.749473" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:16:43.638429" elapsed="0.111152">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:16:44.767192" elapsed="0.000276"/>
</kw>
<msg time="2026-10-16T01:16:44.767549" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:44.766354" elapsed="0.001293"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:16:44.765762" elapsed="0.002011"/>
</kw>
<msg time="2026-10-16T01:16:44.767923" 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-10-16T01:16:44.759649" elapsed="0.008336"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:16:44.758790" elapsed="0.009291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:44.768770" 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-10-16T01:16:44.768399" elapsed="0.000432"/>
</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-10-16T01:16:44.772981" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:44.772455" elapsed="0.000563"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:44.773612" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:44.773228" elapsed="0.000436"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:44.773747" elapsed="0.000043"/>
</return>
<msg time="2026-10-16T01:16:44.773937" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:44.771961" elapsed="0.002009"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:16:44.774180" elapsed="0.000184"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:44.775070" 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-10-16T01:16:44.774605" elapsed="0.000500"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:44.775645" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:44.775310" elapsed="0.000371"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:44.776211" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:44.775897" elapsed="0.000346"/>
</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-10-16T01:16:44.781795" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:44.780882" elapsed="0.000986"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:44.781953" elapsed="0.000090"/>
</return>
<msg time="2026-10-16T01:16:44.782331" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:44.778793" elapsed="0.003620"/>
</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-10-16T01:16:44.806270" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:44.805953" elapsed="0.000345"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:16:44.807109" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:16:44.806815" elapsed="0.000376">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:44.807278" 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-10-16T01:16:44.806461" elapsed="0.000840"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:44.807939" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:44.807475" elapsed="0.000492"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:16:44.808263" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:16:44.808440" 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-10-16T01:16:44.808137" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:44.808986" 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-10-16T01:16:44.808676" elapsed="0.000353"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:44.810136" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:44.809735" elapsed="0.000444"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:16:44.810620" 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-10-16T01:16:44.810357" 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-10-16T01:16:44.810981" 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-10-16T01:16:44.811170" 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-10-16T01:16:44.811355" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:16:44.810846" elapsed="0.000562"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:16:44.810725" elapsed="0.000711"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:16:44.811478" elapsed="0.000030"/>
</return>
<msg time="2026-10-16T01:16:44.811615" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:16:44.809362" elapsed="0.002304"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:44.809100" elapsed="0.002611"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:44.811885" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:44.811739" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:44.809078" elapsed="0.002877"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:16:44.812523" 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-10-16T01:16:44.812125" elapsed="0.000424"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:16:44.812593" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:16:44.805408" elapsed="0.007322"/>
</kw>
<msg time="2026-10-16T01:16:44.812780" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:44.799684" elapsed="0.013144"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:44.816743" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:44.820793" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:44.824648" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:44.824850" elapsed="0.000020"/>
</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-10-16T01:16:44.825031" elapsed="0.000019"/>
</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-10-16T01:16:44.825455" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:44.825248" elapsed="0.000260"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:44.825231" elapsed="0.000302"/>
</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-10-16T01:16:44.825719" 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-10-16T01:16:44.825927" 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-10-16T01:16:44.826099" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:16:44.825200" elapsed="0.000951"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:16:44.825102" elapsed="0.001073"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:44.826331" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:44.826402" elapsed="0.000016"/>
</return>
<msg time="2026-10-16T01:16:44.826521" 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-10-16T01:16:44.798808" elapsed="0.027738"/>
</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-10-16T01:16:44.827791" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:44.827525" elapsed="0.000342">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:44.827954" 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-10-16T01:16:44.827172" elapsed="0.000805"/>
</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-10-16T01:16:44.828273" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:44.828040" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:16:44.828829" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:44.828525" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:44.828349" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:44.828023" elapsed="0.000884"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:44.829415" 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-10-16T01:16:44.829068" elapsed="0.000372"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:16:44.829486" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:16:44.829624" 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-manganese/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-10-16T01:16:44.826852" elapsed="0.002822"/>
</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-10-16T01:16:44.831129" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:44.830908" elapsed="0.000284">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:44.831280" 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-10-16T01:16:44.830450" elapsed="0.000853"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:16:44.831497" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-16T01:16:44.831380" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:44.831357" 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-10-16T01:16:44.831788" 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-10-16T01:16:44.831968" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:44.832030" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:44.832157" 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-manganese/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-10-16T01:16:44.830056" elapsed="0.002161"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:44.833734" 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-10-16T01:16:44.833461" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:44.834214" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:44.833985" elapsed="0.000270"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:16:44.838846" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:44.838902" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:44.839002" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:44.834548" elapsed="0.004834">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:44.834317" elapsed="0.005148">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:44.839661" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:44.839495" elapsed="0.000241"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:44.834299" elapsed="0.005460">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:44.840109" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:44.840229" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:44.840195" elapsed="0.000074"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:44.840180" elapsed="0.000111"/>
</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-10-16T01:16:44.840428" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:44.840490" elapsed="0.000013"/>
</return>
<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="FAIL" start="2026-10-16T01:16:44.832737" elapsed="0.007857">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:44.840676" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:16:44.788120" elapsed="0.052723">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:16:44.841237" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:44.841014" elapsed="0.000306"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:44.840964" elapsed="0.000396"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:44.841443" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:16:44.785496" elapsed="0.056115">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:44.782764" elapsed="0.059020">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:16:44.782732" elapsed="0.059147">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:44.842142" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:16:44.842498" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:44.842890" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:16:44.843242" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:16:44.843682" elapsed="0.000041"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:44.844021" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:44.844376" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:16:44.844617" elapsed="0.000028"/>
</return>
<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="FAIL" start="2026-10-16T01:16:44.777961" elapsed="0.066809">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:16:44.844835" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:16:44.776786" elapsed="0.068141">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:44.845157" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:44.845009" elapsed="0.000198"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:44.845366" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:44.845229" elapsed="0.000186"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:44.845578" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:44.845436" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:44.844993" elapsed="0.000665"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:44.776538" elapsed="0.069177">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:44.776303" elapsed="0.069471">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:44.845840" elapsed="0.000016"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:16:44.771112" elapsed="0.074826">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:44.846117" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:44.846348" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:44.846195" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:44.846180" elapsed="0.000235"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:44.846539" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:44.846823" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:44.846885" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:16:44.770104" elapsed="0.076913">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:16:44.769807" elapsed="0.077275">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:16:44.769602" elapsed="0.077532">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:16:44.769118" elapsed="0.078102">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:44.847440" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:16:44.750363" elapsed="0.097186">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:16:45.866967" elapsed="0.000421"/>
</kw>
<msg time="2026-10-16T01:16:45.867509" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:45.865656" elapsed="0.002002"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:16:45.864729" elapsed="0.003124"/>
</kw>
<msg time="2026-10-16T01:16:45.867946" 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-10-16T01:16:45.858122" elapsed="0.009919"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:16:45.857181" elapsed="0.011008"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:45.869529" 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-10-16T01:16:45.868859" elapsed="0.000795"/>
</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-10-16T01:16:45.876475" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:45.875679" elapsed="0.000855"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:45.877539" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:45.876927" elapsed="0.000667"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:45.877741" elapsed="0.000067"/>
</return>
<msg time="2026-10-16T01:16:45.878043" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:45.874857" elapsed="0.003237"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:16:45.878432" elapsed="0.000359"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:45.880001" 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-10-16T01:16:45.879212" elapsed="0.000847"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:45.881014" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:45.880394" elapsed="0.000675"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:45.881979" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:45.881385" elapsed="0.000647"/>
</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-10-16T01:16:45.890976" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:45.889460" elapsed="0.001724"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:45.891319" elapsed="0.000136"/>
</return>
<msg time="2026-10-16T01:16:45.891993" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:45.886176" elapsed="0.005950"/>
</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-10-16T01:16:45.915245" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:45.914809" elapsed="0.000475"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:16:45.916308" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:16:45.916002" elapsed="0.000407">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:45.916537" 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-10-16T01:16:45.915507" elapsed="0.001061"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:45.917292" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:45.916850" elapsed="0.000486"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:16:45.917777" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:16:45.917933" 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-10-16T01:16:45.917611" elapsed="0.000347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:45.918377" 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-10-16T01:16:45.918152" elapsed="0.000266"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:45.919507" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:45.919119" elapsed="0.000430"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:16:45.920019" 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-10-16T01:16:45.919757" 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-10-16T01:16:45.920341" 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-10-16T01:16:45.920528" 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-10-16T01:16:45.920739" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:16:45.920211" elapsed="0.000582"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:16:45.920093" elapsed="0.000732"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:16:45.920868" elapsed="0.000028"/>
</return>
<msg time="2026-10-16T01:16:45.921002" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:16:45.918779" elapsed="0.002246"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:45.918487" elapsed="0.002567"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:45.921225" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:45.921080" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:45.918467" elapsed="0.002828"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:16:45.921884" 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-10-16T01:16:45.921454" elapsed="0.000456"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:16:45.921954" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:16:45.914063" elapsed="0.007992"/>
</kw>
<msg time="2026-10-16T01:16:45.922151" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:45.908274" elapsed="0.013927"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:45.926101" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:45.930103" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:45.933919" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:45.934099" elapsed="0.000020"/>
</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-10-16T01:16:45.934275" elapsed="0.000019"/>
</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-10-16T01:16:45.934610" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:45.934469" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:45.934456" 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-10-16T01:16:45.934865" elapsed="0.000019"/>
</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-10-16T01:16:45.935040" elapsed="0.000018"/>
</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-10-16T01:16:45.935196" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:16:45.934430" elapsed="0.000813"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:16:45.934341" elapsed="0.000925"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:45.935416" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:45.935488" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:45.935593" 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-10-16T01:16:45.907293" elapsed="0.028324"/>
</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-10-16T01:16:45.936763" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:45.936538" elapsed="0.000287">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:45.936908" 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-10-16T01:16:45.936214" elapsed="0.000717"/>
</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-10-16T01:16:45.937213" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:45.936995" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:16:45.937809" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:45.937503" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:45.937325" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:45.936977" elapsed="0.000910"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:45.938395" 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-10-16T01:16:45.938046" elapsed="0.000374"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:16:45.938465" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:16:45.938590" 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-manganese/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-10-16T01:16:45.935916" elapsed="0.002697"/>
</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-10-16T01:16:45.939734" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:45.939507" elapsed="0.000288">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:45.939879" 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-10-16T01:16:45.939189" elapsed="0.000713"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:16:45.940066" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:16:45.939966" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:45.939949" elapsed="0.000194"/>
</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-10-16T01:16:45.940295" 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-10-16T01:16:45.940470" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:45.940529" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:45.940669" 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-manganese/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-10-16T01:16:45.938889" elapsed="0.001804"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:45.942114" 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-10-16T01:16:45.941889" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:45.942556" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:45.942340" elapsed="0.000256"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:16:45.947146" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:45.947200" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:45.947298" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:45.942910" elapsed="0.004772">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:45.942671" elapsed="0.005125">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:45.947980" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:45.947829" elapsed="0.000209"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:45.942653" elapsed="0.005408">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:45.948408" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:45.948565" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:45.948531" elapsed="0.000073"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:45.948513" 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-10-16T01:16:45.948796" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:45.948862" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:16:45.941159" elapsed="0.007806">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:45.949033" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:16:45.897481" elapsed="0.051677">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:16:45.949556" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:45.949334" elapsed="0.000319"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:45.949281" elapsed="0.000432"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:45.949823" elapsed="0.000038"/>
</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="FAIL" start="2026-10-16T01:16:45.895218" elapsed="0.054779">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:45.892567" elapsed="0.057534">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:16:45.892533" elapsed="0.057643">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:45.950430" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:16:45.950825" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:45.951144" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:16:45.951499" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:16:45.951985" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:45.952307" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:45.952741" elapsed="0.000029"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:16:45.952993" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:16:45.884792" elapsed="0.068306">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:16:45.953160" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:16:45.882900" elapsed="0.070353">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:45.953474" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:45.953334" elapsed="0.000190"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:45.953767" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:45.953546" elapsed="0.000277"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:45.953992" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:45.953847" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:45.953317" elapsed="0.000744"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:45.882499" elapsed="0.071601">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:45.882128" elapsed="0.072027">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:45.954204" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:16:45.873424" elapsed="0.080874">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:45.954476" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:45.954854" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:45.954561" elapsed="0.000349"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:45.954546" elapsed="0.000388"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:45.955064" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:45.955234" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:45.955293" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:16:45.871829" elapsed="0.083561">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:16:45.871310" elapsed="0.084150">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:16:45.871021" elapsed="0.084489">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:16:45.870172" elapsed="0.085421">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:45.955850" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:16:45.848373" elapsed="0.107586">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:16:46.974884" elapsed="0.000414"/>
</kw>
<msg time="2026-10-16T01:16:46.975417" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:46.973583" elapsed="0.001953"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:16:46.972676" elapsed="0.003066"/>
</kw>
<msg time="2026-10-16T01:16:46.975838" 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-10-16T01:16:46.966158" elapsed="0.009771"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:16:46.965273" elapsed="0.010804"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:46.977256" 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-10-16T01:16:46.976730" elapsed="0.000619"/>
</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-10-16T01:16:46.984230" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:46.983426" elapsed="0.000862"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:46.985286" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:46.984652" elapsed="0.000688"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:46.985437" elapsed="0.000064"/>
</return>
<msg time="2026-10-16T01:16:46.985787" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:46.982565" elapsed="0.003275"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:16:46.986169" elapsed="0.000287"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:46.987544" 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-10-16T01:16:46.986872" elapsed="0.000728"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:46.988492" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:46.987987" elapsed="0.000558"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:46.989403" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:46.988905" elapsed="0.000551"/>
</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-10-16T01:16:46.998122" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:46.996741" elapsed="0.001490"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:46.998358" elapsed="0.000132"/>
</return>
<msg time="2026-10-16T01:16:46.999028" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:46.993475" elapsed="0.005677"/>
</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-10-16T01:16:47.022049" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:47.021585" elapsed="0.000500"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:16:47.023078" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:16:47.022778" elapsed="0.000399">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:47.023294" 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-10-16T01:16:47.022298" elapsed="0.001027"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:47.024049" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:47.023557" elapsed="0.000529"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:16:47.024472" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:16:47.024682" 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-10-16T01:16:47.024313" elapsed="0.000421"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:47.025306" 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-10-16T01:16:47.025002" elapsed="0.000360"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:47.028327" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:47.028082" elapsed="0.000292"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:16:47.028903" 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-10-16T01:16:47.028559" elapsed="0.000370"/>
</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-10-16T01:16:47.029234" 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-10-16T01:16:47.029434" 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-10-16T01:16:47.029633" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:16:47.029096" elapsed="0.000593"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:16:47.028975" elapsed="0.000760"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:16:47.029779" elapsed="0.000028"/>
</return>
<msg time="2026-10-16T01:16:47.029917" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:16:47.027732" elapsed="0.002209"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:47.027422" 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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:47.030146" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:47.029998" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:47.025422" elapsed="0.004797"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:16:47.030866" 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-10-16T01:16:47.030377" elapsed="0.000518"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:16:47.030940" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:16:47.020891" elapsed="0.010151"/>
</kw>
<msg time="2026-10-16T01:16:47.031090" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:47.015197" elapsed="0.015941"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:47.034969" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:47.038883" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:47.042682" elapsed="0.000038"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:47.042878" elapsed="0.000020"/>
</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-10-16T01:16:47.043055" elapsed="0.000026"/>
</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-10-16T01:16:47.043401" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:47.043261" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:47.043248" elapsed="0.000226"/>
</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-10-16T01:16:47.043638" 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-10-16T01:16:47.043831" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:47.044028" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:16:47.043221" elapsed="0.000857"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:16:47.043130" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:47.044250" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:47.044319" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:47.044424" 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-10-16T01:16:47.014335" elapsed="0.030113"/>
</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-10-16T01:16:47.045555" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:47.045359" elapsed="0.000257">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:47.045728" 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-10-16T01:16:47.045038" elapsed="0.000715"/>
</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-10-16T01:16:47.046031" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:47.045817" elapsed="0.000266"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:16:47.046530" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:47.046267" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:47.046106" elapsed="0.000480"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:47.045800" elapsed="0.000806"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:47.047131" 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-10-16T01:16:47.046793" elapsed="0.000362"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:16:47.047200" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:16:47.047323" 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-manganese/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-10-16T01:16:47.044739" elapsed="0.002607"/>
</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-10-16T01:16:47.048520" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:47.048323" elapsed="0.000256">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:47.048677" 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-10-16T01:16:47.048004" elapsed="0.000711"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:16:47.049056" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:16:47.048950" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:47.048764" elapsed="0.000369"/>
</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-10-16T01:16:47.049282" elapsed="0.000020"/>
</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-10-16T01:16:47.049455" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:47.049516" elapsed="0.000013"/>
</return>
<msg time="2026-10-16T01:16:47.049653" 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-manganese/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-10-16T01:16:47.047587" elapsed="0.002091"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:47.050914" 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-10-16T01:16:47.050672" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:47.051399" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:47.051178" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:16:47.055808" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:47.055871" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:47.055982" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:47.051762" elapsed="0.004619">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:47.051500" elapsed="0.005017">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:47.056823" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:47.056570" elapsed="0.000338"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:47.051483" elapsed="0.005455">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:47.057413" elapsed="0.000045"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:47.057593" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:47.057547" elapsed="0.000119"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:47.057524" 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-10-16T01:16:47.057909" elapsed="0.000028"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:47.057998" elapsed="0.000019"/>
</return>
<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="FAIL" start="2026-10-16T01:16:47.049965" elapsed="0.008178">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:47.058236" elapsed="0.000021"/>
</return>
<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="FAIL" start="2026-10-16T01:16:47.004643" elapsed="0.053768">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:16:47.059003" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:47.058668" elapsed="0.000452"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:47.058581" elapsed="0.000594"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:47.059291" elapsed="0.000050"/>
</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="FAIL" start="2026-10-16T01:16:47.002492" elapsed="0.057031">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:46.999603" elapsed="0.060113">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:16:46.999558" elapsed="0.060268">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:47.060171" elapsed="0.000033"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:16:47.060921" elapsed="0.000031"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:47.061381" elapsed="0.000035"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:16:47.061889" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:16:47.062319" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:47.062653" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:47.063020" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:16:47.063261" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:16:46.992160" elapsed="0.071203">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:16:47.063425" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:16:46.990306" elapsed="0.073207">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:47.063778" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:47.063594" elapsed="0.000237"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:47.063988" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:47.063853" elapsed="0.000184"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:47.064197" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:47.064058" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:47.063578" elapsed="0.000693"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:46.989978" elapsed="0.074331">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:46.989551" elapsed="0.074812">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:47.064411" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:16:46.981205" elapsed="0.083297">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:47.064691" elapsed="0.000079"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:47.064972" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:47.064832" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:47.064816" elapsed="0.000225"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:47.065165" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:47.065329" elapsed="0.000017"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:47.065386" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:16:46.979427" elapsed="0.086051">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:16:46.978897" elapsed="0.086643">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:16:46.978592" elapsed="0.087052">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:16:46.977847" elapsed="0.087973">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:47.066033" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:16:46.956809" elapsed="0.109328">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:16:48.087259" elapsed="0.000483"/>
</kw>
<msg time="2026-10-16T01:16:48.087870" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:48.085997" elapsed="0.001997"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:16:48.085050" elapsed="0.003105"/>
</kw>
<msg time="2026-10-16T01:16:48.088247" 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-10-16T01:16:48.078341" elapsed="0.009996"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:16:48.077284" elapsed="0.011202"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:48.089566" 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-10-16T01:16:48.089023" elapsed="0.000655"/>
</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-10-16T01:16:48.096351" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:48.095551" elapsed="0.000858"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:48.097411" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:48.096803" elapsed="0.000662"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:48.097563" elapsed="0.000091"/>
</return>
<msg time="2026-10-16T01:16:48.097921" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:48.094741" elapsed="0.003231"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:16:48.098304" elapsed="0.000284"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:48.099738" 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-10-16T01:16:48.099009" elapsed="0.000806"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:48.100686" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:48.100150" elapsed="0.000621"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:48.101595" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:48.101088" elapsed="0.000584"/>
</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-10-16T01:16:48.110650" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:48.109195" elapsed="0.001631"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:48.110966" elapsed="0.000137"/>
</return>
<msg time="2026-10-16T01:16:48.111536" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:48.105864" elapsed="0.005790"/>
</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-10-16T01:16:48.134843" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:48.134314" elapsed="0.000567"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:16:48.135893" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:16:48.135557" elapsed="0.000439">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:48.136115" 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-10-16T01:16:48.135102" elapsed="0.001044"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:48.136859" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:48.136382" elapsed="0.000513"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:16:48.137281" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:16:48.137479" 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-10-16T01:16:48.137122" elapsed="0.000392"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:48.138008" 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-10-16T01:16:48.137786" elapsed="0.000263"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:48.139133" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:48.138752" elapsed="0.000424"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:16:48.139631" 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-10-16T01:16:48.139353" 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-10-16T01:16:48.139976" 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-10-16T01:16:48.140162" 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-10-16T01:16:48.140344" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:16:48.139846" elapsed="0.000549"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:16:48.139721" elapsed="0.000703"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:16:48.140466" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:16:48.140596" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:16:48.138361" elapsed="0.002275"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:48.138111" elapsed="0.002555"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:48.140854" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:48.140692" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:48.138093" elapsed="0.002832"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:16:48.141472" 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-10-16T01:16:48.141077" elapsed="0.000421"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:16:48.141542" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:16:48.133559" elapsed="0.008101"/>
</kw>
<msg time="2026-10-16T01:16:48.141726" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:48.127818" elapsed="0.013959"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:48.145726" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:48.149651" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:48.153442" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:48.153632" elapsed="0.000020"/>
</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-10-16T01:16:48.153827" 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-10-16T01:16:48.154167" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:48.154027" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:48.154014" elapsed="0.000226"/>
</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-10-16T01:16:48.154390" elapsed="0.000033"/>
</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-10-16T01:16:48.154590" 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-10-16T01:16:48.154781" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:16:48.153987" elapsed="0.000843"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:16:48.153896" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:48.155004" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:48.155072" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:16:48.155179" 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-10-16T01:16:48.126948" elapsed="0.028254"/>
</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-10-16T01:16:48.156334" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:48.156135" elapsed="0.000259">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:48.156477" 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-10-16T01:16:48.155813" elapsed="0.000687"/>
</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-10-16T01:16:48.156812" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:48.156563" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:16:48.157312" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:48.157047" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:48.156888" elapsed="0.000480"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:48.156546" elapsed="0.000842"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:48.157911" 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-10-16T01:16:48.157543" elapsed="0.000423"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:16:48.158014" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:16:48.158140" 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-manganese/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-10-16T01:16:48.155474" elapsed="0.002690"/>
</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-10-16T01:16:48.159309" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:48.159119" elapsed="0.000249">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:48.159453" 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-10-16T01:16:48.158789" elapsed="0.000687"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:16:48.159659" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:16:48.159539" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:48.159522" elapsed="0.000231"/>
</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-10-16T01:16:48.159901" elapsed="0.000020"/>
</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-10-16T01:16:48.160070" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:48.160129" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:48.160252" 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-manganese/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-10-16T01:16:48.158411" elapsed="0.001865"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:48.161692" 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-10-16T01:16:48.161451" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:48.162151" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:48.161934" elapsed="0.000256"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:16:48.166783" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:48.166847" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:48.166948" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:48.162473" elapsed="0.004843">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:48.162250" elapsed="0.005146">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:48.167574" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:48.167427" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:48.162234" elapsed="0.005438">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:48.168104" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:48.168229" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:48.168194" elapsed="0.000075"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:48.168178" elapsed="0.000111"/>
</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-10-16T01:16:48.168424" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:48.168516" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:16:48.160755" elapsed="0.007884">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:48.168724" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:16:48.117091" elapsed="0.051761">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:16:48.169240" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:48.169019" elapsed="0.000303"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:48.168972" elapsed="0.000402"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:48.169460" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:16:48.114772" elapsed="0.054870">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:48.112196" elapsed="0.057582">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:16:48.112165" elapsed="0.057695">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:48.170114" elapsed="0.000025"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:16:48.170463" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:48.170828" elapsed="0.000022"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:16:48.171198" elapsed="0.000026"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:16:48.171643" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:48.171976" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:48.172322" elapsed="0.000019"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:16:48.172559" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:16:48.104401" elapsed="0.068273">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:16:48.172770" elapsed="0.000017"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:16:48.102510" elapsed="0.070358">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:48.173090" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:48.172949" elapsed="0.000198"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:48.173305" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:48.173169" elapsed="0.000184"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:48.173516" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:48.173375" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:48.172933" elapsed="0.000699"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:48.102175" elapsed="0.071502">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:48.101798" elapsed="0.071984">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:48.173835" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:16:48.093334" elapsed="0.080603">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:48.174122" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:48.174347" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:48.174200" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:48.174185" elapsed="0.000230"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:48.174540" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:48.174758" elapsed="0.000022"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:48.174824" elapsed="0.000015"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:16:48.091750" elapsed="0.083170">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:16:48.091215" elapsed="0.083767">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:16:48.090960" elapsed="0.084071">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:16:48.090161" elapsed="0.084952">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:48.175328" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:16:48.066973" elapsed="0.108462">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:16:49.195523" elapsed="0.000475"/>
</kw>
<msg time="2026-10-16T01:16:49.196118" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:49.194260" elapsed="0.001981"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:16:49.193318" elapsed="0.003083"/>
</kw>
<msg time="2026-10-16T01:16:49.196492" 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-10-16T01:16:49.186554" elapsed="0.010029"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:16:49.185483" elapsed="0.011360"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:49.197899" 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-10-16T01:16:49.197328" elapsed="0.000664"/>
</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-10-16T01:16:49.204835" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:49.204008" elapsed="0.000886"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:49.205906" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:49.205229" elapsed="0.000731"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:49.206058" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:16:49.206347" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:49.203173" elapsed="0.003224"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:16:49.206775" elapsed="0.000290"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:49.208162" 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-10-16T01:16:49.207441" elapsed="0.000776"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:49.209106" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:49.208540" elapsed="0.000618"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:49.210303" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:49.209638" elapsed="0.000719"/>
</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-10-16T01:16:49.218646" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:49.217797" elapsed="0.000989"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:49.218874" elapsed="0.000085"/>
</return>
<msg time="2026-10-16T01:16:49.219228" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:49.214402" elapsed="0.004905"/>
</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-10-16T01:16:49.242199" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:49.241764" elapsed="0.000473"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:16:49.243250" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:16:49.242946" elapsed="0.000405">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:49.243476" 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-10-16T01:16:49.242464" elapsed="0.001046"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:49.244083" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:49.243773" elapsed="0.000335"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:16:49.244394" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:16:49.244551" 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-10-16T01:16:49.244269" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:49.245023" 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-10-16T01:16:49.244798" elapsed="0.000267"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:49.246176" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:49.245764" elapsed="0.000454"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:16:49.246675" 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-10-16T01:16:49.246396" 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-10-16T01:16:49.247023" elapsed="0.000020"/>
</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-10-16T01:16:49.247206" elapsed="0.000022"/>
</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-10-16T01:16:49.247528" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:16:49.246891" elapsed="0.000693"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:16:49.246774" elapsed="0.000855"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:16:49.247674" elapsed="0.000050"/>
</return>
<msg time="2026-10-16T01:16:49.247839" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:16:49.245393" elapsed="0.002470"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:49.245134" elapsed="0.002757"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:49.248063" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:49.247917" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:49.245114" elapsed="0.003019"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:16:49.248718" 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-10-16T01:16:49.248288" elapsed="0.000457"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:16:49.248790" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:16:49.241029" elapsed="0.007860"/>
</kw>
<msg time="2026-10-16T01:16:49.248936" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:49.235162" elapsed="0.013820"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:49.252776" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:49.256537" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:49.260303" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:49.260480" elapsed="0.000020"/>
</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-10-16T01:16:49.260673" elapsed="0.000019"/>
</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-10-16T01:16:49.261025" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:49.260883" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:49.260869" elapsed="0.000228"/>
</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-10-16T01:16:49.261253" 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-10-16T01:16:49.261429" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:49.261587" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:16:49.260843" elapsed="0.000808"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:16:49.260753" elapsed="0.000967"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:49.261878" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:49.261947" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:49.262052" 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-10-16T01:16:49.234275" elapsed="0.027800"/>
</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-10-16T01:16:49.263184" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:49.262992" elapsed="0.000251">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:49.263326" 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-10-16T01:16:49.262644" elapsed="0.000704"/>
</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-10-16T01:16:49.263646" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:49.263411" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:16:49.264175" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:49.263912" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:49.263738" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:49.263394" elapsed="0.000857"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:49.264796" 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-10-16T01:16:49.264407" elapsed="0.000414"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:16:49.264867" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:16:49.264989" 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-manganese/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-10-16T01:16:49.262336" elapsed="0.002677"/>
</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-10-16T01:16:49.266097" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:49.265906" elapsed="0.000250">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:49.266239" 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-10-16T01:16:49.265551" elapsed="0.000711"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:16:49.266425" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:16:49.266325" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:49.266309" elapsed="0.000191"/>
</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-10-16T01:16:49.266662" 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-10-16T01:16:49.266852" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:49.266919" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:49.267043" 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-manganese/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-10-16T01:16:49.265256" elapsed="0.001810"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:49.268455" 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-10-16T01:16:49.268230" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:49.269054" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:49.268788" 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-10-16T01:16:49.273583" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:49.273713" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:49.273831" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:49.269446" elapsed="0.004758">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:49.269173" elapsed="0.005113">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:49.274468" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:49.274317" elapsed="0.000209"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:49.269153" elapsed="0.005395">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:49.274919" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:49.275039" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:49.275006" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:49.274990" elapsed="0.000107"/>
</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-10-16T01:16:49.275233" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:49.275295" elapsed="0.000013"/>
</return>
<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="FAIL" start="2026-10-16T01:16:49.267509" elapsed="0.007889">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:49.275469" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:16:49.224472" elapsed="0.051119">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:16:49.276043" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:49.275815" elapsed="0.000312"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:49.275761" elapsed="0.000406"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:49.276253" elapsed="0.000037"/>
</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="FAIL" start="2026-10-16T01:16:49.222208" elapsed="0.054213">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:49.219595" elapsed="0.056927">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:16:49.219568" elapsed="0.057027">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:49.276901" elapsed="0.000025"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:16:49.277268" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:49.277578" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:16:49.277989" elapsed="0.000024"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:16:49.278451" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:49.278818" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:49.279171" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:16:49.279407" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:16:49.213051" elapsed="0.066457">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:16:49.279570" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:16:49.211212" elapsed="0.068461">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:49.279935" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:49.279793" elapsed="0.000195"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:49.280148" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:49.280011" elapsed="0.000187"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:49.280370" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:49.280220" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:49.279775" elapsed="0.000667"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:49.210881" elapsed="0.069601">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:49.210450" elapsed="0.070086">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:49.280586" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:16:49.201658" elapsed="0.079175">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:49.281028" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:49.281248" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:49.281106" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:49.281091" elapsed="0.000226"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:49.281443" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:49.281635" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:49.281714" elapsed="0.000021"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:16:49.200043" elapsed="0.081782">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:16:49.199528" elapsed="0.082359">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:16:49.199276" elapsed="0.082666">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:16:49.198439" elapsed="0.083586">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:49.282274" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:16:49.176303" elapsed="0.106078">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:16:50.301832" elapsed="0.000414"/>
</kw>
<msg time="2026-10-16T01:16:50.302368" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:50.300491" elapsed="0.001998"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:16:50.299331" elapsed="0.003339"/>
</kw>
<msg time="2026-10-16T01:16:50.302795" 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-10-16T01:16:50.292752" elapsed="0.010134"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:16:50.291853" elapsed="0.011180"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:50.304117" 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-10-16T01:16:50.303535" elapsed="0.000674"/>
</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-10-16T01:16:50.310889" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:50.310096" elapsed="0.000850"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:50.311932" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:50.311277" elapsed="0.000709"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:50.312083" elapsed="0.000063"/>
</return>
<msg time="2026-10-16T01:16:50.312369" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:50.309240" elapsed="0.003180"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:16:50.312807" elapsed="0.000295"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:50.314197" 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-10-16T01:16:50.313467" elapsed="0.000785"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:50.315140" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:50.314574" elapsed="0.000618"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:50.316046" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:50.315497" elapsed="0.000602"/>
</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-10-16T01:16:50.325270" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:50.323884" elapsed="0.001495"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:50.325508" elapsed="0.000159"/>
</return>
<msg time="2026-10-16T01:16:50.326139" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:50.320260" elapsed="0.006009"/>
</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-10-16T01:16:50.349131" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:50.348686" elapsed="0.000481"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:16:50.350279" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:16:50.349966" elapsed="0.000413">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:50.350497" 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-10-16T01:16:50.349484" elapsed="0.001045"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:50.351243" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:50.350801" elapsed="0.000479"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:16:50.351682" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:16:50.352044" 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-10-16T01:16:50.351505" elapsed="0.000574"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:50.352678" 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-10-16T01:16:50.352349" elapsed="0.000409"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:50.356061" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:50.355735" elapsed="0.000384"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:16:50.356752" 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-10-16T01:16:50.356361" elapsed="0.000427"/>
</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-10-16T01:16:50.357282" elapsed="0.000031"/>
</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-10-16T01:16:50.357542" 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-10-16T01:16:50.357833" elapsed="0.000028"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:16:50.357001" elapsed="0.000905"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:16:50.356848" elapsed="0.001098"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:16:50.358003" elapsed="0.000037"/>
</return>
<msg time="2026-10-16T01:16:50.358184" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:16:50.355230" elapsed="0.002986"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:50.354870" elapsed="0.003386"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:50.358490" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:50.358290" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:50.352820" elapsed="0.005766"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:16:50.359368" 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-10-16T01:16:50.358835" elapsed="0.000570"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:16:50.359464" elapsed="0.000037"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:16:50.347976" elapsed="0.011641"/>
</kw>
<msg time="2026-10-16T01:16:50.359685" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:50.342314" elapsed="0.017456"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:50.365353" elapsed="0.000037"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:50.370808" elapsed="0.000037"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:50.376221" elapsed="0.000035"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:50.376476" elapsed="0.000028"/>
</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-10-16T01:16:50.376765" elapsed="0.000029"/>
</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-10-16T01:16:50.377247" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:50.377047" elapsed="0.000271"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:50.377027" elapsed="0.000323"/>
</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-10-16T01:16:50.377564" elapsed="0.000027"/>
</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-10-16T01:16:50.377847" elapsed="0.000027"/>
</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-10-16T01:16:50.378074" elapsed="0.000027"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:16:50.376990" elapsed="0.001152"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:16:50.376865" elapsed="0.001310"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:50.378384" elapsed="0.000026"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:50.378478" elapsed="0.000020"/>
</return>
<msg time="2026-10-16T01:16:50.378642" 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-10-16T01:16:50.341457" elapsed="0.037220"/>
</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-10-16T01:16:50.380244" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:50.379971" elapsed="0.000358">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:50.380444" 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-10-16T01:16:50.379471" elapsed="0.001006"/>
</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-10-16T01:16:50.380911" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:50.380565" elapsed="0.000419"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:16:50.381672" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:50.381285" elapsed="0.000440"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:50.381016" elapsed="0.000756"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:50.380541" elapsed="0.001259"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:50.382499" 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-10-16T01:16:50.382021" elapsed="0.000512"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:16:50.382596" elapsed="0.000057"/>
</return>
<msg time="2026-10-16T01:16:50.382814" 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-manganese/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-10-16T01:16:50.379055" elapsed="0.003791"/>
</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-10-16T01:16:50.384297" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:50.384098" elapsed="0.000258">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:50.384439" 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-10-16T01:16:50.383751" elapsed="0.000710"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:16:50.384828" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:16:50.384721" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:50.384508" elapsed="0.000399"/>
</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-10-16T01:16:50.385059" elapsed="0.000020"/>
</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-10-16T01:16:50.385231" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:50.385292" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:50.385418" 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-manganese/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-10-16T01:16:50.383237" elapsed="0.002205"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:50.386674" 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-10-16T01:16:50.386435" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:50.387135" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:50.386917" elapsed="0.000258"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:16:50.391652" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:50.391727" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:50.391839" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:50.387458" elapsed="0.004755">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:50.387234" elapsed="0.005058">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:50.392474" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:50.392324" elapsed="0.000208"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:50.387217" elapsed="0.005338">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:50.392924" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:50.393044" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:50.393011" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:50.392995" elapsed="0.000107"/>
</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-10-16T01:16:50.393238" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:50.393299" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:16:50.385746" elapsed="0.007656">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:50.393507" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:16:50.331736" elapsed="0.061919">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:16:50.394070" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:50.393848" elapsed="0.000304"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:50.393801" elapsed="0.000392"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:50.394276" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:16:50.329565" elapsed="0.064874">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:50.327017" elapsed="0.067522">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:16:50.326968" elapsed="0.067657">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:50.394889" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:16:50.395231" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:50.395541" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:16:50.395933" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:16:50.396363" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:50.396686" elapsed="0.000038"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:50.397049" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:16:50.397288" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:16:50.318849" elapsed="0.078539">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:16:50.397449" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:16:50.316966" elapsed="0.080571">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:50.397790" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:50.397629" elapsed="0.000213"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:50.398002" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:50.397864" elapsed="0.000187"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:50.398215" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:50.398073" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:50.397601" elapsed="0.000683"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:50.316564" elapsed="0.081759">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:50.316192" elapsed="0.082183">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:50.398423" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:16:50.307892" elapsed="0.090656">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:50.398865" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:50.399089" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:50.398947" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:50.398932" elapsed="0.000226"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:50.399284" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:50.399453" elapsed="0.000022"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:50.399517" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:16:50.306253" elapsed="0.093425">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:16:50.305788" elapsed="0.093969">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:16:50.305466" elapsed="0.094342">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:16:50.304686" elapsed="0.095203">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:50.400099" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:16:50.283244" elapsed="0.116959">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:16:51.419490" elapsed="0.000459"/>
</kw>
<msg time="2026-10-16T01:16:51.420064" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:51.418193" elapsed="0.001986"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:16:51.417239" elapsed="0.003099"/>
</kw>
<msg time="2026-10-16T01:16:51.420430" 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-10-16T01:16:51.410636" elapsed="0.009886"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:16:51.409782" elapsed="0.010947"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:51.421783" 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-10-16T01:16:51.421218" elapsed="0.000658"/>
</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-10-16T01:16:51.428530" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:51.427786" elapsed="0.000802"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:51.429756" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:51.429026" elapsed="0.000791"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:51.430017" elapsed="0.000067"/>
</return>
<msg time="2026-10-16T01:16:51.430324" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:51.426941" elapsed="0.003439"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:16:51.430761" elapsed="0.000297"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:51.432174" 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-10-16T01:16:51.431430" elapsed="0.000801"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:51.433127" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:51.432560" elapsed="0.000622"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:51.434064" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:51.433494" elapsed="0.000624"/>
</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-10-16T01:16:51.443166" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:51.441663" elapsed="0.001617"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:51.443413" elapsed="0.000133"/>
</return>
<msg time="2026-10-16T01:16:51.444309" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:51.438251" elapsed="0.006190"/>
</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-10-16T01:16:51.467537" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:51.467115" elapsed="0.000458"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:16:51.468628" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:16:51.468282" elapsed="0.000491">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:51.468918" 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-10-16T01:16:51.467827" elapsed="0.001129"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:51.469806" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:51.469265" elapsed="0.000579"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:16:51.470233" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:16:51.470427" 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-10-16T01:16:51.470072" elapsed="0.000388"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:51.471112" 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-10-16T01:16:51.470796" elapsed="0.000374"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:51.472639" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:51.472110" elapsed="0.000606"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:16:51.473321" 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-10-16T01:16:51.472964" elapsed="0.000391"/>
</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-10-16T01:16:51.473815" elapsed="0.000030"/>
</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-10-16T01:16:51.474072" elapsed="0.000032"/>
</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-10-16T01:16:51.474323" elapsed="0.000027"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:16:51.473567" elapsed="0.000827"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:16:51.473415" elapsed="0.001019"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:16:51.474490" elapsed="0.000037"/>
</return>
<msg time="2026-10-16T01:16:51.474768" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:16:51.471621" elapsed="0.003181"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:51.471255" elapsed="0.003587"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:51.475079" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:51.474877" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:51.471231" elapsed="0.003947"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:16:51.475988" 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-10-16T01:16:51.475392" elapsed="0.000631"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:16:51.476085" elapsed="0.000037"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:16:51.466380" elapsed="0.009844"/>
</kw>
<msg time="2026-10-16T01:16:51.476291" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:51.460504" elapsed="0.015851"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:51.481754" elapsed="0.000037"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:51.487053" elapsed="0.000035"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:51.492346" elapsed="0.000036"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:51.492596" elapsed="0.000051"/>
</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-10-16T01:16:51.492910" elapsed="0.000036"/>
</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-10-16T01:16:51.493397" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:51.493200" elapsed="0.000268"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:51.493181" elapsed="0.000318"/>
</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-10-16T01:16:51.493777" elapsed="0.000032"/>
</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-10-16T01:16:51.494042" elapsed="0.000026"/>
</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-10-16T01:16:51.494262" elapsed="0.000034"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:16:51.493145" elapsed="0.001192"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:16:51.493019" elapsed="0.001350"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:51.494573" elapsed="0.000045"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:51.494688" elapsed="0.000039"/>
</return>
<msg time="2026-10-16T01:16:51.494855" 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-10-16T01:16:51.459627" elapsed="0.035261"/>
</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-10-16T01:16:51.496377" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:51.496179" elapsed="0.000258">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:51.496521" 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-10-16T01:16:51.495847" elapsed="0.000697"/>
</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-10-16T01:16:51.496854" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:51.496620" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:16:51.497353" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:51.497091" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:51.496929" elapsed="0.000480"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:51.496590" elapsed="0.000838"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:51.497958" 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-10-16T01:16:51.497589" elapsed="0.000393"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:16:51.498028" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:16:51.498151" 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-manganese/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-10-16T01:16:51.495306" elapsed="0.002868"/>
</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-10-16T01:16:51.499251" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:51.499059" elapsed="0.000250">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:51.499393" 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-10-16T01:16:51.498742" elapsed="0.000674"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:16:51.499578" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-10-16T01:16:51.499479" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:51.499463" elapsed="0.000209"/>
</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-10-16T01:16:51.499835" elapsed="0.000020"/>
</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-10-16T01:16:51.500007" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:51.500066" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:51.500189" 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-manganese/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-10-16T01:16:51.498418" elapsed="0.001795"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:51.501628" 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-10-16T01:16:51.501391" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:51.502090" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:51.501870" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:16:51.506506" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:51.506565" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:51.506755" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:51.502410" elapsed="0.004711">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:51.502189" elapsed="0.005015">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:51.507384" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:51.507234" elapsed="0.000209"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:51.502173" elapsed="0.005292">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:51.507831" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:51.507952" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:51.507918" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:51.507902" elapsed="0.000109"/>
</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-10-16T01:16:51.508145" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:51.508208" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:16:51.500677" elapsed="0.007633">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:51.508378" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:16:51.449580" elapsed="0.058921">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:16:51.508958" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:51.508716" elapsed="0.000327"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:51.508649" elapsed="0.000434"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:51.509169" elapsed="0.000038"/>
</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="FAIL" start="2026-10-16T01:16:51.447333" elapsed="0.062005">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:51.444890" elapsed="0.064549">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:16:51.444859" elapsed="0.064653">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:51.509815" elapsed="0.000025"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:16:51.510164" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:51.510472" elapsed="0.000024"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:16:51.510902" elapsed="0.000025"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:16:51.511344" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:51.511679" elapsed="0.000057"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:51.512075" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:16:51.512364" elapsed="0.000019"/>
</return>
<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="FAIL" start="2026-10-16T01:16:51.436876" elapsed="0.075604">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:16:51.512544" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:16:51.434980" elapsed="0.077671">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:51.512959" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:51.512777" elapsed="0.000244"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:51.513191" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:51.513050" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:51.513407" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:51.513264" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:51.512753" elapsed="0.000722"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:51.434588" elapsed="0.078927">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:51.434213" elapsed="0.079359">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:51.513641" elapsed="0.000016"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:16:51.425514" elapsed="0.088376">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:51.514077" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:51.514299" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:51.514159" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:51.514143" elapsed="0.000225"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:51.514499" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:51.514692" elapsed="0.000044"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:51.514781" elapsed="0.000015"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:16:51.423875" elapsed="0.091002">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:16:51.423372" elapsed="0.091571">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:16:51.423124" elapsed="0.091869">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:16:51.422318" elapsed="0.092759">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:51.515295" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:16:51.401053" elapsed="0.114348">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:16:52.534404" elapsed="0.000464"/>
</kw>
<msg time="2026-10-16T01:16:52.534987" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:52.533154" elapsed="0.001954"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:16:52.532221" elapsed="0.003047"/>
</kw>
<msg time="2026-10-16T01:16:52.535359" 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-10-16T01:16:52.525728" elapsed="0.009718"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:16:52.524847" elapsed="0.010744"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:52.536692" 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-10-16T01:16:52.536146" elapsed="0.000667"/>
</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-10-16T01:16:52.543395" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:52.542622" elapsed="0.000830"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:52.544437" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:52.543836" elapsed="0.000655"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:52.544586" elapsed="0.000089"/>
</return>
<msg time="2026-10-16T01:16:52.544936" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:52.541793" elapsed="0.003194"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:16:52.545327" elapsed="0.000354"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:52.546843" 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-10-16T01:16:52.546111" elapsed="0.000794"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:52.547791" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:52.547230" elapsed="0.000615"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:52.548674" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:52.548156" elapsed="0.000601"/>
</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-10-16T01:16:52.557640" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:52.556184" elapsed="0.001623"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:52.557956" elapsed="0.000139"/>
</return>
<msg time="2026-10-16T01:16:52.558534" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:52.552863" elapsed="0.005828"/>
</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-10-16T01:16:52.583358" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:52.582916" elapsed="0.000478"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:16:52.584400" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:16:52.584102" elapsed="0.000398">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:52.584635" 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-10-16T01:16:52.583632" elapsed="0.001036"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:52.585461" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:52.585025" elapsed="0.000472"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:16:52.585929" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:16:52.586124" 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-10-16T01:16:52.585763" elapsed="0.000395"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:52.586779" 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-10-16T01:16:52.586423" elapsed="0.000415"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:52.588298" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:52.587782" elapsed="0.000573"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:16:52.588993" 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-10-16T01:16:52.588614" elapsed="0.000412"/>
</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-10-16T01:16:52.589424" elapsed="0.000028"/>
</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-10-16T01:16:52.589694" elapsed="0.000050"/>
</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-10-16T01:16:52.589966" elapsed="0.000026"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:16:52.589246" elapsed="0.000791"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:16:52.589089" elapsed="0.000987"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:16:52.590132" elapsed="0.000036"/>
</return>
<msg time="2026-10-16T01:16:52.590310" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:16:52.587276" elapsed="0.003066"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:52.586924" elapsed="0.003457"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:52.590630" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:52.590416" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:52.586900" elapsed="0.003848"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:16:52.591498" 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-10-16T01:16:52.590965" elapsed="0.000569"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:16:52.591611" elapsed="0.000038"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:16:52.582179" elapsed="0.009596"/>
</kw>
<msg time="2026-10-16T01:16:52.591843" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:52.576288" elapsed="0.015620"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:52.597306" elapsed="0.000036"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:52.602560" elapsed="0.000049"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:52.608029" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:52.608239" 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-10-16T01:16:52.608417" elapsed="0.000018"/>
</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-10-16T01:16:52.608782" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:52.608626" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:52.608612" elapsed="0.000245"/>
</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-10-16T01:16:52.609007" elapsed="0.000019"/>
</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-10-16T01:16:52.609181" elapsed="0.000018"/>
</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-10-16T01:16:52.609338" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:16:52.608572" elapsed="0.000814"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:16:52.608484" elapsed="0.000926"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:52.609560" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:52.609644" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:52.609762" 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-10-16T01:16:52.575414" elapsed="0.034371"/>
</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-10-16T01:16:52.610911" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:52.610707" elapsed="0.000264">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:52.611053" 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-10-16T01:16:52.610352" elapsed="0.000723"/>
</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-10-16T01:16:52.611350" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:52.611138" elapsed="0.000264"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:16:52.611895" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:52.611610" elapsed="0.000309"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:52.611424" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:52.611121" elapsed="0.000849"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:52.612461" 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-10-16T01:16:52.612127" elapsed="0.000358"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:16:52.612529" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:16:52.612672" 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-manganese/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-10-16T01:16:52.610046" elapsed="0.002662"/>
</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-10-16T01:16:52.613796" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:52.613566" elapsed="0.000290">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:52.613939" 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-10-16T01:16:52.613248" elapsed="0.000713"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:16:52.614159" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:16:52.614060" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:52.614042" elapsed="0.000193"/>
</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-10-16T01:16:52.614384" elapsed="0.000019"/>
</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-10-16T01:16:52.614553" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:52.614628" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:16:52.614768" 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-manganese/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-10-16T01:16:52.612954" elapsed="0.001837"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:52.616171" 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-10-16T01:16:52.615947" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:52.616636" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:52.616397" 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-10-16T01:16:52.620925" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:52.620978" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:52.621075" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:52.616974" elapsed="0.004479">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:52.616752" elapsed="0.004780">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:52.621748" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:52.621567" elapsed="0.000240"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:52.616735" elapsed="0.005094">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:52.622163" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:52.622281" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:52.622249" elapsed="0.000069"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:52.622233" elapsed="0.000105"/>
</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-10-16T01:16:52.622472" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:52.622534" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:16:52.615227" elapsed="0.007426">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:52.622738" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:16:52.565476" elapsed="0.057390">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:16:52.623257" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:52.623037" elapsed="0.000331"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:52.622988" elapsed="0.000421"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:52.623493" elapsed="0.000037"/>
</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="FAIL" start="2026-10-16T01:16:52.563096" elapsed="0.060581">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:52.559437" elapsed="0.064377">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:16:52.559391" elapsed="0.064501">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:52.624144" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:16:52.624489" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:52.624854" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:16:52.625201" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:16:52.625639" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:52.625972" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:52.626314" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:16:52.626551" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:16:52.551414" elapsed="0.075254">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:16:52.626760" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:16:52.549547" elapsed="0.077308">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:52.627075" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:52.626935" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:52.627284" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:52.627148" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:52.627511" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:52.627360" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:52.626920" elapsed="0.000706"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:52.549220" elapsed="0.078463">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:52.548852" elapsed="0.078949">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:52.627856" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:16:52.540384" elapsed="0.087566">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:52.628127" elapsed="0.000049"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:52.628385" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:52.628241" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:52.628224" elapsed="0.000230"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:52.628580" elapsed="0.000204"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:52.628972" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:52.629034" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:16:52.538800" elapsed="0.090330">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:16:52.538305" elapsed="0.090889">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:16:52.538055" elapsed="0.091187">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:16:52.537255" elapsed="0.092069">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:52.629535" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:16:52.516269" elapsed="0.113398">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:16:53.650335" elapsed="0.000523"/>
</kw>
<msg time="2026-10-16T01:16:53.650995" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:53.648941" elapsed="0.002185"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:16:53.647874" elapsed="0.003418"/>
</kw>
<msg time="2026-10-16T01:16:53.651384" 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-10-16T01:16:53.640942" elapsed="0.010532"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:16:53.639955" elapsed="0.011900"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:53.653027" 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-10-16T01:16:53.652361" elapsed="0.000776"/>
</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-10-16T01:16:53.659869" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:53.659038" elapsed="0.000888"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:53.661033" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:53.660259" elapsed="0.000843"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:53.661222" elapsed="0.000075"/>
</return>
<msg time="2026-10-16T01:16:53.661531" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:53.658200" elapsed="0.003381"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:16:53.661986" elapsed="0.000289"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:53.663488" 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-10-16T01:16:53.662662" elapsed="0.000883"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:53.664453" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:53.663940" elapsed="0.000568"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:53.665488" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:53.664903" elapsed="0.000641"/>
</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-10-16T01:16:53.674280" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:53.673113" elapsed="0.001234"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:53.674426" elapsed="0.000085"/>
</return>
<msg time="2026-10-16T01:16:53.674928" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:53.669776" elapsed="0.005234"/>
</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-10-16T01:16:53.697685" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:53.697218" elapsed="0.000523"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:16:53.698758" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:16:53.698400" elapsed="0.000491">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:53.699035" 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-10-16T01:16:53.697958" elapsed="0.001111"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:53.699788" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:53.699305" elapsed="0.000519"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:16:53.700216" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:16:53.700411" 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-10-16T01:16:53.700057" elapsed="0.000387"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:53.701129" 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-10-16T01:16:53.700798" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:53.704673" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:53.704287" elapsed="0.000467"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:16:53.705353" 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-10-16T01:16:53.704998" elapsed="0.000389"/>
</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-10-16T01:16:53.705839" elapsed="0.000030"/>
</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-10-16T01:16:53.706096" 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-10-16T01:16:53.706345" elapsed="0.000028"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:16:53.705632" elapsed="0.000785"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:16:53.705446" elapsed="0.001010"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:16:53.706514" elapsed="0.000036"/>
</return>
<msg time="2026-10-16T01:16:53.706731" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:16:53.703811" elapsed="0.002955"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:53.703406" elapsed="0.003402"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:53.707044" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:53.706842" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:53.701249" elapsed="0.005894"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:16:53.707943" 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-10-16T01:16:53.707358" elapsed="0.000667"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:16:53.708090" elapsed="0.000038"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:16:53.696480" elapsed="0.011752"/>
</kw>
<msg time="2026-10-16T01:16:53.708298" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:53.690660" elapsed="0.017702"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:53.713973" elapsed="0.000040"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:53.718902" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:53.722731" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:53.722910" elapsed="0.000020"/>
</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-10-16T01:16:53.723086" elapsed="0.000019"/>
</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-10-16T01:16:53.723422" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:53.723283" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:53.723270" elapsed="0.000225"/>
</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-10-16T01:16:53.723677" elapsed="0.000033"/>
</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-10-16T01:16:53.723872" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:53.724032" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:16:53.723243" elapsed="0.000837"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:16:53.723153" elapsed="0.000950"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:53.724250" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:53.724318" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:53.724423" 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-10-16T01:16:53.689829" elapsed="0.034617"/>
</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-10-16T01:16:53.725620" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:53.725404" elapsed="0.000277">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:53.725781" 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-10-16T01:16:53.725080" elapsed="0.000725"/>
</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-10-16T01:16:53.726083" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:53.725869" elapsed="0.000267"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:16:53.726582" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:53.726319" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:53.726158" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:53.725852" elapsed="0.000877"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:53.727233" 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-10-16T01:16:53.726888" elapsed="0.000369"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:16:53.727303" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:16:53.727426" 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-manganese/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-10-16T01:16:53.724746" elapsed="0.002703"/>
</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-10-16T01:16:53.728521" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:53.728333" elapsed="0.000247">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:53.728679" 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-10-16T01:16:53.728019" elapsed="0.000697"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:16:53.729047" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:16:53.728943" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:53.728765" elapsed="0.000360"/>
</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-10-16T01:16:53.729289" 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-10-16T01:16:53.729465" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:53.729526" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:53.729665" 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-manganese/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-10-16T01:16:53.727721" elapsed="0.001967"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:53.730941" 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-10-16T01:16:53.730714" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:53.731385" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:53.731168" elapsed="0.000257"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:16:53.735951" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:53.736006" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:53.736112" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:53.731758" elapsed="0.004722">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:53.731485" elapsed="0.005128">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:53.736830" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:53.736653" elapsed="0.000236"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:53.731468" elapsed="0.005443">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:53.737251" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:53.737371" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:53.737338" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:53.737322" elapsed="0.000108"/>
</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-10-16T01:16:53.737564" elapsed="0.000064"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:53.737676" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:16:53.729989" elapsed="0.007807">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:53.737864" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:16:53.680036" elapsed="0.057952">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:16:53.738373" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:53.738152" elapsed="0.000302"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:53.738105" elapsed="0.000390"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:53.738577" elapsed="0.000051"/>
</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="FAIL" start="2026-10-16T01:16:53.677727" elapsed="0.061051">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:53.675301" elapsed="0.063577">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:16:53.675272" elapsed="0.063679">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:53.739195" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:16:53.739536" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:53.739889" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:16:53.740237" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:16:53.740689" elapsed="0.000045"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:53.741026" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:53.741374" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:16:53.741625" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:16:53.668263" elapsed="0.073497">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:16:53.741857" elapsed="0.000017"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:16:53.666390" elapsed="0.075560">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:53.742169" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:53.742030" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:53.742378" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:53.742241" elapsed="0.000186"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:53.742609" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:53.742449" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:53.742015" elapsed="0.000677"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:53.666063" elapsed="0.076687">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:53.665661" elapsed="0.077143">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:53.742852" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:16:53.656853" elapsed="0.086090">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:53.743117" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:53.743334" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:53.743195" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:53.743179" elapsed="0.000223"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:53.743525" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:53.743826" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:53.743889" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:16:53.655230" elapsed="0.088751">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:16:53.654689" elapsed="0.089353">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:16:53.654393" elapsed="0.089697">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:16:53.653611" elapsed="0.090557">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:53.744376" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:16:53.630574" elapsed="0.113907">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:16:54.764037" elapsed="0.000411"/>
</kw>
<msg time="2026-10-16T01:16:54.764568" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:54.762773" elapsed="0.002070"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:16:54.761831" elapsed="0.003184"/>
</kw>
<msg time="2026-10-16T01:16:54.765107" 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-10-16T01:16:54.755101" elapsed="0.010097"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:16:54.754205" elapsed="0.011142"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:54.766407" 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-10-16T01:16:54.765886" elapsed="0.000614"/>
</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-10-16T01:16:54.773435" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:54.772636" elapsed="0.000856"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:54.774501" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:54.773889" elapsed="0.000666"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:54.774676" elapsed="0.000093"/>
</return>
<msg time="2026-10-16T01:16:54.775003" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:54.771548" elapsed="0.003506"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:16:54.775394" elapsed="0.000345"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:54.776872" 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-10-16T01:16:54.776133" elapsed="0.000797"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:54.777835" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:54.777257" elapsed="0.000632"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:54.778757" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:54.778197" elapsed="0.000615"/>
</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-10-16T01:16:54.787926" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:54.786269" elapsed="0.001774"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:54.788170" elapsed="0.000134"/>
</return>
<msg time="2026-10-16T01:16:54.788990" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:54.782977" elapsed="0.006143"/>
</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-10-16T01:16:54.818947" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:54.818474" elapsed="0.000509"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:16:54.820054" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:16:54.819674" elapsed="0.000506">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:54.820301" 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-10-16T01:16:54.819199" elapsed="0.001133"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:54.821048" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:54.820566" elapsed="0.000517"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:16:54.821471" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:16:54.821750" 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-10-16T01:16:54.821309" elapsed="0.000476"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:54.822366" 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-10-16T01:16:54.822053" elapsed="0.000371"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:54.823955" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:54.823387" elapsed="0.000627"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:16:54.824644" 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-10-16T01:16:54.824260" elapsed="0.000429"/>
</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-10-16T01:16:54.825110" elapsed="0.000028"/>
</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-10-16T01:16:54.825365" 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-10-16T01:16:54.825632" elapsed="0.000028"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:16:54.824930" elapsed="0.000793"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:16:54.824773" elapsed="0.000993"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:16:54.825824" elapsed="0.000036"/>
</return>
<msg time="2026-10-16T01:16:54.826006" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:16:54.822904" elapsed="0.003134"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:54.822509" elapsed="0.003568"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:54.826314" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:54.826112" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:54.822485" elapsed="0.003934"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:16:54.827252" 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-10-16T01:16:54.826684" elapsed="0.000604"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:16:54.827349" elapsed="0.000036"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:16:54.817780" elapsed="0.009705"/>
</kw>
<msg time="2026-10-16T01:16:54.827550" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:54.812000" elapsed="0.015635"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:54.833036" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:54.836980" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:54.840951" elapsed="0.000035"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:54.841214" 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-10-16T01:16:54.841400" elapsed="0.000019"/>
</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-10-16T01:16:54.841795" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:54.841636" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:54.841621" 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-10-16T01:16:54.842027" elapsed="0.000019"/>
</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-10-16T01:16:54.842202" elapsed="0.000018"/>
</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-10-16T01:16:54.842362" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:16:54.841576" elapsed="0.000834"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:16:54.841472" elapsed="0.000963"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:54.842599" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:54.842670" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:16:54.842802" 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-10-16T01:16:54.811119" elapsed="0.031708"/>
</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-10-16T01:16:54.844035" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:54.843808" elapsed="0.000296">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:54.844187" 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-10-16T01:16:54.843421" 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-10-16T01:16:54.844496" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:54.844273" elapsed="0.000274"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:16:54.845040" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:16:54.844775" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-16T01:16:54.844570" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:54.844256" elapsed="0.000859"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:54.845621" 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-10-16T01:16:54.845271" elapsed="0.000375"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:16:54.845691" elapsed="0.000042"/>
</return>
<msg time="2026-10-16T01:16:54.845831" 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-manganese/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-10-16T01:16:54.843103" elapsed="0.002751"/>
</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-10-16T01:16:54.846933" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:16:54.846737" elapsed="0.000254">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:16:54.847075" 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-10-16T01:16:54.846392" elapsed="0.000706"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:16:54.847267" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:16:54.847168" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:54.847151" elapsed="0.000192"/>
</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-10-16T01:16:54.847496" elapsed="0.000020"/>
</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-10-16T01:16:54.847729" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:54.847791" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:16:54.847918" 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-manganese/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-10-16T01:16:54.846098" elapsed="0.001843"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:54.849410" 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-10-16T01:16:54.849180" elapsed="0.000273"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:54.849887" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:54.849652" elapsed="0.000275"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:16:54.854238" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:54.854298" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:54.854396" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:54.850209" elapsed="0.004602">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:54.849987" elapsed="0.004911">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:54.855078" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:54.854928" elapsed="0.000208"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:54.849970" elapsed="0.005187">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:16:54.855495" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:54.855630" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:54.855581" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:54.855565" 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-10-16T01:16:54.855842" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:54.855905" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:16:54.848401" elapsed="0.007606">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:54.856075" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:16:54.797249" elapsed="0.058966">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:16:54.856625" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:54.856385" elapsed="0.000348"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:54.856337" elapsed="0.000439"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:54.856860" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:16:54.793694" elapsed="0.063364">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:54.789605" elapsed="0.067557">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:16:54.789537" elapsed="0.067699">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:54.857490" elapsed="0.000027"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:16:54.857875" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:54.858188" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:16:54.858538" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:16:54.858999" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:54.859317" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:16:54.859733" elapsed="0.000022"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:16:54.859985" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:16:54.781520" elapsed="0.078568">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:16:54.860152" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:16:54.779635" elapsed="0.080608">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:54.860464" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:54.860324" elapsed="0.000195"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:54.860723" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:54.860542" elapsed="0.000234"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:54.860940" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:54.860798" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:54.860308" elapsed="0.000699"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:54.779282" elapsed="0.081764">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:54.778907" elapsed="0.082194">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:54.861150" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:16:54.770173" elapsed="0.091069">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:54.861416" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:54.861658" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:54.861494" elapsed="0.000331"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:54.861479" elapsed="0.000370"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:54.862012" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:54.862184" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:16:54.862241" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:16:54.768517" elapsed="0.093819">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:16:54.768070" elapsed="0.094329">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:16:54.767816" elapsed="0.094633">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:16:54.766998" elapsed="0.095535">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:54.862798" elapsed="0.000028"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:16:54.745237" elapsed="0.117674">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<msg time="2026-10-16T01:16:54.862993" level="FAIL">Keyword 'Check Ovsdb Shards Status' failed after retrying for 1 minute 30 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<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="FAIL" start="2026-10-16T01:15:24.712596" elapsed="90.150485">Keyword 'Check Ovsdb Shards Status' failed after retrying for 1 minute 30 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<doc>Check Shard Status after some cluster event.</doc>
<status status="FAIL" start="2026-10-16T01:15:24.712217" elapsed="90.150960">Keyword 'Check Ovsdb Shards Status' failed after retrying for 1 minute 30 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<doc>Create original cluster list and check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:15:24.299018" elapsed="90.564298">Keyword 'Check Ovsdb Shards Status' failed after retrying for 1 minute 30 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:16:54.865131" elapsed="0.000211"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:16:54.864875" 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-10-16T01:16:54.866506" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:54.866243" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:54.866226" elapsed="0.000348"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:16:54.868507" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:54.868418" elapsed="0.000131"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:54.868402" elapsed="0.000167"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:54.869568" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:54.869244" elapsed="0.000364"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:54.870044" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:54.869774" elapsed="0.000294"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:54.870109" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:16:54.870235" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:54.868857" elapsed="0.001400"/>
</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-10-16T01:16:54.872897" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:54.872811" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:54.872792" 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-10-16T01:16:54.874115" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:54.874032" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:54.874016" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:16:54.874552" 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-10-16T01:16:54.874320" elapsed="0.000257"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:16:54.874986" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:16:54.874795" elapsed="0.000215"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:16:54.911051" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:16:54.875576" elapsed="0.035655"/>
</kw>
<msg time="2026-10-16T01:16:54.911399" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:16:54.911441" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:16:54.875165" elapsed="0.036312"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:16:54.995336" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:16:54.912146" elapsed="0.083364"/>
</kw>
<msg time="2026-10-16T01:16:54.995778" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:16:54.995820" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:16:54.911660" elapsed="0.084194"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:54.996138" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:54.995929" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:54.995910" elapsed="0.000323"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:54.996799" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:16:54.996418" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:54.997136" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:54.996940" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:54.996924" elapsed="0.000304"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:16:54.997259" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:54.999918" elapsed="0.000481"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:16:55.001647" elapsed="0.000499"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:16:55.003483" elapsed="0.000379"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:16:54.998080" elapsed="0.005851"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:16:54.997543" elapsed="0.006504"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:16:54.873774" elapsed="0.130351"/>
</kw>
<msg time="2026-10-16T01:16:55.004209" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:16:55.004248" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:16:54.873145" elapsed="0.131139"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:16:55.004439" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:16:55.004354" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:55.004337" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:16:55.004996" 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-10-16T01:16:55.005296" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:16:55.005360" 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-10-16T01:16:54.872443" elapsed="0.133003"/>
</kw>
<msg time="2026-10-16T01:16:55.005528" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:16:55.005567" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:16:54.870597" elapsed="0.135027"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:55.005932" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:55.005693" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:55.005678" elapsed="0.000326"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:16:54.870444" elapsed="0.135581"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:16:55.008459" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:55.008372" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:55.008355" elapsed="0.000167"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:16:55.009629" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:55.009529" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:55.009513" elapsed="0.000178"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:16:55.010078" 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-10-16T01:16:55.009854" elapsed="0.000249"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:16:55.010431" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:16:55.010260" elapsed="0.000195"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:16:55.048041" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:16:55.011053" elapsed="0.037192"/>
</kw>
<msg time="2026-10-16T01:16:55.048425" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:16:55.048467" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:16:55.010621" elapsed="0.037882"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:16:55.124876" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:16:55.049256" elapsed="0.075841"/>
</kw>
<msg time="2026-10-16T01:16:55.125278" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:16:55.125321" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:16:55.048774" elapsed="0.076580"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:55.125734" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:55.125441" elapsed="0.000367"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:55.125417" elapsed="0.000418"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:55.126378" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:16:55.126015" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:55.126756" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:55.126519" elapsed="0.000386"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:55.126503" elapsed="0.000427"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:16:55.126966" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:55.129808" elapsed="0.000486"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:16:55.131535" elapsed="0.000778"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:16:55.133564" elapsed="0.000418"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:16:55.127899" elapsed="0.006152"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:16:55.127288" elapsed="0.006881"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:16:55.009273" elapsed="0.124974"/>
</kw>
<msg time="2026-10-16T01:16:55.134330" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:16:55.134370" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:16:55.008683" elapsed="0.125723"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:16:55.134559" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-10-16T01:16:55.134475" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:55.134458" elapsed="0.000196"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:16:55.135023" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:55.135326" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:16:55.135391" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:16:55.008080" elapsed="0.127394"/>
</kw>
<msg time="2026-10-16T01:16:55.135558" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:16:55.135616" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:16:55.006272" elapsed="0.129389"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:55.136271" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:55.136052" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:55.136034" elapsed="0.000308"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:16:55.006136" elapsed="0.130227"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:16:55.139009" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:55.138922" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:55.138905" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:16:55.140197" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:55.140112" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:55.140096" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:16:55.140650" 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-10-16T01:16:55.140399" elapsed="0.000275"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:16:55.141025" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:16:55.140850" elapsed="0.000199"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:16:55.181834" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:16:55.141629" elapsed="0.040377"/>
</kw>
<msg time="2026-10-16T01:16:55.182169" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:16:55.182210" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:16:55.141200" elapsed="0.041043"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:16:55.276886" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:16:55.182993" elapsed="0.094146"/>
</kw>
<msg time="2026-10-16T01:16:55.277383" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:16:55.277440" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:16:55.182448" elapsed="0.095043"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:55.278016" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:55.277638" elapsed="0.000472"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:55.277580" elapsed="0.000562"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:55.278964" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:16:55.278398" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:55.279418" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:55.279154" elapsed="0.000353"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:55.279132" elapsed="0.000406"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:16:55.279601" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:55.282532" 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-10-16T01:16:55.284345" elapsed="0.000529"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:16:55.286101" elapsed="0.000538"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:16:55.280790" elapsed="0.006194"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:16:55.280054" elapsed="0.007056"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:16:55.139855" elapsed="0.147336"/>
</kw>
<msg time="2026-10-16T01:16:55.287276" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:16:55.287316" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:16:55.139215" elapsed="0.148136"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:16:55.287506" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-16T01:16:55.287421" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:55.287404" 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-10-16T01:16:55.287974" 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-10-16T01:16:55.288287" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:16:55.288352" 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-10-16T01:16:55.138542" elapsed="0.149896"/>
</kw>
<msg time="2026-10-16T01:16:55.288524" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:16:55.288565" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:16:55.136716" elapsed="0.151902"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:55.288986" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:55.288688" elapsed="0.000403"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:55.288672" elapsed="0.000446"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:16:55.136480" elapsed="0.152661"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:16:54.870303" elapsed="0.418871"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:16:54.868126" elapsed="0.421107"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:16:54.865988" elapsed="0.423299"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:16:54.865541" elapsed="0.423791"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:16:54.864444" elapsed="0.424940"/>
</kw>
<kw name="Get Ovsdb Entity Owner Status For One Device" owner="ClusterOvsdb">
<msg time="2026-10-16T01:16:55.293211" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:16:55.291998" elapsed="0.001250">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${new_owner}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:55.293448" elapsed="0.000020"/>
</kw>
<doc>Check Entity Owner Status and identify owner and candidate.</doc>
<status status="FAIL" start="2026-10-16T01:16:54.863822" elapsed="0.429797">Variable '${ovsdb_uuid}' not found.</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-10-16T01:16:55.295179" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:16:55.294934" elapsed="0.000499"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:16:55.296346" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:55.296254" elapsed="0.000135"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:55.296237" elapsed="0.000173"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:16:55.298294" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:55.298213" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:55.298196" elapsed="0.000160"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:16:55.299266" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:55.298941" elapsed="0.000351"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:55.299736" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:55.299439" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:55.299871" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:16:55.299998" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:55.298557" elapsed="0.001464"/>
</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-10-16T01:16:55.302618" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:55.302516" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:55.302499" elapsed="0.000182"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:16:55.303800" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:55.303713" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:55.303679" elapsed="0.000183"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:16:55.304235" 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-10-16T01:16:55.304005" elapsed="0.000257"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:16:55.304642" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:16:55.304440" elapsed="0.000228"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:16:55.340520" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:16:55.305271" elapsed="0.035454"/>
</kw>
<msg time="2026-10-16T01:16:55.340897" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:16:55.340939" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:16:55.304853" elapsed="0.036161"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:16:55.447924" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:16:55.341621" elapsed="0.106479"/>
</kw>
<msg time="2026-10-16T01:16:55.448254" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:16:55.448295" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:16:55.341181" elapsed="0.107150"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:55.448613" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:55.448400" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:55.448381" elapsed="0.000347"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:55.449253" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:16:55.448915" elapsed="0.000420"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:55.449608" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:55.449394" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:55.449378" elapsed="0.000346"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:16:55.449756" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:55.452205" 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-10-16T01:16:55.453930" elapsed="0.000446"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:16:55.455565" elapsed="0.000551"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:16:55.450520" elapsed="0.005661"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:16:55.450033" elapsed="0.006261"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:16:55.303413" elapsed="0.152957"/>
</kw>
<msg time="2026-10-16T01:16:55.456451" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:16:55.456491" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:16:55.302842" elapsed="0.153684"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:16:55.456692" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-10-16T01:16:55.456606" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:55.456576" 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-10-16T01:16:55.457094" 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-10-16T01:16:55.457390" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:16:55.457455" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:16:55.302227" elapsed="0.155315"/>
</kw>
<msg time="2026-10-16T01:16:55.457666" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:16:55.457793" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:16:55.300360" elapsed="0.157498"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:55.458142" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:55.457927" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:55.457911" elapsed="0.000339"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:16:55.300217" elapsed="0.158055"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:16:55.460801" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:55.460713" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:55.460678" elapsed="0.000186"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:16:55.461957" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:55.461874" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:55.461858" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:16:55.462380" 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-10-16T01:16:55.462159" elapsed="0.000247"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:16:55.462806" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:16:55.462565" elapsed="0.000268"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:16:55.502166" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:16:55.463429" elapsed="0.038913"/>
</kw>
<msg time="2026-10-16T01:16:55.502498" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:16:55.502540" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:16:55.462992" elapsed="0.039584"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:16:55.600221" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:16:55.503204" elapsed="0.097193"/>
</kw>
<msg time="2026-10-16T01:16:55.600552" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:16:55.600635" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:16:55.502782" elapsed="0.097896"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:55.600998" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:55.600776" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:55.600755" elapsed="0.000343"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:55.601629" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:16:55.601279" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:55.601984" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:55.601790" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:55.601773" elapsed="0.000303"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:16:55.602109" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:55.604637" 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-10-16T01:16:55.606377" elapsed="0.000499"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:16:55.608229" elapsed="0.000306"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:16:55.602956" elapsed="0.005670"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:16:55.602417" elapsed="0.006343"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:16:55.461598" elapsed="0.147239"/>
</kw>
<msg time="2026-10-16T01:16:55.608966" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:16:55.609006" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:16:55.461012" elapsed="0.148029"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:16:55.609204" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:16:55.609111" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:55.609094" elapsed="0.000189"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:16:55.609622" 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-10-16T01:16:55.610020" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:16:55.610086" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:16:55.460388" elapsed="0.149785"/>
</kw>
<msg time="2026-10-16T01:16:55.610259" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:16:55.610300" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:16:55.458520" elapsed="0.151816"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:55.610636" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:55.610405" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:55.610389" elapsed="0.000334"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:16:55.458385" elapsed="0.152360"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:16:55.614938" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:55.614852" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:55.614834" elapsed="0.000168"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:16:55.616113" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:55.616028" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:55.616012" elapsed="0.000165"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:16:55.616546" 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-10-16T01:16:55.616319" elapsed="0.000252"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:16:55.616952" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:16:55.616777" elapsed="0.000199"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:16:55.653914" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:16:55.617539" elapsed="0.036550"/>
</kw>
<msg time="2026-10-16T01:16:55.654244" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:16:55.654284" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:16:55.617129" elapsed="0.037190"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:16:55.737368" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:16:55.654956" elapsed="0.082678"/>
</kw>
<msg time="2026-10-16T01:16:55.737850" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:16:55.737892" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:16:55.654479" elapsed="0.083447"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:55.738283" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:55.738035" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:55.738003" elapsed="0.000440"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:55.739066" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:16:55.738648" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:55.739413" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:55.739204" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:55.739188" elapsed="0.000318"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:16:55.739540" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:55.742149" elapsed="0.000497"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:16:55.743932" elapsed="0.000475"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:16:55.745624" 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-10-16T01:16:55.740420" elapsed="0.005625"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:16:55.739899" elapsed="0.006264"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:16:55.615768" elapsed="0.130473"/>
</kw>
<msg time="2026-10-16T01:16:55.746326" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:16:55.746365" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:16:55.615150" elapsed="0.131250"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:16:55.746553" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:16:55.746468" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:55.746451" elapsed="0.000195"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:16:55.747268" 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-10-16T01:16:55.747574" elapsed="0.000038"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:16:55.747654" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:16:55.614515" elapsed="0.133243"/>
</kw>
<msg time="2026-10-16T01:16:55.747845" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:16:55.747884" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:16:55.611000" elapsed="0.136921"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:55.748213" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:55.747990" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:55.747974" elapsed="0.000309"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:16:55.610863" elapsed="0.137442"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:16:55.300070" elapsed="0.448266"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:16:55.297924" elapsed="0.450468"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:16:55.295996" elapsed="0.452448"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:16:55.295576" elapsed="0.452911"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:16:55.294542" elapsed="0.453996"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:16:55.752225" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:55.751956" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:55.751939" elapsed="0.000363"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:16:55.752652" 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-10-16T01:16:55.752763" 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-10-16T01:16:55.752504" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:55.753258" level="INFO">Attempting to execute command "sudo ovs-vsctl add-br br-s1" on remote system "10.30.171.104" 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-10-16T01:16:55.752973" elapsed="0.000326"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:16:55.753821" level="INFO">${conn_id} = 143</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-10-16T01:16:55.753472" elapsed="0.000373"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:16:55.754691" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:16:55.754777" 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-10-16T01:16:55.754388" elapsed="0.000411"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:55.754946" elapsed="0.000303"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:16:55.756070" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:16:56.459533" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:16:56 UTC 2026

  System load:  0.04               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:15:21 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:16:55.755833" elapsed="0.703903"/>
</kw>
<msg time="2026-10-16T01:16:56.459839" 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-10-16T01:16:55.755412" elapsed="0.704526"/>
</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-10-16T01:16:55.754039" elapsed="0.706039"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:16:56.460766" level="INFO">Executing command 'sudo ovs-vsctl add-br br-s1'.</msg>
<msg time="2026-10-16T01:16:56.514384" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:16:56.514770" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:16:56.514862" 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-10-16T01:16:56.460436" elapsed="0.054475"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:16:56.515360" elapsed="0.000548"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:56.517073" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:56.516409" elapsed="0.000751"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:16:56.517555" elapsed="0.000068"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:56.517316" elapsed="0.000375"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:56.517272" 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-10-16T01:16:56.518071" elapsed="0.000060"/>
</return>
<status status="PASS" start="2026-10-16T01:16:56.517884" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-10-16T01:16:56.517852" elapsed="0.000396"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:16:56.518318" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:16:56.519950" elapsed="0.000662"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:16:56.521050" elapsed="0.000314"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:16:56.521733" elapsed="0.000201"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:16:56.519017" elapsed="0.003023"/>
</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-10-16T01:16:55.751507" elapsed="0.770800"/>
</kw>
<msg time="2026-10-16T01:16:56.522417" 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-10-16T01:16:55.750994" elapsed="0.771526"/>
</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-10-16T01:16:55.750552" elapsed="0.772183"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:16:56.523885" 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-10-16T01:16:56.523169" elapsed="0.000771"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:16:56.525036" 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-10-16T01:16:56.524362" elapsed="0.000729"/>
</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-10-16T01:16:56.535219" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:56.534434" elapsed="0.000841"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:56.536256" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:56.535622" elapsed="0.000687"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:56.536400" elapsed="0.000059"/>
</return>
<msg time="2026-10-16T01:16:56.536739" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:56.533620" elapsed="0.003173"/>
</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-10-16T01:16:56.542645" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:56.542015" elapsed="0.000713"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:56.542824" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:16:56.543096" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:56.541251" elapsed="0.001896"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:56.545044" 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-10-16T01:16:56.544733" elapsed="0.000369"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:56.545672" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:56.545356" 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-10-16T01:16:56.552314" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:56.552389" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:56.552531" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:16:56.546147" elapsed="0.006963">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:56.545833" elapsed="0.007384">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:16:56.553471" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:56.553261" elapsed="0.000289"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:56.545810" elapsed="0.007877">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:16:56.554201" elapsed="0.000033"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:56.554366" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:56.554320" elapsed="0.000099"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:56.554299" elapsed="0.000148"/>
</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-10-16T01:16:56.554655" elapsed="0.000028"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:56.554764" 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-10-16T01:16:56.543858" elapsed="0.011044">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:56.554976" elapsed="0.000019"/>
</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-10-16T01:16:56.540289" elapsed="0.014803">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:16:56.555380" elapsed="0.000031"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:56.537158" elapsed="0.018319">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:56.536903" elapsed="0.018646">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:16:56.532368" elapsed="0.023317">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:16:57.566339" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:57.565381" elapsed="0.001030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:57.567628" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:57.566903" elapsed="0.000784"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:57.567822" elapsed="0.000079"/>
</return>
<msg time="2026-10-16T01:16:57.568155" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:57.564451" elapsed="0.003767"/>
</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-10-16T01:16:57.574810" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:57.574101" elapsed="0.000768"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:57.574969" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:16:57.575260" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:57.573284" elapsed="0.002031"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:57.578319" 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-10-16T01:16:57.577813" elapsed="0.000600"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:57.579360" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:57.578868" elapsed="0.000581"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:16:57.586823" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:57.586943" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:57.587248" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:16:57.580154" elapsed="0.007921">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:57.579613" elapsed="0.008627">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:16:57.588685" elapsed="0.000081"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:57.588314" elapsed="0.000540"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:57.579551" elapsed="0.009353">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:16:57.589724" elapsed="0.000055"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:57.589994" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:57.589919" elapsed="0.000163"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:57.589884" elapsed="0.000243"/>
</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-10-16T01:16:57.590427" elapsed="0.000042"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:57.590563" elapsed="0.000051"/>
</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-10-16T01:16:57.576260" elapsed="0.014567">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:57.590947" elapsed="0.000031"/>
</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-10-16T01:16:57.572214" elapsed="0.018920">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:16:57.591609" elapsed="0.000049"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:57.568689" elapsed="0.023101">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:57.568355" elapsed="0.023552">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:16:57.563076" elapsed="0.029015">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:16:58.601964" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:58.601010" elapsed="0.001020"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:58.603070" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:58.602385" elapsed="0.000739"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:58.603223" elapsed="0.000079"/>
</return>
<msg time="2026-10-16T01:16:58.603541" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:58.600145" elapsed="0.003470"/>
</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-10-16T01:16:58.609807" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:58.609126" elapsed="0.000738"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:58.609960" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:16:58.610237" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:58.608354" elapsed="0.001936"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:58.613120" 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-10-16T01:16:58.612544" elapsed="0.000672"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:58.614436" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:58.613780" elapsed="0.000845"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:16:58.622135" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:58.622269" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:58.622493" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:16:58.615388" elapsed="0.007931">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:58.614861" elapsed="0.008627">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:16:58.623968" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:58.623560" elapsed="0.000545"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:58.614814" elapsed="0.009342">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:16:58.624960" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:58.625227" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:58.625155" elapsed="0.000155"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:58.625119" 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-10-16T01:16:58.625687" elapsed="0.000091"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:58.625891" 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-10-16T01:16:58.611115" elapsed="0.014995">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:58.626229" elapsed="0.000031"/>
</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-10-16T01:16:58.607371" elapsed="0.019046">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:16:58.626934" elapsed="0.000050"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:58.604028" elapsed="0.023063">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:58.603762" elapsed="0.023446">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:16:58.598837" elapsed="0.028556">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:16:59.637327" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:16:59.636416" elapsed="0.000977"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:16:59.638420" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:16:59.637795" elapsed="0.000679"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:16:59.638597" elapsed="0.000077"/>
</return>
<msg time="2026-10-16T01:16:59.638948" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:16:59.635539" elapsed="0.003460"/>
</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-10-16T01:16:59.645423" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:16:59.644804" elapsed="0.000676"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:16:59.645607" elapsed="0.000063"/>
</return>
<msg time="2026-10-16T01:16:59.645930" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:16:59.643988" elapsed="0.001997"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:59.648833" 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-10-16T01:16:59.648268" elapsed="0.000662"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:16:59.649886" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:16:59.649342" elapsed="0.000635"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:16:59.657334" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:16:59.657466" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:16:59.657735" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:16:59.650746" elapsed="0.007769">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:16:59.650123" elapsed="0.008714">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:16:59.659267" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:16:59.658923" elapsed="0.000475"/>
</branch>
<status status="FAIL" start="2026-10-16T01:16:59.650082" elapsed="0.009366">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:16:59.660298" elapsed="0.000076"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:59.660636" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:16:59.660528" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:16:59.660491" 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-10-16T01:16:59.661116" elapsed="0.000046"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:16:59.661256" elapsed="0.000030"/>
</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-10-16T01:16:59.646788" elapsed="0.014719">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:16:59.661665" elapsed="0.000064"/>
</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-10-16T01:16:59.642995" elapsed="0.018903">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:16:59.662398" elapsed="0.000051"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:16:59.639505" elapsed="0.023055">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:16:59.639237" elapsed="0.023497">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:16:59.634246" elapsed="0.028767">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:00.673410" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:17:00.672475" elapsed="0.001004"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:17:00.674733" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:17:00.673993" elapsed="0.000800"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:17:00.674896" elapsed="0.000078"/>
</return>
<msg time="2026-10-16T01:17:00.675216" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:17:00.671606" elapsed="0.003662"/>
</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-10-16T01:17:00.681457" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:17:00.680634" elapsed="0.000902"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:17:00.681735" elapsed="0.000090"/>
</return>
<msg time="2026-10-16T01:17:00.682143" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:17:00.679856" elapsed="0.002366"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:00.685691" 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-10-16T01:17:00.684905" elapsed="0.000957"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:00.687238" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:17:00.686481" elapsed="0.000887"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:17:00.697941" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:17:00.698065" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:17:00.698288" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:17:00.688409" elapsed="0.010753">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:17:00.687603" elapsed="0.011743">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:00.699821" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:00.699419" elapsed="0.000542"/>
</branch>
<status status="FAIL" start="2026-10-16T01:17:00.687516" elapsed="0.012496">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:00.700856" elapsed="0.000060"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:00.701149" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:00.701072" elapsed="0.000164"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:17:00.701032" elapsed="0.000250"/>
</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-10-16T01:17:00.701616" elapsed="0.000047"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:17:00.701797" 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-10-16T01:17:00.683088" elapsed="0.018932">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:00.702270" 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-10-16T01:17:00.678878" elapsed="0.023599">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:00.703010" elapsed="0.000052"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:17:00.675683" elapsed="0.027487">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:17:00.675387" elapsed="0.027903">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:17:00.670207" elapsed="0.033269">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:01.713413" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:17:01.712516" elapsed="0.000961"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:17:01.714541" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:17:01.713877" elapsed="0.000744"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:17:01.714749" elapsed="0.000073"/>
</return>
<msg time="2026-10-16T01:17:01.715058" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:17:01.711672" elapsed="0.003437"/>
</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-10-16T01:17:01.721228" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:17:01.720493" elapsed="0.000790"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:17:01.721376" elapsed="0.000057"/>
</return>
<msg time="2026-10-16T01:17:01.721675" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:17:01.719779" elapsed="0.001976"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:01.725775" 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-10-16T01:17:01.724877" elapsed="0.001067"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:01.727407" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:17:01.726643" elapsed="0.000888"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:17:01.736826" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:17:01.736945" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:17:01.737164" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:17:01.728538" elapsed="0.009488">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:17:01.727799" elapsed="0.010394">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:01.738626" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:01.738264" elapsed="0.000617"/>
</branch>
<status status="FAIL" start="2026-10-16T01:17:01.727738" elapsed="0.011197">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:01.739738" elapsed="0.000056"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:01.740011" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:01.739939" elapsed="0.000156"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:17:01.739904" 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-10-16T01:17:01.740444" elapsed="0.000055"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:17:01.740617" elapsed="0.000031"/>
</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-10-16T01:17:01.722647" elapsed="0.018226">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:01.740993" 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-10-16T01:17:01.718810" elapsed="0.022369">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:01.741660" elapsed="0.000078"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:17:01.715482" elapsed="0.026365">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:17:01.715217" elapsed="0.026743">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:17:01.710393" elapsed="0.031745">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<msg time="2026-10-16T01:17:01.742329" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<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="FAIL" start="2026-10-16T01:16:56.525514" elapsed="5.217007">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${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="NOT RUN" start="2026-10-16T01:17:01.743076" elapsed="0.000046"/>
</kw>
<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-10-16T01:16:55.750180" elapsed="5.993142">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<doc>Create bridge with OVS command and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-10-16T01:16:55.293993" elapsed="6.449638">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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-10-16T01:17:01.746932" elapsed="0.000458"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:17:01.746309" elapsed="0.001193"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:01.749594" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:01.749379" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:01.749341" elapsed="0.000428"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:01.754072" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:01.753884" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:01.753847" elapsed="0.000365"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:17:01.756361" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:17:01.755514" elapsed="0.000905"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:17:01.757503" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:17:01.756889" elapsed="0.000668"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:17:01.757676" elapsed="0.000091"/>
</return>
<msg time="2026-10-16T01:17:01.758003" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:17:01.754727" elapsed="0.003327"/>
</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-10-16T01:17:01.763447" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:01.763330" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:01.763306" 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-10-16T01:17:01.765133" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:01.765019" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:01.764995" elapsed="0.000225"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:01.765783" 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-10-16T01:17:01.765421" elapsed="0.000407"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:01.766309" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:17:01.766059" elapsed="0.000284"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:17:01.802588" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:17:01.767196" elapsed="0.035664"/>
</kw>
<msg time="2026-10-16T01:17:01.803081" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:17:01.803125" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:01.766554" elapsed="0.036608"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:17:01.878630" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:01.803991" elapsed="0.074900"/>
</kw>
<msg time="2026-10-16T01:17:01.879100" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:17:01.879144" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:01.803406" elapsed="0.075773"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:01.879588" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:01.879280" elapsed="0.000384"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:01.879252" elapsed="0.000440"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:01.880326" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:01.879897" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:01.880689" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:01.880475" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:01.880459" elapsed="0.000348"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:17:01.880843" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:01.883942" elapsed="0.000495"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:17:01.885764" elapsed="0.000502"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:01.887626" elapsed="0.000395"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:17:01.881801" elapsed="0.006289"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:17:01.881183" elapsed="0.007026"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:17:01.764634" elapsed="0.123655"/>
</kw>
<msg time="2026-10-16T01:17:01.888376" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:01.888417" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:01.763786" elapsed="0.124667"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:17:01.888627" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:17:01.888524" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:01.888507" elapsed="0.000272"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:17:01.889124" 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-10-16T01:17:01.889440" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:17:01.889504" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:17:01.762924" elapsed="0.126689"/>
</kw>
<msg time="2026-10-16T01:17:01.889717" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:01.889760" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:01.758873" elapsed="0.130923"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:01.890089" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:01.889866" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:01.889849" elapsed="0.000312"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:17:01.758503" elapsed="0.131680"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:01.892965" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:01.892878" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:01.892860" elapsed="0.000168"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:01.894138" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:01.894055" elapsed="0.000134"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:01.894038" elapsed="0.000178"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:01.894612" 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-10-16T01:17:01.894362" elapsed="0.000276"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:01.894993" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:17:01.894814" elapsed="0.000203"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:17:01.934054" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:17:01.895598" elapsed="0.038694"/>
</kw>
<msg time="2026-10-16T01:17:01.934514" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:17:01.934569" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:01.895169" elapsed="0.039437"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:17:02.014915" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:01.935351" elapsed="0.079855"/>
</kw>
<msg time="2026-10-16T01:17:02.015431" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:17:02.015473" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:01.934845" elapsed="0.080746"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:02.016055" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:02.015736" elapsed="0.000397"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:02.015676" elapsed="0.000488"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:02.016954" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:02.016350" elapsed="0.000727"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:02.017445" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:02.017164" elapsed="0.000382"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:02.017139" elapsed="0.000615"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:17:02.017878" elapsed="0.000080"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:02.021738" 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-10-16T01:17:02.023504" elapsed="0.000539"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:02.025581" 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-10-16T01:17:02.019940" elapsed="0.006056"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:17:02.018627" elapsed="0.007486"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:17:01.893799" elapsed="0.132394"/>
</kw>
<msg time="2026-10-16T01:17:02.026280" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:02.026320" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:01.893174" elapsed="0.133184"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:17:02.026521" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-10-16T01:17:02.026431" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:02.026413" 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-10-16T01:17:02.027048" 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-10-16T01:17:02.027367" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:17:02.027434" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:17:01.892545" elapsed="0.134979"/>
</kw>
<msg time="2026-10-16T01:17:02.027630" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:02.027673" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:01.890445" elapsed="0.137289"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:02.028039" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:02.027812" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:02.027795" elapsed="0.000316"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:17:01.890308" elapsed="0.137826"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:02.030954" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:02.030865" elapsed="0.000131"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:02.030848" elapsed="0.000169"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:02.032177" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:02.032091" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:02.032074" elapsed="0.000239"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:02.032754" 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-10-16T01:17:02.032473" elapsed="0.000309"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:02.033128" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:17:02.032946" elapsed="0.000207"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:17:02.070177" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:17:02.033780" elapsed="0.036584"/>
</kw>
<msg time="2026-10-16T01:17:02.070553" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:17:02.070620" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:02.033307" elapsed="0.037350"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:17:02.151312" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:02.071284" elapsed="0.080215"/>
</kw>
<msg time="2026-10-16T01:17:02.151677" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:17:02.151746" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:02.070854" elapsed="0.080934"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:02.152089" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:02.151868" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:02.151845" elapsed="0.000343"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:02.152768" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:02.152374" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:02.153119" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:02.152913" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:02.152897" elapsed="0.000316"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:17:02.153243" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:02.155858" elapsed="0.000489"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:17:02.157609" elapsed="0.000512"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:02.159497" 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-10-16T01:17:02.154115" elapsed="0.005818"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:17:02.153541" elapsed="0.006510"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:17:02.031828" elapsed="0.128304"/>
</kw>
<msg time="2026-10-16T01:17:02.160218" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:02.160258" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:02.031164" elapsed="0.129129"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:17:02.160450" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:17:02.160363" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:02.160346" elapsed="0.000182"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:17:02.160981" 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-10-16T01:17:02.161344" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:17:02.161410" 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-10-16T01:17:02.030453" elapsed="0.131045"/>
</kw>
<msg time="2026-10-16T01:17:02.161604" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:02.161647" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:02.028410" elapsed="0.133273"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:02.162003" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:02.161781" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:02.161764" elapsed="0.000312"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:17:02.028264" elapsed="0.133834"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:17:01.758160" elapsed="0.403970"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:17:01.753151" elapsed="0.409037"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:17:01.748804" elapsed="0.413438"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:01.747876" elapsed="0.414408"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:17:01.745496" elapsed="0.416840"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:02.168149" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:02.167902" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:02.167885" elapsed="0.000343"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:02.168573" 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-10-16T01:17:02.168669" 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-10-16T01:17:02.168417" elapsed="0.000277"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:02.169187" 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.104" 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-10-16T01:17:02.168897" elapsed="0.000332"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:02.169741" level="INFO">${conn_id} = 148</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-10-16T01:17:02.169404" elapsed="0.000362"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:17:02.170605" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:17:02.170687" 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-10-16T01:17:02.170312" elapsed="0.000421"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:02.170892" elapsed="0.000293"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:17:02.171977" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:17:02.535297" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:16:56 UTC 2026

  System load:  0.04               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:16:56 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:17:02.171744" elapsed="0.363706"/>
</kw>
<msg time="2026-10-16T01:17:02.535646" 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-10-16T01:17:02.171345" elapsed="0.364400"/>
</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-10-16T01:17:02.169958" elapsed="0.365903"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:17:02.536386" level="INFO">Executing command 'sudo ovs-vsctl add-port br-s1 vx1 -- set Interface vx1 type=vxlan'.</msg>
<msg time="2026-10-16T01:17:02.559047" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:17:02.559158" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:17:02.559198" 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-10-16T01:17:02.536145" elapsed="0.023077"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:02.559376" elapsed="0.000208"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:02.560277" 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-10-16T01:17:02.559863" elapsed="0.000473"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:17:02.560625" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:02.560441" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:02.560409" elapsed="0.000339"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:17:02.560932" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-10-16T01:17:02.560818" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:02.560799" elapsed="0.000239"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:17:02.561081" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:02.562110" 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-10-16T01:17:02.562836" elapsed="0.000205"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:02.563237" elapsed="0.000120"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:17:02.561497" elapsed="0.001925"/>
</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-10-16T01:17:02.167453" elapsed="0.396062"/>
</kw>
<msg time="2026-10-16T01:17:02.563603" 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-10-16T01:17:02.166925" elapsed="0.396740"/>
</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-10-16T01:17:02.166469" elapsed="0.397315"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:17:02.564468" 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-10-16T01:17:02.564055" elapsed="0.000446"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:17:02.565182" 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-10-16T01:17:02.564799" elapsed="0.000417"/>
</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-10-16T01:17:02.571437" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:17:02.570977" elapsed="0.000495"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:17:02.572095" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:17:02.571715" elapsed="0.000414"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:17:02.572184" elapsed="0.000036"/>
</return>
<msg time="2026-10-16T01:17:02.572359" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:17:02.570454" elapsed="0.001936"/>
</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-10-16T01:17:02.576192" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:17:02.575813" elapsed="0.000413"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:17:02.576285" elapsed="0.000036"/>
</return>
<msg time="2026-10-16T01:17:02.576455" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:17:02.575280" elapsed="0.001206"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:02.578134" 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-10-16T01:17:02.577826" elapsed="0.000366"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:02.578795" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:17:02.578451" elapsed="0.000401"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:17:02.583915" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:17:02.583996" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:17:02.584176" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:17:02.579246" elapsed="0.005532">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:17:02.578935" elapsed="0.005948">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:02.585139" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:02.584926" elapsed="0.000294"/>
</branch>
<status status="FAIL" start="2026-10-16T01:17:02.578912" elapsed="0.006340">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:02.585755" elapsed="0.000034"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:02.585922" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:02.585877" elapsed="0.000098"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:17:02.585855" elapsed="0.000148"/>
</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-10-16T01:17:02.586191" elapsed="0.000027"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:17:02.586278" elapsed="0.000018"/>
</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-10-16T01:17:02.576950" elapsed="0.009459">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:02.586484" 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-10-16T01:17:02.574687" elapsed="0.011930">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:02.586929" elapsed="0.000033"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:17:02.572659" elapsed="0.014368">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:17:02.572464" elapsed="0.014635">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:17:02.569781" elapsed="0.017431">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:03.596800" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:17:03.595910" elapsed="0.000957"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:17:03.597880" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:17:03.597217" elapsed="0.000718"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:17:03.598030" elapsed="0.000072"/>
</return>
<msg time="2026-10-16T01:17:03.598330" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:17:03.595038" elapsed="0.003343"/>
</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-10-16T01:17:03.604319" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:17:03.603682" elapsed="0.000692"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:17:03.604468" elapsed="0.000057"/>
</return>
<msg time="2026-10-16T01:17:03.604802" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:17:03.602948" elapsed="0.001907"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:03.607495" 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-10-16T01:17:03.606992" elapsed="0.000625"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:03.608547" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:17:03.608063" elapsed="0.000597"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:17:03.615263" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:17:03.615377" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:17:03.615620" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:17:03.609340" elapsed="0.007092">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:17:03.608833" elapsed="0.007790">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:03.617067" elapsed="0.000431"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:03.616730" elapsed="0.000885"/>
</branch>
<status status="FAIL" start="2026-10-16T01:17:03.608791" elapsed="0.008876">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:03.618444" elapsed="0.000052"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:03.618771" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:03.618668" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:17:03.618631" elapsed="0.000274"/>
</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-10-16T01:17:03.619216" elapsed="0.000042"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:17:03.619355" 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-10-16T01:17:03.605532" elapsed="0.014061">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:03.619741" 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-10-16T01:17:03.601976" elapsed="0.018053">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:03.620498" elapsed="0.000050"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:17:03.598805" elapsed="0.021875">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:17:03.598497" elapsed="0.022331">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:17:03.593800" elapsed="0.027213">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:04.631483" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:17:04.630586" elapsed="0.000962"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:17:04.632619" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:17:04.631965" elapsed="0.000709"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:17:04.632803" elapsed="0.000082"/>
</return>
<msg time="2026-10-16T01:17:04.633125" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:17:04.629740" elapsed="0.003435"/>
</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-10-16T01:17:04.639174" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:17:04.638508" elapsed="0.000722"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:17:04.639325" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:17:04.639635" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:17:04.637794" elapsed="0.001896"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:04.642374" 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-10-16T01:17:04.641862" elapsed="0.000606"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:04.643461" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:17:04.642972" elapsed="0.000665"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:17:04.650264" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:17:04.650379" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:17:04.650620" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:17:04.644407" elapsed="0.007003">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:17:04.643877" elapsed="0.007728">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:04.652050" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:04.651679" elapsed="0.000502"/>
</branch>
<status status="FAIL" start="2026-10-16T01:17:04.643830" elapsed="0.008400">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:04.653434" elapsed="0.000054"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:04.653869" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:04.653792" elapsed="0.000165"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:17:04.653751" elapsed="0.000252"/>
</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-10-16T01:17:04.654315" elapsed="0.000043"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:17:04.654455" elapsed="0.000030"/>
</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-10-16T01:17:04.640397" elapsed="0.014348">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:04.654874" 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-10-16T01:17:04.636817" elapsed="0.018248">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:04.655526" elapsed="0.000116"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:17:04.633576" elapsed="0.022208">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:17:04.633293" elapsed="0.022611">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:17:04.628211" elapsed="0.027876">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:05.665851" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:17:05.664941" elapsed="0.000976"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:17:05.666951" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:17:05.666263" elapsed="0.000742"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:17:05.667104" elapsed="0.000073"/>
</return>
<msg time="2026-10-16T01:17:05.667407" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:17:05.664068" elapsed="0.003389"/>
</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-10-16T01:17:05.673373" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:17:05.672769" elapsed="0.000660"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:17:05.673522" elapsed="0.000095"/>
</return>
<msg time="2026-10-16T01:17:05.673865" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:17:05.672014" elapsed="0.001902"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:05.676596" 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-10-16T01:17:05.676062" elapsed="0.000631"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:05.677661" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:17:05.677139" elapsed="0.000643"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:17:05.684352" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:17:05.684464" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:17:05.684697" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:17:05.678441" elapsed="0.007169">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:17:05.677931" elapsed="0.007875">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:05.686221" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:05.685881" elapsed="0.000472"/>
</branch>
<status status="FAIL" start="2026-10-16T01:17:05.677890" elapsed="0.008513">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:05.687220" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:05.687489" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:05.687415" elapsed="0.000184"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:17:05.687379" elapsed="0.000266"/>
</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-10-16T01:17:05.687980" elapsed="0.000045"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:17:05.688122" elapsed="0.000031"/>
</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-10-16T01:17:05.674602" elapsed="0.013734">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:05.688455" elapsed="0.000031"/>
</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-10-16T01:17:05.671036" elapsed="0.017638">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:05.689166" elapsed="0.000049"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:17:05.667889" elapsed="0.021431">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:17:05.667599" elapsed="0.021835">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:17:05.662804" elapsed="0.026924">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:06.699988" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:17:06.699085" elapsed="0.000968"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:17:06.701078" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:17:06.700402" elapsed="0.000732"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:17:06.701235" elapsed="0.000073"/>
</return>
<msg time="2026-10-16T01:17:06.701542" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:17:06.698211" elapsed="0.003410"/>
</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-10-16T01:17:06.707919" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:17:06.707218" elapsed="0.000764"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:17:06.708077" elapsed="0.000057"/>
</return>
<msg time="2026-10-16T01:17:06.708348" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:17:06.706446" elapsed="0.001953"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:06.711518" 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-10-16T01:17:06.710912" elapsed="0.000742"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:06.712651" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:17:06.712112" elapsed="0.000793"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:17:06.719413" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:17:06.719575" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:17:06.719850" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:17:06.713608" elapsed="0.007069">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:17:06.713055" elapsed="0.007819">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:06.721279" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:06.720946" elapsed="0.000464"/>
</branch>
<status status="FAIL" start="2026-10-16T01:17:06.713014" elapsed="0.008445">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:06.722255" elapsed="0.000054"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:06.722522" elapsed="0.000050"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:06.722449" elapsed="0.000183"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:17:06.722415" elapsed="0.000262"/>
</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-10-16T01:17:06.723011" elapsed="0.000045"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:17:06.723153" elapsed="0.000030"/>
</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-10-16T01:17:06.709295" elapsed="0.014069">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:06.723483" elapsed="0.000031"/>
</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-10-16T01:17:06.705385" elapsed="0.018347">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:06.724204" elapsed="0.000049"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:17:06.702051" elapsed="0.022306">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:17:06.701785" elapsed="0.022685">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:17:06.696924" elapsed="0.027754">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:07.735309" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:17:07.734335" elapsed="0.001043"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:17:07.736440" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:17:07.735782" elapsed="0.000713"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:17:07.736617" elapsed="0.000078"/>
</return>
<msg time="2026-10-16T01:17:07.736968" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:17:07.733431" elapsed="0.003589"/>
</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-10-16T01:17:07.743270" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:17:07.742599" elapsed="0.000733"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:17:07.743429" elapsed="0.000059"/>
</return>
<msg time="2026-10-16T01:17:07.743771" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:17:07.741865" elapsed="0.001961"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:07.746641" 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-10-16T01:17:07.746090" elapsed="0.000676"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:07.747743" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:17:07.747185" elapsed="0.000653"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:17:07.754298" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:17:07.754414" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:17:07.754758" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:17:07.748498" elapsed="0.007030">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:17:07.747985" elapsed="0.007766">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:07.756164" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:07.755827" elapsed="0.000467"/>
</branch>
<status status="FAIL" start="2026-10-16T01:17:07.747944" elapsed="0.008399">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:07.757150" elapsed="0.000052"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:07.757417" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:07.757344" elapsed="0.000157"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:17:07.757309" elapsed="0.000261"/>
</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-10-16T01:17:07.757916" elapsed="0.000044"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:17:07.758056" elapsed="0.000030"/>
</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-10-16T01:17:07.744500" elapsed="0.013767">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:07.758383" elapsed="0.000031"/>
</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-10-16T01:17:07.740859" elapsed="0.017739">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:07.759089" elapsed="0.000049"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:17:07.737511" elapsed="0.021732">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:17:07.737247" elapsed="0.022111">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:17:07.732116" elapsed="0.027448">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<msg time="2026-10-16T01:17:07.759866" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<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="FAIL" start="2026-10-16T01:17:02.565484" elapsed="5.194578">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${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="NOT RUN" start="2026-10-16T01:17:07.760583" elapsed="0.000048"/>
</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="FAIL" start="2026-10-16T01:17:02.166087" elapsed="5.594776">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<doc>Add port with OVS command and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-10-16T01:17:01.744313" elapsed="6.016837">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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-10-16T01:17:07.764508" elapsed="0.000523"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:17:07.763510" elapsed="0.001639"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:07.767279" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:07.767085" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:07.767046" elapsed="0.000375"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:07.771771" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:07.771532" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:07.771495" elapsed="0.000418"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:17:07.773962" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:17:07.773195" elapsed="0.000824"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:17:07.775021" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:17:07.774352" elapsed="0.000723"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:17:07.775167" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:17:07.775448" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:17:07.772354" elapsed="0.003144"/>
</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-10-16T01:17:07.780775" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:07.780635" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:07.780611" 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-10-16T01:17:07.782425" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:07.782308" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:07.782285" elapsed="0.000228"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:07.783077" 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-10-16T01:17:07.782756" elapsed="0.000356"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:07.783621" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:17:07.783342" elapsed="0.000315"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:17:07.818484" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:17:07.784476" elapsed="0.034280"/>
</kw>
<msg time="2026-10-16T01:17:07.818944" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:17:07.818987" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:07.783900" elapsed="0.035123"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:17:07.884943" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:07.819857" elapsed="0.065262"/>
</kw>
<msg time="2026-10-16T01:17:07.885276" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:17:07.885317" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:07.819327" elapsed="0.066026"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:07.885684" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:07.885440" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:07.885416" elapsed="0.000386"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:07.886324" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:07.885986" elapsed="0.000417"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:07.886914" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:07.886464" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:07.886448" elapsed="0.000561"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:17:07.887043" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:07.889622" elapsed="0.000497"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:17:07.891338" elapsed="0.000501"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:07.893031" 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-10-16T01:17:07.887922" elapsed="0.005490"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:17:07.887364" elapsed="0.006165"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:17:07.781950" elapsed="0.111673"/>
</kw>
<msg time="2026-10-16T01:17:07.893894" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:07.893938" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:07.781065" elapsed="0.112909"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:17:07.894128" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:17:07.894044" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:07.894027" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:17:07.894532" 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-10-16T01:17:07.894868" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:17:07.894932" 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-10-16T01:17:07.780083" elapsed="0.114934"/>
</kw>
<msg time="2026-10-16T01:17:07.895101" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:07.895142" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:07.776273" elapsed="0.118910"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:07.895465" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:07.895250" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:07.895234" elapsed="0.000351"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:17:07.775964" elapsed="0.119644"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:07.898111" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:07.898027" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:07.898010" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:07.899264" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:07.899178" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:07.899162" elapsed="0.000164"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:07.899732" 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-10-16T01:17:07.899468" elapsed="0.000291"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:07.900111" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:17:07.899935" elapsed="0.000201"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:17:07.937491" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:17:07.900723" elapsed="0.036969"/>
</kw>
<msg time="2026-10-16T01:17:07.937907" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:17:07.937950" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:07.900288" elapsed="0.037698"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:17:08.018166" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:07.938611" elapsed="0.079738"/>
</kw>
<msg time="2026-10-16T01:17:08.018509" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:17:08.018566" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:07.938155" elapsed="0.080448"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:08.018903" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:08.018674" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:08.018656" elapsed="0.000342"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:08.019597" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:08.019184" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:08.020029" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:08.019786" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:08.019766" elapsed="0.000372"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:17:08.020175" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:08.022877" elapsed="0.000478"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:17:08.024794" elapsed="0.000498"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:08.026716" 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-10-16T01:17:08.021023" elapsed="0.006080"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:17:08.020473" elapsed="0.006748"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:17:07.898923" elapsed="0.128379"/>
</kw>
<msg time="2026-10-16T01:17:08.027387" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:08.027428" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:07.898317" elapsed="0.129193"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:17:08.027744" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-10-16T01:17:08.027605" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:08.027586" elapsed="0.000245"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:17:08.028170" 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-10-16T01:17:08.028466" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:17:08.028530" 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-10-16T01:17:07.897735" elapsed="0.130904"/>
</kw>
<msg time="2026-10-16T01:17:08.028837" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:08.028879" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:07.895993" elapsed="0.132921"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:08.029202" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:08.028983" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:08.028967" elapsed="0.000306"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:17:07.895850" elapsed="0.133445"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:08.031781" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:08.031680" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:08.031662" elapsed="0.000183"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:08.033001" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:08.032916" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:08.032899" elapsed="0.000165"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:08.033438" 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-10-16T01:17:08.033208" elapsed="0.000255"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:08.033829" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:17:08.033637" elapsed="0.000216"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:17:08.072270" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:17:08.034417" elapsed="0.038027"/>
</kw>
<msg time="2026-10-16T01:17:08.072634" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:17:08.072678" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:08.034005" elapsed="0.038730"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:17:08.176906" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:08.073347" elapsed="0.103737"/>
</kw>
<msg time="2026-10-16T01:17:08.177238" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:17:08.177279" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:08.072904" elapsed="0.104410"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:08.177595" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:08.177381" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:08.177364" elapsed="0.000326"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:08.178237" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:08.177898" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:08.178662" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:08.178424" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:08.178408" elapsed="0.000371"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:17:08.178816" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:08.181310" 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-10-16T01:17:08.183096" elapsed="0.000471"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:08.185000" elapsed="0.000483"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:17:08.179649" elapsed="0.005913"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:17:08.179122" elapsed="0.006560"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:17:08.032604" elapsed="0.153182"/>
</kw>
<msg time="2026-10-16T01:17:08.185869" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:08.185908" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:08.032012" elapsed="0.153931"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:17:08.186096" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:17:08.186011" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:08.185995" elapsed="0.000177"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:17:08.186484" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:08.186911" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:17:08.186979" 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-10-16T01:17:08.031366" elapsed="0.155698"/>
</kw>
<msg time="2026-10-16T01:17:08.187146" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:08.187185" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:08.029578" elapsed="0.157642"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:08.187500" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:08.187285" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:08.187270" elapsed="0.000320"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:17:08.029410" elapsed="0.158201"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:17:07.775626" elapsed="0.412014"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:17:07.770886" elapsed="0.416807"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:17:07.766452" elapsed="0.421312"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:07.765480" elapsed="0.422328"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:17:07.762632" elapsed="0.425227"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:08.190095" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:08.189814" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:08.189792" elapsed="0.000378"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:08.190497" 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-10-16T01:17:08.190647" 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-10-16T01:17:08.190366" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:08.191162" level="INFO">Attempting to execute command "ip tuntap add mode tap vport1" on remote system "10.30.171.104" 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-10-16T01:17:08.190875" elapsed="0.000329"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:08.191723" level="INFO">${conn_id} = 153</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-10-16T01:17:08.191389" elapsed="0.000359"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:17:08.192568" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:17:08.192639" 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-10-16T01:17:08.192295" elapsed="0.000366"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:08.192829" elapsed="0.000294"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:17:08.193911" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:17:08.617788" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:16:56 UTC 2026

  System load:  0.04               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:17:02 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:17:08.193662" elapsed="0.424282"/>
</kw>
<msg time="2026-10-16T01:17:08.618028" 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-10-16T01:17:08.193283" elapsed="0.424828"/>
</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-10-16T01:17:08.191940" elapsed="0.426281"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:17:08.618809" level="INFO">Executing command 'ip tuntap add mode tap vport1'.</msg>
<msg time="2026-10-16T01:17:08.631719" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-10-16T01:17:08.631877" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:17:08.631931" 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-10-16T01:17:08.618524" elapsed="0.013437"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:08.632179" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:08.633245" 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-10-16T01:17:08.632854" elapsed="0.000449"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:17:08.633596" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:08.633411" elapsed="0.000256"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:08.633379" 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-10-16T01:17:08.633908" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-10-16T01:17:08.633792" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:08.633773" elapsed="0.000240"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:17:08.634056" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:08.635105" elapsed="0.000408"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:17:08.635810" elapsed="0.000214"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:08.636220" elapsed="0.000121"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:17:08.634476" elapsed="0.001928"/>
</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-10-16T01:17:08.189358" elapsed="0.447140"/>
</kw>
<msg time="2026-10-16T01:17:08.636655" 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-10-16T01:17:08.188853" elapsed="0.447886"/>
</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-10-16T01:17:08.188387" elapsed="0.448453"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:08.639427" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:08.639100" elapsed="0.000399"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:08.639075" elapsed="0.000455"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:08.640022" 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-10-16T01:17:08.640150" 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-10-16T01:17:08.639844" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:08.640882" level="INFO">Attempting to execute command "ip tuntap add mode tap vport2" on remote system "10.30.171.104" 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-10-16T01:17:08.640437" elapsed="0.000504"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:08.641602" 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-10-16T01:17:08.641181" elapsed="0.000454"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:17:08.642818" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:17:08.642913" 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-10-16T01:17:08.642424" elapsed="0.000519"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:08.643144" elapsed="0.000389"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:17:08.644649" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:17:09.030281" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:16:56 UTC 2026

  System load:  0.04               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:17:08 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:17:08.644309" elapsed="0.386111"/>
</kw>
<msg time="2026-10-16T01:17:09.030492" 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-10-16T01:17:08.643798" elapsed="0.386785"/>
</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-10-16T01:17:08.641925" elapsed="0.388761"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:17:09.031221" level="INFO">Executing command 'ip tuntap add mode tap vport2'.</msg>
<msg time="2026-10-16T01:17:09.043910" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-10-16T01:17:09.044029" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:17:09.044068" 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-10-16T01:17:09.030985" elapsed="0.013105"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:09.044246" elapsed="0.000223"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:09.045081" 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-10-16T01:17:09.044761" elapsed="0.000362"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:17:09.045339" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:09.045210" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:09.045183" elapsed="0.000232"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:17:09.045562" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-16T01:17:09.045463" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:09.045450" elapsed="0.000194"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:17:09.045767" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:09.046526" elapsed="0.000341"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:17:09.047051" elapsed="0.000153"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:09.047343" elapsed="0.000089"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:17:09.046089" elapsed="0.001389"/>
</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-10-16T01:17:08.638416" elapsed="0.409145"/>
</kw>
<msg time="2026-10-16T01:17:09.047610" 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-10-16T01:17:08.637674" elapsed="0.409981"/>
</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-10-16T01:17:08.637083" elapsed="0.410668"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:09.049599" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:09.049349" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:09.049330" elapsed="0.000344"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:09.050034" 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-10-16T01:17:09.050128" 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-10-16T01:17:09.049898" elapsed="0.000254"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:09.050640" level="INFO">Attempting to execute command "ifconfig vport1 up" on remote system "10.30.171.104" 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-10-16T01:17:09.050339" elapsed="0.000343"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:09.051182" 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-10-16T01:17:09.050872" elapsed="0.000335"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:17:09.052039" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:17:09.052109" 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-10-16T01:17:09.051781" elapsed="0.000350"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:09.052284" elapsed="0.000302"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:17:09.053371" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:17:09.463186" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:16:56 UTC 2026

  System load:  0.04               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:17:08 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:17:09.053138" elapsed="0.410201"/>
</kw>
<msg time="2026-10-16T01:17:09.463421" 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-10-16T01:17:09.052764" elapsed="0.410738"/>
</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-10-16T01:17:09.051400" elapsed="0.412228"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:17:09.464184" level="INFO">Executing command 'ifconfig vport1 up'.</msg>
<msg time="2026-10-16T01:17:09.476996" level="INFO">Command exited with return code 255.</msg>
<msg time="2026-10-16T01:17:09.477109" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:17:09.477149" 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-10-16T01:17:09.463941" elapsed="0.013230"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:09.477327" elapsed="0.000241"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:09.478135" 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-10-16T01:17:09.477845" elapsed="0.000333"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:17:09.478399" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:09.478268" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:09.478240" elapsed="0.000237"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:17:09.478628" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:17:09.478527" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:09.478514" elapsed="0.000207"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:17:09.478754" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:09.479500" elapsed="0.000481"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:17:09.480168" elapsed="0.000149"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:09.480457" 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-10-16T01:17:09.479066" elapsed="0.001554"/>
</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-10-16T01:17:09.048924" elapsed="0.431768"/>
</kw>
<msg time="2026-10-16T01:17:09.480762" 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-10-16T01:17:09.048352" elapsed="0.432460"/>
</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-10-16T01:17:09.047932" elapsed="0.432954"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:09.482820" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:09.482556" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:09.482524" elapsed="0.000373"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:09.483221" 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-10-16T01:17:09.483315" 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-10-16T01:17:09.483088" elapsed="0.000252"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:09.483845" level="INFO">Attempting to execute command "ifconfig vport2 up" on remote system "10.30.171.104" 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-10-16T01:17:09.483526" elapsed="0.000362"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:09.484359" 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-10-16T01:17:09.484060" elapsed="0.000323"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:17:09.485216" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:17:09.485284" 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-10-16T01:17:09.484960" elapsed="0.000346"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:09.485451" elapsed="0.000320"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:17:09.486754" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:17:09.854544" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:16:56 UTC 2026

  System load:  0.04               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:17:09 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:17:09.486294" elapsed="0.368509"/>
</kw>
<msg time="2026-10-16T01:17:09.854885" 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-10-16T01:17:09.485932" elapsed="0.369036"/>
</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-10-16T01:17:09.484587" elapsed="0.370492"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:17:09.855628" level="INFO">Executing command 'ifconfig vport2 up'.</msg>
<msg time="2026-10-16T01:17:09.868167" level="INFO">Command exited with return code 255.</msg>
<msg time="2026-10-16T01:17:09.868317" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:17:09.868371" 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-10-16T01:17:09.855368" elapsed="0.013034"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:09.868647" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:09.869718" 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-10-16T01:17:09.869302" elapsed="0.000477"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:17:09.870059" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:09.869890" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:09.869857" elapsed="0.000302"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:17:09.870341" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-10-16T01:17:09.870227" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:09.870208" elapsed="0.000239"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:17:09.870490" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:09.871577" 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-10-16T01:17:09.872263" elapsed="0.000204"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:09.872679" elapsed="0.000146"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:17:09.870958" elapsed="0.001938"/>
</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-10-16T01:17:09.482112" elapsed="0.390884"/>
</kw>
<msg time="2026-10-16T01:17:09.873062" 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-10-16T01:17:09.481523" elapsed="0.391603"/>
</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-10-16T01:17:09.481069" elapsed="0.392157"/>
</kw>
<doc>Create Tap Device vport1 and vport2 to add to the bridge br-s1 using OVS command.</doc>
<status status="PASS" start="2026-10-16T01:17:08.188065" elapsed="1.685233"/>
</kw>
<doc>Create tap devices to add to the bridge in ovs</doc>
<status status="PASS" start="2026-10-16T01:17:07.761603" elapsed="2.111840"/>
</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-10-16T01:17:09.876349" elapsed="0.000298"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:17:09.875986" elapsed="0.000754"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:09.878578" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:09.878302" elapsed="0.000424"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:09.878238" elapsed="0.000542"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:09.883879" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:09.883656" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:09.883617" elapsed="0.000406"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:17:09.886286" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:17:09.885395" elapsed="0.000954"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:17:09.887366" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:17:09.886745" elapsed="0.000674"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:17:09.887508" elapsed="0.000089"/>
</return>
<msg time="2026-10-16T01:17:09.887974" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:17:09.884505" elapsed="0.003522"/>
</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-10-16T01:17:09.893521" elapsed="0.000056"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:09.893333" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:09.893294" 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-10-16T01:17:09.896397" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:09.896204" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:09.896164" elapsed="0.000406"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:09.897451" 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-10-16T01:17:09.896936" elapsed="0.000569"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:09.898617" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:17:09.898134" elapsed="0.000541"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:17:09.934754" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:17:09.900066" elapsed="0.034956"/>
</kw>
<msg time="2026-10-16T01:17:09.935248" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:17:09.935308" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:09.899069" elapsed="0.036289"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:17:10.028088" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:09.936258" elapsed="0.092018"/>
</kw>
<msg time="2026-10-16T01:17:10.028434" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:17:10.028476" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:09.935606" elapsed="0.092906"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:10.028834" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:10.028601" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:10.028582" elapsed="0.000349"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:10.029462" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:10.029114" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:10.029836" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:10.029624" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:10.029608" elapsed="0.000321"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:17:10.029959" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:10.032465" 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-10-16T01:17:10.034232" elapsed="0.000703"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:10.036322" 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-10-16T01:17:10.030788" elapsed="0.005948"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:17:10.030250" elapsed="0.006606"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:17:09.895413" elapsed="0.141519"/>
</kw>
<msg time="2026-10-16T01:17:10.037051" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:10.037091" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:09.894050" elapsed="0.143075"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:17:10.037280" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:17:10.037194" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:10.037177" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:17:10.037773" 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-10-16T01:17:10.038076" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:17:10.038140" 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-10-16T01:17:09.892658" elapsed="0.145570"/>
</kw>
<msg time="2026-10-16T01:17:10.038313" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:10.038352" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:09.888844" elapsed="0.149541"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:10.038684" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:10.038451" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:10.038436" elapsed="0.000337"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:17:09.888473" elapsed="0.150322"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:10.041215" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:10.041131" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:10.041114" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:10.042375" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:10.042290" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:10.042274" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:10.042839" 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-10-16T01:17:10.042592" elapsed="0.000271"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:10.043192" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:17:10.043021" elapsed="0.000194"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:17:10.082153" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:17:10.043828" elapsed="0.038503"/>
</kw>
<msg time="2026-10-16T01:17:10.082487" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:17:10.082528" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:10.043366" elapsed="0.039212"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:17:10.179110" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:10.083181" elapsed="0.096115"/>
</kw>
<msg time="2026-10-16T01:17:10.179458" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:17:10.179501" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:10.082759" elapsed="0.096791"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:10.179853" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:10.179623" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:10.179604" elapsed="0.000379"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:10.180513" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:10.180161" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:10.180890" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:10.180674" elapsed="0.000332"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:10.180657" elapsed="0.000373"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:17:10.181062" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:10.183519" 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-10-16T01:17:10.185259" elapsed="0.000489"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:10.187125" elapsed="0.000467"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:17:10.181860" elapsed="0.005800"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:17:10.181329" elapsed="0.006469"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:17:10.042036" elapsed="0.145839"/>
</kw>
<msg time="2026-10-16T01:17:10.187957" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:10.187995" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:10.041433" elapsed="0.146596"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:17:10.188183" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:17:10.188097" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:10.188081" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:17:10.188578" 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-10-16T01:17:10.188931" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:17:10.188997" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:17:10.040842" elapsed="0.148240"/>
</kw>
<msg time="2026-10-16T01:17:10.189164" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:10.189203" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:10.039054" elapsed="0.150182"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:10.189519" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:10.189303" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:10.189287" elapsed="0.000319"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:17:10.038919" elapsed="0.150708"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:10.192071" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:10.191987" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:10.191970" elapsed="0.000162"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:10.193230" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:10.193146" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:10.193130" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:10.193670" 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-10-16T01:17:10.193433" elapsed="0.000278"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:10.194078" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:17:10.193870" elapsed="0.000233"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:17:10.235515" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:17:10.194687" elapsed="0.041035"/>
</kw>
<msg time="2026-10-16T01:17:10.235905" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:17:10.235947" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:10.194257" elapsed="0.041724"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:17:10.327048" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:10.236592" elapsed="0.090767"/>
</kw>
<msg time="2026-10-16T01:17:10.327616" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:17:10.327662" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:10.236142" elapsed="0.091579"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:10.328155" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:10.327842" elapsed="0.000389"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:10.327804" elapsed="0.000457"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:10.328924" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:10.328450" elapsed="0.000557"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:10.329267" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:10.329068" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:10.329051" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:17:10.329394" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:10.332116" 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-10-16T01:17:10.333883" elapsed="0.000494"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:10.335652" elapsed="0.000556"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:17:10.330353" elapsed="0.005923"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:17:10.329788" elapsed="0.006606"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:17:10.192891" elapsed="0.143581"/>
</kw>
<msg time="2026-10-16T01:17:10.336569" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:10.336610" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:10.192276" elapsed="0.144369"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:17:10.336823" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-16T01:17:10.336730" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:10.336711" elapsed="0.000192"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:17:10.337236" 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-10-16T01:17:10.337561" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:17:10.337627" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:17:10.191677" elapsed="0.146125"/>
</kw>
<msg time="2026-10-16T01:17:10.337891" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:10.337930" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:10.189970" elapsed="0.147994"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:10.338250" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:10.338032" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:10.338015" elapsed="0.000307"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:17:10.189833" elapsed="0.148511"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:17:09.888144" elapsed="0.450233"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:17:09.882890" elapsed="0.455549"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:17:09.877495" elapsed="0.461000"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:09.876944" elapsed="0.461613"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:17:09.874947" elapsed="0.463667"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:10.342277" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:10.342041" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:10.342023" elapsed="0.000329"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:10.342691" 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-10-16T01:17:10.342929" 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-10-16T01:17:10.342556" elapsed="0.000398"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:10.343424" 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.104" 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-10-16T01:17:10.343137" elapsed="0.000329"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:10.343970" level="INFO">${conn_id} = 164</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-10-16T01:17:10.343651" elapsed="0.000344"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:17:10.344860" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:17:10.344929" 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-10-16T01:17:10.344573" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:10.345097" elapsed="0.000280"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:17:10.346197" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:17:10.720410" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:16:56 UTC 2026

  System load:  0.04               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:17:09 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:17:10.345963" elapsed="0.374603"/>
</kw>
<msg time="2026-10-16T01:17:10.720642" 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-10-16T01:17:10.345549" elapsed="0.375187"/>
</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-10-16T01:17:10.344185" elapsed="0.376724"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:17:10.721421" level="INFO">Executing command 'sudo ovs-vsctl add-port br-s1 vport1 -- add-port br-s1 vport2'.</msg>
<msg time="2026-10-16T01:17:10.784693" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:17:10.784985" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:17:10.785074" 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-10-16T01:17:10.721187" elapsed="0.063938"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:10.785500" elapsed="0.000534"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:10.787176" 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-10-16T01:17:10.786530" elapsed="0.000744"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:17:10.787731" elapsed="0.000041"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:10.787434" elapsed="0.000409"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:10.787386" 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-10-16T01:17:10.788181" elapsed="0.000059"/>
</return>
<status status="PASS" start="2026-10-16T01:17:10.788002" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:10.787971" elapsed="0.000386"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:17:10.788428" elapsed="0.000028"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:10.790103" elapsed="0.000704"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:17:10.791210" elapsed="0.000315"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:10.791884" elapsed="0.000199"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:17:10.789149" elapsed="0.003039"/>
</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-10-16T01:17:10.341595" elapsed="0.450748"/>
</kw>
<msg time="2026-10-16T01:17:10.792449" 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-10-16T01:17:10.341061" elapsed="0.451524"/>
</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-10-16T01:17:10.340632" elapsed="0.452150"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:17:10.793963" 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-10-16T01:17:10.793215" elapsed="0.000802"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:17:10.795150" 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-10-16T01:17:10.794441" elapsed="0.000762"/>
</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-10-16T01:17:10.805694" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:17:10.804890" elapsed="0.000891"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:17:10.806770" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:17:10.806113" elapsed="0.000712"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:17:10.806915" elapsed="0.000059"/>
</return>
<msg time="2026-10-16T01:17:10.807199" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:17:10.803853" elapsed="0.003396"/>
</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-10-16T01:17:10.813291" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:17:10.812656" elapsed="0.000689"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:17:10.813750" elapsed="0.000068"/>
</return>
<msg time="2026-10-16T01:17:10.814049" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:17:10.811923" elapsed="0.002177"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:10.815924" 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-10-16T01:17:10.815579" elapsed="0.000403"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:10.816568" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:17:10.816242" 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-10-16T01:17:10.821865" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:17:10.821940" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:17:10.822086" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:17:10.817305" elapsed="0.005338">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:17:10.816977" elapsed="0.005798">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:10.823032" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:10.822822" elapsed="0.000291"/>
</branch>
<status status="FAIL" start="2026-10-16T01:17:10.816718" elapsed="0.006426">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:10.823683" elapsed="0.000059"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:10.823879" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:10.823833" elapsed="0.000097"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:17:10.823810" elapsed="0.000148"/>
</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-10-16T01:17:10.824146" elapsed="0.000027"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:17:10.824231" elapsed="0.000018"/>
</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-10-16T01:17:10.814677" elapsed="0.009689">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:10.824439" elapsed="0.000019"/>
</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-10-16T01:17:10.810946" elapsed="0.013636">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:10.824897" elapsed="0.000031"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:17:10.807669" elapsed="0.017325">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:17:10.807362" elapsed="0.017705">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:17:10.802633" elapsed="0.022548">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:11.835031" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:17:11.834105" elapsed="0.000994"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:17:11.836264" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:17:11.835595" elapsed="0.000725"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:17:11.836420" elapsed="0.000081"/>
</return>
<msg time="2026-10-16T01:17:11.836801" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:17:11.833224" elapsed="0.003630"/>
</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-10-16T01:17:11.842765" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:17:11.842103" elapsed="0.000719"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:17:11.842915" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:17:11.843185" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:17:11.841350" elapsed="0.001886"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:11.845915" 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-10-16T01:17:11.845357" elapsed="0.000651"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:11.846982" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:17:11.846418" elapsed="0.000652"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:17:11.854277" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:17:11.854394" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:17:11.854642" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:17:11.847776" elapsed="0.007703">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:17:11.847216" elapsed="0.008463">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:11.856121" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:11.855785" elapsed="0.000465"/>
</branch>
<status status="FAIL" start="2026-10-16T01:17:11.847175" elapsed="0.009125">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:11.857088" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:11.857353" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:11.857281" elapsed="0.000155"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:17:11.857246" 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-10-16T01:17:11.857843" elapsed="0.000044"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:17:11.857986" elapsed="0.000030"/>
</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-10-16T01:17:11.843956" elapsed="0.014240">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:11.858313" elapsed="0.000031"/>
</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-10-16T01:17:11.840390" elapsed="0.018107">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:11.859089" elapsed="0.000051"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:17:11.837233" elapsed="0.022014">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:17:11.836973" elapsed="0.022402">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:17:11.831909" elapsed="0.027694">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:12.869411" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:17:12.868505" elapsed="0.000971"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:17:12.870496" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:17:12.869879" elapsed="0.000693"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:17:12.870674" elapsed="0.000116"/>
</return>
<msg time="2026-10-16T01:17:12.871031" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:17:12.867667" elapsed="0.003413"/>
</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-10-16T01:17:12.876997" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:17:12.876349" elapsed="0.000703"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:17:12.877147" elapsed="0.000057"/>
</return>
<msg time="2026-10-16T01:17:12.877414" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:17:12.875613" elapsed="0.001851"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:12.880153" 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-10-16T01:17:12.879618" elapsed="0.000628"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:12.881230" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:17:12.880728" elapsed="0.000591"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:17:12.888216" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:17:12.888350" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:17:12.888595" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:17:12.882055" elapsed="0.007357">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:17:12.881462" elapsed="0.008143">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:12.890048" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:12.889678" elapsed="0.000501"/>
</branch>
<status status="FAIL" start="2026-10-16T01:17:12.881423" elapsed="0.008804">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:12.891015" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:12.891370" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:12.891208" elapsed="0.000252"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:17:12.891174" elapsed="0.000333"/>
</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-10-16T01:17:12.891883" elapsed="0.000045"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:17:12.892026" elapsed="0.000031"/>
</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-10-16T01:17:12.878202" elapsed="0.014035">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:12.892356" 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-10-16T01:17:12.874638" elapsed="0.017926">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:12.893057" elapsed="0.000049"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:17:12.871451" elapsed="0.021761">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:17:12.871197" elapsed="0.022131">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:17:12.866347" elapsed="0.027164">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:13.903287" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:17:13.902386" elapsed="0.000967"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:17:13.904368" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:17:13.903751" elapsed="0.000671"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:17:13.904520" elapsed="0.000100"/>
</return>
<msg time="2026-10-16T01:17:13.904889" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:17:13.901550" elapsed="0.003391"/>
</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-10-16T01:17:13.910843" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:17:13.910194" elapsed="0.000706"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:17:13.910993" elapsed="0.000057"/>
</return>
<msg time="2026-10-16T01:17:13.911259" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:17:13.909438" elapsed="0.001872"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:13.914020" 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-10-16T01:17:13.913455" elapsed="0.000672"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:13.915091" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:17:13.914563" 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-10-16T01:17:13.922204" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:17:13.922327" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:17:13.922563" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:17:13.915888" elapsed="0.007467">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:17:13.915328" elapsed="0.008304">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:13.924074" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:13.923737" elapsed="0.000467"/>
</branch>
<status status="FAIL" start="2026-10-16T01:17:13.915288" elapsed="0.008966">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:13.925035" elapsed="0.000052"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:13.925302" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:13.925228" elapsed="0.000159"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:17:13.925193" 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-10-16T01:17:13.925796" elapsed="0.000045"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:17:13.925938" elapsed="0.000030"/>
</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-10-16T01:17:13.912058" elapsed="0.014089">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:13.926265" elapsed="0.000031"/>
</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-10-16T01:17:13.908482" elapsed="0.017980">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:13.926967" elapsed="0.000049"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:17:13.905305" elapsed="0.021816">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:17:13.905054" elapsed="0.022178">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:17:13.900258" elapsed="0.027156">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:14.937214" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:17:14.936276" elapsed="0.001006"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:17:14.938310" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:17:14.937654" elapsed="0.000711"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:17:14.938461" elapsed="0.000096"/>
</return>
<msg time="2026-10-16T01:17:14.938834" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:17:14.935387" elapsed="0.003498"/>
</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-10-16T01:17:14.944813" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:17:14.944158" elapsed="0.000712"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:17:14.944963" elapsed="0.000056"/>
</return>
<msg time="2026-10-16T01:17:14.945230" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:17:14.943391" elapsed="0.001889"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:14.947974" 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-10-16T01:17:14.947407" elapsed="0.000662"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:14.949043" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:17:14.948491" elapsed="0.000641"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:17:14.959615" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:17:14.959772" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:17:14.960014" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:17:14.949950" elapsed="0.010899">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:17:14.949384" elapsed="0.011636">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:14.961474" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:14.961093" elapsed="0.000553"/>
</branch>
<status status="FAIL" start="2026-10-16T01:17:14.949340" elapsed="0.012410">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:14.962506" elapsed="0.000078"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:14.962831" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:14.962756" elapsed="0.000159"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:17:14.962691" elapsed="0.000270"/>
</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-10-16T01:17:14.963267" elapsed="0.000043"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:17:14.963405" elapsed="0.000030"/>
</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-10-16T01:17:14.946011" elapsed="0.017625">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:14.963789" 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-10-16T01:17:14.942422" elapsed="0.021564">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:14.964444" elapsed="0.000049"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:17:14.939256" elapsed="0.025368">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:17:14.939001" elapsed="0.025771">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:17:14.934078" elapsed="0.030880">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:15.974650" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:17:15.973795" elapsed="0.000949"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:17:15.975750" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:17:15.975091" elapsed="0.000716"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:17:15.975902" elapsed="0.000072"/>
</return>
<msg time="2026-10-16T01:17:15.976205" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:17:15.972937" elapsed="0.003319"/>
</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-10-16T01:17:15.982408" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:17:15.981796" elapsed="0.000671"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:17:15.982656" elapsed="0.000088"/>
</return>
<msg time="2026-10-16T01:17:15.982967" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:17:15.981003" elapsed="0.002016"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:15.985671" 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-10-16T01:17:15.985145" elapsed="0.000650"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:15.986740" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:17:15.986207" elapsed="0.000625"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:17:15.993844" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:17:15.993959" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:17:15.994176" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:17:15.987476" elapsed="0.007519">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:17:15.986972" elapsed="0.008189">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:15.995623" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:15.995232" elapsed="0.000561"/>
</branch>
<status status="FAIL" start="2026-10-16T01:17:15.986933" elapsed="0.008912">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:15.997033" elapsed="0.000056"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:15.997309" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:15.997235" elapsed="0.000160"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:17:15.997199" elapsed="0.000243"/>
</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-10-16T01:17:15.997798" elapsed="0.000046"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:17:15.997942" elapsed="0.000031"/>
</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-10-16T01:17:15.983738" elapsed="0.014416">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:15.998271" elapsed="0.000031"/>
</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-10-16T01:17:15.979996" elapsed="0.018465">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:15.998979" elapsed="0.000050"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:17:15.976799" elapsed="0.022335">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:17:15.976473" elapsed="0.022774">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:17:15.971514" elapsed="0.027915">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<msg time="2026-10-16T01:17:15.999746" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<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="FAIL" start="2026-10-16T01:17:10.795662" elapsed="5.204282">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${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="NOT RUN" start="2026-10-16T01:17:16.000445" elapsed="0.000044"/>
</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="FAIL" start="2026-10-16T01:17:10.340248" elapsed="5.660496">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:17:09.874049" elapsed="6.126987">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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-10-16T01:17:16.006305" elapsed="0.000513"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:17:16.005758" elapsed="0.001206"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:16.009050" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:16.008853" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:16.008811" elapsed="0.000382"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:16.013496" elapsed="0.000060"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:16.013307" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:16.013269" elapsed="0.000412"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:17:16.016003" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:17:16.015129" elapsed="0.000933"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:17:16.017058" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:17:16.016394" elapsed="0.000716"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:17:16.017201" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:17:16.017486" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:17:16.014183" elapsed="0.003383"/>
</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-10-16T01:17:16.021610" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:16.021471" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:16.021447" elapsed="0.000271"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:16.023322" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:16.023202" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:16.023178" elapsed="0.000234"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:16.024027" 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-10-16T01:17:16.023655" elapsed="0.000407"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:16.024551" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:17:16.024286" elapsed="0.000300"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:17:16.059409" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:17:16.025417" elapsed="0.034325"/>
</kw>
<msg time="2026-10-16T01:17:16.059973" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:17:16.060030" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:16.024835" elapsed="0.035350"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:17:16.148201" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:16.061049" elapsed="0.087335"/>
</kw>
<msg time="2026-10-16T01:17:16.148560" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:17:16.148603" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:16.060423" elapsed="0.088214"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:16.148940" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:16.148728" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:16.148691" elapsed="0.000344"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:16.149580" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:16.149214" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:16.149949" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:16.149751" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:16.149733" elapsed="0.000310"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:17:16.150075" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:16.152603" 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-10-16T01:17:16.154369" elapsed="0.000519"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:16.156140" 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-10-16T01:17:16.150892" elapsed="0.005644"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:17:16.150364" elapsed="0.006296"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:17:16.022840" elapsed="0.134129"/>
</kw>
<msg time="2026-10-16T01:17:16.157056" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:16.157096" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:16.021927" elapsed="0.135202"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:17:16.157282" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:17:16.157198" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:16.157181" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:17:16.157710" 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-10-16T01:17:16.158008" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:17:16.158074" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:17:16.021066" elapsed="0.137095"/>
</kw>
<msg time="2026-10-16T01:17:16.158244" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:16.158284" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:16.018333" elapsed="0.139989"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:16.158659" elapsed="0.000120"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:16.158389" elapsed="0.000426"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:16.158374" elapsed="0.000464"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:17:16.018025" elapsed="0.140836"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:16.161357" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:16.161273" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:16.161255" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:16.162519" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:16.162436" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:16.162419" elapsed="0.000178"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:16.162985" 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-10-16T01:17:16.162759" elapsed="0.000250"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:16.163339" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:17:16.163169" elapsed="0.000194"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:17:16.200461" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:17:16.163959" elapsed="0.036690"/>
</kw>
<msg time="2026-10-16T01:17:16.200847" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:17:16.200890" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:16.163516" elapsed="0.037407"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:17:16.287605" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:16.201518" elapsed="0.086318"/>
</kw>
<msg time="2026-10-16T01:17:16.288011" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:17:16.288053" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:16.201089" elapsed="0.087000"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:16.288412" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:16.288174" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:16.288150" elapsed="0.000360"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:16.289100" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:16.288729" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:16.289453" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:16.289253" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:16.289236" elapsed="0.000325"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:17:16.289594" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:16.292161" 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-10-16T01:17:16.293897" elapsed="0.000465"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:16.295713" elapsed="0.000310"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:17:16.290436" elapsed="0.005652"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:17:16.289918" elapsed="0.006283"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:17:16.162179" elapsed="0.134099"/>
</kw>
<msg time="2026-10-16T01:17:16.296408" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:16.296450" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:16.161582" elapsed="0.134904"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:17:16.296662" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:17:16.296574" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:16.296557" elapsed="0.000262"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:17:16.297148" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:16.297458" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:17:16.297536" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:17:16.160983" elapsed="0.136643"/>
</kw>
<msg time="2026-10-16T01:17:16.297726" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:16.297769" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:16.159118" elapsed="0.138687"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:16.298094" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:16.297875" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:16.297859" elapsed="0.000306"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:17:16.158979" elapsed="0.139208"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:16.300877" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:16.300791" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:16.300773" elapsed="0.000167"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:16.302071" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:16.301989" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:16.301972" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:16.302502" 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-10-16T01:17:16.302274" elapsed="0.000267"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:16.302892" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:17:16.302717" elapsed="0.000199"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:17:16.351818" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:17:16.303478" elapsed="0.048544"/>
</kw>
<msg time="2026-10-16T01:17:16.352200" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:17:16.352242" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:16.303068" elapsed="0.049210"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:17:16.424309" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:16.352985" elapsed="0.071520"/>
</kw>
<msg time="2026-10-16T01:17:16.424729" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:17:16.424774" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:16.352475" elapsed="0.072334"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:16.425113" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:16.424892" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:16.424870" elapsed="0.000398"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:16.425834" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:16.425449" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:16.426181" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:16.425982" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:16.425965" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:17:16.426306" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:16.428883" 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-10-16T01:17:16.430716" elapsed="0.000493"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:16.432402" 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-10-16T01:17:16.427160" elapsed="0.005660"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:17:16.426633" elapsed="0.006308"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:17:16.301729" elapsed="0.131294"/>
</kw>
<msg time="2026-10-16T01:17:16.433115" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:16.433155" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:16.301085" elapsed="0.132106"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:17:16.433356" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-10-16T01:17:16.433266" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:16.433248" elapsed="0.000196"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:17:16.433839" 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-10-16T01:17:16.434153" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:17:16.434218" 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-10-16T01:17:16.300459" elapsed="0.133849"/>
</kw>
<msg time="2026-10-16T01:17:16.434396" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:16.434437" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:16.298444" elapsed="0.136029"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:16.434815" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:16.434557" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:16.434540" elapsed="0.000349"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:17:16.298306" elapsed="0.136605"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:17:16.017677" elapsed="0.417268"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:17:16.012613" elapsed="0.422394"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:17:16.008220" elapsed="0.426843"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:16.007287" elapsed="0.427822"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:17:16.004650" elapsed="0.430512"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:16.439312" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:16.438690" elapsed="0.000675"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:16.438674" elapsed="0.000715"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:16.439752" 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-10-16T01:17:16.439849" 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-10-16T01:17:16.439598" elapsed="0.000275"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:16.440351" level="INFO">Attempting to execute command "sudo ovs-vsctl del-br br-s1" on remote system "10.30.171.104" 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-10-16T01:17:16.440060" elapsed="0.000332"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:16.440900" level="INFO">${conn_id} = 169</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-10-16T01:17:16.440578" elapsed="0.000346"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:17:16.441768" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:17:16.441839" 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-10-16T01:17:16.441472" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:16.442009" elapsed="0.000285"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:17:16.443121" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:17:16.812645" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:16:56 UTC 2026

  System load:  0.04               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:17:10 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:17:16.442885" elapsed="0.369904"/>
</kw>
<msg time="2026-10-16T01:17:16.812861" 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-10-16T01:17:16.442456" elapsed="0.370477"/>
</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-10-16T01:17:16.441115" elapsed="0.371915"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:17:16.813502" level="INFO">Executing command 'sudo ovs-vsctl del-br br-s1'.</msg>
<msg time="2026-10-16T01:17:16.877003" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:17:16.877169" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:17:16.877224" 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-10-16T01:17:16.813290" elapsed="0.063965"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:16.877498" elapsed="0.000357"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:16.878589" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:17:16.878187" 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-10-16T01:17:16.878934" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:16.878773" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:16.878740" elapsed="0.000293"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:17:16.879214" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-10-16T01:17:16.879101" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:16.879082" elapsed="0.000244"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:17:16.879371" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:16.880441" elapsed="0.000465"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:17:16.881170" elapsed="0.000209"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:16.881599" elapsed="0.000148"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:17:16.879844" elapsed="0.001972"/>
</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-10-16T01:17:16.438257" elapsed="0.443729"/>
</kw>
<msg time="2026-10-16T01:17:16.882054" 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-10-16T01:17:16.437740" elapsed="0.444377"/>
</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-10-16T01:17:16.437291" elapsed="0.444925"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:17:16.882930" 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-10-16T01:17:16.882482" elapsed="0.000482"/>
</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-10-16T01:17:16.887609" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:17:16.887129" elapsed="0.000515"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:17:16.888250" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:17:16.887874" elapsed="0.000409"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:17:16.888340" elapsed="0.000036"/>
</return>
<msg time="2026-10-16T01:17:16.888517" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:17:16.886597" elapsed="0.001970"/>
</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-10-16T01:17:16.892243" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:17:16.891870" elapsed="0.000406"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:17:16.892333" elapsed="0.000035"/>
</return>
<msg time="2026-10-16T01:17:16.892500" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:17:16.891371" elapsed="0.001178"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:16.894200" 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-10-16T01:17:16.893887" elapsed="0.000371"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:16.894864" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:17:16.894517" elapsed="0.000402"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:17:16.900065" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:17:16.900147" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:17:16.900291" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:16.895340" elapsed="0.005517">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:17:16.895002" elapsed="0.005962">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:16.901216" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:16.901006" elapsed="0.000291"/>
</branch>
<status status="FAIL" start="2026-10-16T01:17:16.894979" elapsed="0.006349">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:16.901838" elapsed="0.000034"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:16.902052" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:16.902006" elapsed="0.000098"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:17:16.901983" elapsed="0.000149"/>
</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-10-16T01:17:16.902325" elapsed="0.000027"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:17:16.902412" elapsed="0.000019"/>
</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-10-16T01:17:16.893000" elapsed="0.009574">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:16.902652" 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-10-16T01:17:16.890804" elapsed="0.011990">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:16.903104" elapsed="0.000032"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:17:16.888832" elapsed="0.014371">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:17:16.888641" elapsed="0.014635">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:17:16.885896" elapsed="0.017526">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:17.910483" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:17:17.909598" elapsed="0.000974"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:17:17.911604" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:17:17.910958" elapsed="0.000703"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:17:17.911789" elapsed="0.000075"/>
</return>
<msg time="2026-10-16T01:17:17.912102" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:17:17.908743" elapsed="0.003422"/>
</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-10-16T01:17:17.918254" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:17:17.917592" elapsed="0.000718"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:17:17.918404" elapsed="0.000057"/>
</return>
<msg time="2026-10-16T01:17:17.918741" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:17:17.916848" elapsed="0.001947"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:17.921628" 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-10-16T01:17:17.921092" elapsed="0.000659"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:17.922734" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:17:17.922166" elapsed="0.000661"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:17:17.929596" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:17:17.929763" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:17:17.930090" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:17.923476" elapsed="0.007825">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:17:17.922971" elapsed="0.008497">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:17.931961" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:17.931570" elapsed="0.000527"/>
</branch>
<status status="FAIL" start="2026-10-16T01:17:17.922931" elapsed="0.009217">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:17.932952" elapsed="0.000054"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:17.933220" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:17.933147" elapsed="0.000158"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:17:17.933112" 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-10-16T01:17:17.933679" elapsed="0.000070"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:17:17.933848" elapsed="0.000031"/>
</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-10-16T01:17:17.919553" elapsed="0.014507">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:17.934178" elapsed="0.000031"/>
</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-10-16T01:17:17.915886" elapsed="0.018477">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:17.934866" elapsed="0.000050"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:17:17.912564" elapsed="0.022457">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:17:17.912285" elapsed="0.022849">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:17:17.907339" elapsed="0.027975">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:18.942333" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:17:18.941446" elapsed="0.000950"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:17:18.943417" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:17:18.942796" elapsed="0.000676"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:17:18.943588" elapsed="0.000072"/>
</return>
<msg time="2026-10-16T01:17:18.943926" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:17:18.940601" elapsed="0.003376"/>
</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-10-16T01:17:18.949863" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:17:18.949209" elapsed="0.000709"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:17:18.950010" elapsed="0.000056"/>
</return>
<msg time="2026-10-16T01:17:18.950278" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:17:18.948449" elapsed="0.001879"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:18.953030" 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-10-16T01:17:18.952462" elapsed="0.000660"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:18.954194" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:17:18.953669" 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-10-16T01:17:18.960680" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:17:18.960833" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:17:18.961056" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:18.954989" elapsed="0.007277">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:17:18.954428" elapsed="0.008006">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:18.962938" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:18.962506" elapsed="0.000568"/>
</branch>
<status status="FAIL" start="2026-10-16T01:17:18.954388" elapsed="0.008736">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:18.963938" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:18.964205" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:18.964132" elapsed="0.000156"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:17:18.964097" 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-10-16T01:17:18.964661" elapsed="0.000071"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:17:18.964833" elapsed="0.000030"/>
</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-10-16T01:17:18.951047" elapsed="0.013999">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:18.965162" elapsed="0.000031"/>
</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-10-16T01:17:18.947486" elapsed="0.017860">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:18.965847" elapsed="0.000049"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:17:18.944343" elapsed="0.021658">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:17:18.944090" elapsed="0.022025">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:17:18.939349" elapsed="0.026946">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:19.973268" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:17:19.972384" elapsed="0.000950"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:17:19.974346" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:17:19.973727" elapsed="0.000673"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:17:19.974494" elapsed="0.000094"/>
</return>
<msg time="2026-10-16T01:17:19.974856" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:17:19.971547" elapsed="0.003460"/>
</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-10-16T01:17:19.980926" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:17:19.980243" elapsed="0.000739"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:17:19.981074" elapsed="0.000057"/>
</return>
<msg time="2026-10-16T01:17:19.981345" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:17:19.979484" elapsed="0.001911"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:19.984152" 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-10-16T01:17:19.983606" elapsed="0.000640"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:19.985189" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:17:19.984682" elapsed="0.000596"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:17:19.991695" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:17:19.991858" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:17:19.992072" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:19.985985" elapsed="0.007294">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:17:19.985421" elapsed="0.008022">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:19.993915" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:19.993514" elapsed="0.000534"/>
</branch>
<status status="FAIL" start="2026-10-16T01:17:19.985383" elapsed="0.008718">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:19.994887" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:19.995152" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:19.995079" elapsed="0.000157"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:17:19.995044" 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-10-16T01:17:19.995608" elapsed="0.000044"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:17:19.995778" 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-10-16T01:17:19.982165" elapsed="0.013828">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:19.996110" elapsed="0.000031"/>
</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-10-16T01:17:19.978538" elapsed="0.017757">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:19.996800" elapsed="0.000068"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:17:19.975381" elapsed="0.021594">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:17:19.975124" elapsed="0.021963">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:17:19.970236" elapsed="0.027107">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:21.004188" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:17:21.003301" elapsed="0.000952"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:17:21.005285" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:17:21.004618" elapsed="0.000724"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:17:21.005439" elapsed="0.000072"/>
</return>
<msg time="2026-10-16T01:17:21.005824" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:17:21.002448" elapsed="0.003428"/>
</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-10-16T01:17:21.012142" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:17:21.011270" elapsed="0.000929"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:17:21.012293" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:17:21.012613" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:17:21.010506" elapsed="0.002163"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:21.015342" 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-10-16T01:17:21.014833" elapsed="0.000603"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:21.016378" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:17:21.015897" elapsed="0.000571"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:17:21.022809" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:17:21.022924" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:17:21.023136" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:21.017177" elapsed="0.007275">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:17:21.016636" elapsed="0.008009">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:21.025087" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:21.024747" elapsed="0.000469"/>
</branch>
<status status="FAIL" start="2026-10-16T01:17:21.016597" elapsed="0.008669">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:21.026056" elapsed="0.000052"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:21.026322" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:21.026249" elapsed="0.000156"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:17:21.026213" 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-10-16T01:17:21.026813" elapsed="0.000046"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:17:21.026957" elapsed="0.000030"/>
</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-10-16T01:17:21.013376" elapsed="0.013890">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:21.027387" 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-10-16T01:17:21.009558" elapsed="0.018044">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:21.028093" elapsed="0.000050"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:17:21.006246" elapsed="0.022002">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:17:21.005990" elapsed="0.022373">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:17:21.001210" elapsed="0.027359">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:22.035449" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:17:22.034570" elapsed="0.000968"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:17:22.036560" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:17:22.035919" elapsed="0.000699"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:17:22.036745" elapsed="0.000076"/>
</return>
<msg time="2026-10-16T01:17:22.037061" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:17:22.033747" elapsed="0.003365"/>
</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-10-16T01:17:22.043079" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:17:22.042406" elapsed="0.000729"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:17:22.043229" elapsed="0.000057"/>
</return>
<msg time="2026-10-16T01:17:22.043496" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:17:22.041673" elapsed="0.001897"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:22.046263" 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-10-16T01:17:22.045747" elapsed="0.000611"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:22.047310" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:17:22.046826" elapsed="0.000573"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:17:22.053821" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:17:22.053947" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:17:22.054165" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:22.048111" elapsed="0.010028">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:17:22.047566" elapsed="0.010743">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:22.058787" elapsed="0.000132"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:22.058381" elapsed="0.000632"/>
</branch>
<status status="FAIL" start="2026-10-16T01:17:22.047501" elapsed="0.011564">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:22.059874" elapsed="0.000055"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:22.060150" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:22.060074" elapsed="0.000164"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:17:22.060037" elapsed="0.000247"/>
</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-10-16T01:17:22.060614" elapsed="0.000045"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:17:22.060788" 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-10-16T01:17:22.044273" elapsed="0.016733">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:22.061126" 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-10-16T01:17:22.040674" elapsed="0.020642">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:22.061825" elapsed="0.000050"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:17:22.037482" elapsed="0.024499">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:17:22.037227" elapsed="0.024871">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:17:22.032451" elapsed="0.029829">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<msg time="2026-10-16T01:17:22.062468" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</msg>
<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="FAIL" start="2026-10-16T01:17:16.883233" elapsed="5.179505">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<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-10-16T01:17:16.436912" elapsed="5.626079">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<doc>Delete bridge with OVS command and verify it gets deleted from all instances.</doc>
<status status="FAIL" start="2026-10-16T01:17:16.002055" elapsed="6.061211">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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-10-16T01:17:22.066849" elapsed="0.000463"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:17:22.066246" elapsed="0.001177"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:22.069497" elapsed="0.000051"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:22.069299" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:22.069262" elapsed="0.000398"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:22.073923" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:22.073735" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:22.073671" elapsed="0.000392"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:17:22.076176" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:17:22.075380" elapsed="0.000854"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:17:22.077294" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:17:22.076656" elapsed="0.000692"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:17:22.077438" elapsed="0.000059"/>
</return>
<msg time="2026-10-16T01:17:22.077778" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:17:22.074498" elapsed="0.003334"/>
</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-10-16T01:17:22.082995" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:22.082875" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:22.082850" 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-10-16T01:17:22.084641" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:22.084506" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:22.084484" elapsed="0.000280"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:22.085287" 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-10-16T01:17:22.084970" elapsed="0.000352"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:22.085832" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:17:22.085559" elapsed="0.000306"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:17:22.123508" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:17:22.086667" elapsed="0.037048"/>
</kw>
<msg time="2026-10-16T01:17:22.123900" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:17:22.123942" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:22.086078" elapsed="0.037899"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:17:22.197434" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:22.124574" elapsed="0.073055"/>
</kw>
<msg time="2026-10-16T01:17:22.197819" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:17:22.197863" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:22.124140" elapsed="0.073757"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:22.198179" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:22.197969" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:22.197951" elapsed="0.000324"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:22.198833" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:22.198454" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:22.199168" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:22.198971" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:22.198954" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:17:22.199292" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:22.201804" 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-10-16T01:17:22.203499" elapsed="0.000511"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:22.205198" elapsed="0.000311"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:17:22.200104" elapsed="0.005486"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:17:22.199588" elapsed="0.006169"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:17:22.084153" elapsed="0.121682"/>
</kw>
<msg time="2026-10-16T01:17:22.205917" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:22.205957" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:22.083290" elapsed="0.122701"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:17:22.206146" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:17:22.206061" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:22.206044" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:17:22.206558" 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-10-16T01:17:22.206875" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:17:22.206940" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:17:22.082427" elapsed="0.124596"/>
</kw>
<msg time="2026-10-16T01:17:22.207105" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:22.207144" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:22.078569" elapsed="0.128608"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:22.207459" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:22.207244" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:22.207228" elapsed="0.000318"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:17:22.078243" elapsed="0.129325"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:22.210240" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:22.210157" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:22.210140" elapsed="0.000162"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:22.211389" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:22.211307" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:22.211290" elapsed="0.000161"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:22.211858" 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-10-16T01:17:22.211606" elapsed="0.000277"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:22.212211" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:17:22.212042" elapsed="0.000193"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:17:22.248774" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:17:22.212948" elapsed="0.035999"/>
</kw>
<msg time="2026-10-16T01:17:22.249123" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:17:22.249164" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:22.212387" elapsed="0.036810"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:17:22.318486" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:22.249822" elapsed="0.068956"/>
</kw>
<msg time="2026-10-16T01:17:22.318994" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:17:22.319036" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:22.249361" elapsed="0.069711"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:22.319563" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:22.319247" elapsed="0.000394"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:22.319211" elapsed="0.000460"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:22.320317" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:22.319878" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:22.320669" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:22.320457" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:22.320441" elapsed="0.000338"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:17:22.320814" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:22.323509" 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-10-16T01:17:22.325282" elapsed="0.000518"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:22.327181" 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-10-16T01:17:22.321778" elapsed="0.005799"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:17:22.321159" elapsed="0.006550"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:17:22.211052" elapsed="0.116739"/>
</kw>
<msg time="2026-10-16T01:17:22.327878" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:22.327918" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:22.210448" elapsed="0.117506"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:17:22.328109" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:17:22.328023" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:22.328007" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:17:22.328538" 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-10-16T01:17:22.328937" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:17:22.329002" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:17:22.209867" elapsed="0.119222"/>
</kw>
<msg time="2026-10-16T01:17:22.329177" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:22.329218" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:22.207841" elapsed="0.121413"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:22.329561" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:22.329323" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:22.329307" elapsed="0.000326"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:17:22.207678" elapsed="0.121977"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:22.332324" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:22.332240" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:22.332224" elapsed="0.000162"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:22.333480" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:22.333397" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:22.333380" elapsed="0.000177"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:22.333956" 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-10-16T01:17:22.333722" elapsed="0.000289"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:22.334354" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:17:22.334177" elapsed="0.000201"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:17:22.371317" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:17:22.334982" elapsed="0.036523"/>
</kw>
<msg time="2026-10-16T01:17:22.371737" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:17:22.371780" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:22.334550" elapsed="0.037266"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:17:22.451398" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:22.372401" elapsed="0.079360"/>
</kw>
<msg time="2026-10-16T01:17:22.451919" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:17:22.451960" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:22.371982" elapsed="0.080012"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:22.452262" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:22.452062" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:22.452045" elapsed="0.000309"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:22.452902" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:22.452549" elapsed="0.000430"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:22.453240" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:22.453039" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:22.453023" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:17:22.453362" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:22.455801" 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-10-16T01:17:22.457468" elapsed="0.000482"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:22.459111" elapsed="0.000305"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:17:22.454159" elapsed="0.005321"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:17:22.453643" 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-10-16T01:17:22.333141" elapsed="0.126547"/>
</kw>
<msg time="2026-10-16T01:17:22.460034" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:22.460073" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:22.332547" elapsed="0.127562"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:17:22.460260" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:17:22.460177" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:22.460160" elapsed="0.000176"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:17:22.460663" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:22.460990" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:17:22.461101" 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-10-16T01:17:22.331942" elapsed="0.129253"/>
</kw>
<msg time="2026-10-16T01:17:22.461282" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:22.461322" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:22.329940" elapsed="0.131418"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:22.461672" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:22.461430" elapsed="0.000371"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:22.461413" elapsed="0.000412"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:17:22.329799" elapsed="0.132049"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:17:22.077938" elapsed="0.383941"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:17:22.073042" elapsed="0.388895"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:17:22.068729" elapsed="0.393261"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:22.067803" elapsed="0.394236"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:17:22.065346" elapsed="0.396744"/>
</kw>
<kw name="Verify Sample Port Is Modified" owner="ClusterOvsdb">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:17:22.464433" 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-10-16T01:17:22.464081" elapsed="0.000377"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:17:22.468957" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:17:22.467656" elapsed="0.001338">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:17:23.478983" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:17:23.475962" elapsed="0.003122">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:17:24.488809" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:17:24.485835" elapsed="0.003072">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:17:25.498578" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:17:25.495587" elapsed="0.003086">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:17:26.508836" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:17:26.505799" elapsed="0.003142">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:17:27.520226" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:17:27.516838" elapsed="0.003490">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<msg time="2026-10-16T01:17:27.520581" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: Variable '${ovsdb_uuid}' not found.</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-10-16T01:17:22.464673" elapsed="5.056284">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: Variable '${ovsdb_uuid}' not found.</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-10-16T01:17:22.463684" elapsed="5.057676">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: Variable '${ovsdb_uuid}' not found.</status>
</kw>
<doc>Verify modified port exists in all instances.</doc>
<status status="FAIL" start="2026-10-16T01:17:22.064224" elapsed="5.457527">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: Variable '${ovsdb_uuid}' not found.</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-10-16T01:17:27.526027" elapsed="0.000561"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:17:27.525262" elapsed="0.001577"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:27.529184" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:27.528925" elapsed="0.000374"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:27.528873" elapsed="0.000479"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:27.534573" elapsed="0.000041"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:27.534333" elapsed="0.000402"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:27.534292" elapsed="0.000514"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:17:27.537437" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:17:27.536475" elapsed="0.001023"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:17:27.538811" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:17:27.538031" elapsed="0.000847"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:17:27.538977" elapsed="0.000066"/>
</return>
<msg time="2026-10-16T01:17:27.539289" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:17:27.535473" elapsed="0.003871"/>
</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-10-16T01:17:27.546383" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:27.546174" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:27.546132" elapsed="0.000439"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:27.549627" elapsed="0.000042"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:27.549376" elapsed="0.000420"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:27.549336" elapsed="0.000529"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:27.550941" 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-10-16T01:17:27.550239" elapsed="0.000766"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:27.551955" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:17:27.551408" elapsed="0.000628"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:17:27.606925" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:17:27.553618" elapsed="0.053511"/>
</kw>
<msg time="2026-10-16T01:17:27.607320" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:17:27.607362" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:27.552411" elapsed="0.054987"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:17:27.688445" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:27.608113" elapsed="0.080644"/>
</kw>
<msg time="2026-10-16T01:17:27.688974" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:17:27.689016" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:27.607623" elapsed="0.081430"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:27.689553" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:27.689232" elapsed="0.000400"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:27.689198" elapsed="0.000463"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:27.690291" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:27.689868" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:27.690724" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:27.690433" elapsed="0.000381"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:27.690416" elapsed="0.000428"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:17:27.690889" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:27.693556" 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-10-16T01:17:27.695304" elapsed="0.000529"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:27.697050" 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-10-16T01:17:27.691827" elapsed="0.005604"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:17:27.691240" elapsed="0.006335"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:17:27.548658" elapsed="0.149007"/>
</kw>
<msg time="2026-10-16T01:17:27.697797" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:27.697839" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:27.547036" elapsed="0.150838"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:17:27.698031" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:17:27.697944" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:27.697928" elapsed="0.000183"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:17:27.698447" 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-10-16T01:17:27.699053" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:17:27.699120" elapsed="0.000021"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:17:27.545304" elapsed="0.153912"/>
</kw>
<msg time="2026-10-16T01:17:27.699305" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:27.699347" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:27.540281" elapsed="0.159104"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:27.700454" elapsed="0.000087"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:27.699454" elapsed="0.001196"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:27.699439" elapsed="0.001302"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:17:27.539939" elapsed="0.160863"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:27.704598" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:27.704483" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:27.704463" 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-10-16T01:17:27.705845" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:27.705759" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:27.705742" elapsed="0.000166"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:27.706381" 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-10-16T01:17:27.706052" elapsed="0.000357"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:27.706792" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:17:27.706590" elapsed="0.000227"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:17:27.743676" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:17:27.707390" elapsed="0.036516"/>
</kw>
<msg time="2026-10-16T01:17:27.744075" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:17:27.744117" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:27.706976" elapsed="0.037175"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:17:27.835365" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:27.744797" elapsed="0.090769"/>
</kw>
<msg time="2026-10-16T01:17:27.835753" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:17:27.835796" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:27.744318" elapsed="0.091514"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:27.836111" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:27.835903" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:27.835884" elapsed="0.000321"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:27.836763" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:27.836388" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:27.837108" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:27.836906" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:27.836890" elapsed="0.000310"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:17:27.837230" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:27.839797" 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-10-16T01:17:27.841504" elapsed="0.000518"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:27.843211" 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-10-16T01:17:27.838079" elapsed="0.005525"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:17:27.837558" elapsed="0.006187"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:17:27.705461" elapsed="0.138363"/>
</kw>
<msg time="2026-10-16T01:17:27.843907" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:27.843946" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:27.704831" elapsed="0.139151"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:17:27.844140" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:17:27.844050" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:27.844033" elapsed="0.000184"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:17:27.844564" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:27.844893" elapsed="0.000059"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:17:27.844997" 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-10-16T01:17:27.704127" elapsed="0.140958"/>
</kw>
<msg time="2026-10-16T01:17:27.845168" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:27.845209" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:27.701478" elapsed="0.143767"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:27.845570" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:27.845313" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:27.845297" elapsed="0.000347"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:17:27.701149" elapsed="0.144517"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:27.848480" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:27.848396" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:27.848379" elapsed="0.000181"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:27.849725" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:27.849620" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:27.849603" elapsed="0.000186"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:27.850153" 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-10-16T01:17:27.849930" elapsed="0.000247"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:27.850501" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:17:27.850333" elapsed="0.000207"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:17:27.876852" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:17:27.851117" elapsed="0.025924"/>
</kw>
<msg time="2026-10-16T01:17:27.877195" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:17:27.877236" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:27.850692" elapsed="0.026579"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:17:27.933562" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:27.877891" elapsed="0.056100"/>
</kw>
<msg time="2026-10-16T01:17:27.934294" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:17:27.934377" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:27.877437" elapsed="0.056992"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:27.935020" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:27.934595" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:27.934549" elapsed="0.000614"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:27.936072" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:27.935422" elapsed="0.000769"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:27.936577" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:27.936277" elapsed="0.000398"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:27.936254" elapsed="0.000480"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:17:27.936783" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:27.940455" elapsed="0.000847"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:17:27.943249" elapsed="0.000718"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:27.945719" elapsed="0.000442"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:17:27.938018" elapsed="0.008236"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:17:27.937230" elapsed="0.009188"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:17:27.849304" elapsed="0.097242"/>
</kw>
<msg time="2026-10-16T01:17:27.946687" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:27.946869" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:27.848724" elapsed="0.098193"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:17:27.947143" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-10-16T01:17:27.947017" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:27.946993" 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 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-10-16T01:17:27.947773" elapsed="0.000034"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:27.948208" elapsed="0.000031"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:17:27.948298" 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-10-16T01:17:27.848104" elapsed="0.100315"/>
</kw>
<msg time="2026-10-16T01:17:27.948555" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:27.948613" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:27.845946" elapsed="0.102717"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:27.949192" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:27.948880" elapsed="0.000380"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:27.948856" elapsed="0.000436"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:17:27.845803" elapsed="0.103519"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:17:27.539461" elapsed="0.409905"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:17:27.533467" elapsed="0.415979"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:17:27.528201" elapsed="0.421337"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:27.527182" elapsed="0.422420"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:17:27.523980" elapsed="0.425695"/>
</kw>
<kw name="Delete Sample Port And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:17:27.955187" 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-10-16T01:17:27.953642" elapsed="0.001584">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-10-16T01:17:27.522255" elapsed="0.433117">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-10-16T01:17:27.957405" elapsed="0.000222"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:17:27.957164" 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-10-16T01:17:27.958587" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:27.958485" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:27.958468" elapsed="0.000182"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:27.960543" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:27.960445" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:27.960428" elapsed="0.000212"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:17:27.961554" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:17:27.961212" elapsed="0.000368"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:17:27.962016" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:17:27.961744" elapsed="0.000296"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:17:27.962080" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:17:27.962206" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:17:27.960861" elapsed="0.001367"/>
</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-10-16T01:17:27.964790" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:27.964690" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:27.964673" elapsed="0.000181"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:27.965951" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:27.965866" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:27.965850" elapsed="0.000167"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:27.966388" 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-10-16T01:17:27.966158" elapsed="0.000254"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:27.966781" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:17:27.966584" elapsed="0.000221"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:17:28.008641" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:17:27.967358" elapsed="0.041506"/>
</kw>
<msg time="2026-10-16T01:17:28.009044" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:17:28.009086" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:27.966955" elapsed="0.042167"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:17:28.102132" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:28.009817" elapsed="0.092510"/>
</kw>
<msg time="2026-10-16T01:17:28.102486" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:17:28.102550" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:28.009310" elapsed="0.093276"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:28.102915" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:28.102669" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:28.102646" elapsed="0.000367"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:28.103561" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:28.103199" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:28.103929" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:28.103730" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:28.103692" elapsed="0.000331"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:17:28.104055" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:28.106634" 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-10-16T01:17:28.108446" elapsed="0.000522"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:28.110182" 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-10-16T01:17:28.104922" elapsed="0.005668"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:17:28.104372" elapsed="0.006523"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:17:27.965588" elapsed="0.145388"/>
</kw>
<msg time="2026-10-16T01:17:28.111064" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:28.111103" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:27.965000" elapsed="0.146139"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:17:28.111293" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:17:28.111208" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:28.111191" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:17:28.111741" 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-10-16T01:17:28.112044" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:17:28.112106" 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-10-16T01:17:27.964387" elapsed="0.147805"/>
</kw>
<msg time="2026-10-16T01:17:28.112278" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:28.112317" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:27.962582" elapsed="0.149770"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:28.112653" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:28.112420" elapsed="0.000406"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:28.112405" elapsed="0.000446"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:17:27.962430" elapsed="0.150443"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:28.115441" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:28.115357" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:28.115340" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:28.116610" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:28.116526" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:28.116494" elapsed="0.000178"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:28.117072" 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-10-16T01:17:28.116838" elapsed="0.000258"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:28.117432" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:17:28.117254" elapsed="0.000202"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:17:28.154165" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:17:28.118059" elapsed="0.036304"/>
</kw>
<msg time="2026-10-16T01:17:28.154531" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:17:28.154574" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:28.117623" elapsed="0.036987"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:17:28.243869" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:28.155216" elapsed="0.088915"/>
</kw>
<msg time="2026-10-16T01:17:28.244305" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:17:28.244348" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:28.154799" elapsed="0.089586"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:28.244758" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:28.244467" elapsed="0.000365"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:28.244444" elapsed="0.000413"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:28.245429" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:28.245050" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:28.245813" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:28.245599" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:28.245582" elapsed="0.000325"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:17:28.245939" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:28.248485" 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-10-16T01:17:28.250222" elapsed="0.000501"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:28.252101" elapsed="0.000309"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:17:28.246815" elapsed="0.005662"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:17:28.246248" elapsed="0.006358"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:17:28.116257" elapsed="0.136428"/>
</kw>
<msg time="2026-10-16T01:17:28.252786" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:28.252825" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:28.115665" elapsed="0.137195"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:17:28.253012" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:17:28.252928" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:28.252911" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:17:28.253412" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:28.253820" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:17:28.253887" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:17:28.115057" elapsed="0.138916"/>
</kw>
<msg time="2026-10-16T01:17:28.254059" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:28.254099" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:28.113136" elapsed="0.141004"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:28.254431" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:28.254209" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:28.254193" elapsed="0.000310"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:17:28.112997" elapsed="0.141543"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:28.258731" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:28.258631" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:28.258614" 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-10-16T01:17:28.259921" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:28.259838" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:28.259821" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:28.260362" 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-10-16T01:17:28.260131" elapsed="0.000255"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:28.260752" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:17:28.260557" elapsed="0.000220"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:17:28.295652" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:17:28.261336" elapsed="0.034576"/>
</kw>
<msg time="2026-10-16T01:17:28.296116" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:17:28.296159" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:28.260930" elapsed="0.035262"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:17:28.379635" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:28.296952" elapsed="0.082895"/>
</kw>
<msg time="2026-10-16T01:17:28.380008" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:17:28.380050" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:28.296412" elapsed="0.083672"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:28.380401" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:28.380171" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:28.380147" elapsed="0.000352"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:28.381063" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:28.380717" elapsed="0.000433"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:28.381403" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:28.381209" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:28.381193" elapsed="0.000302"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:17:28.381552" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:28.384227" 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-10-16T01:17:28.386014" elapsed="0.000480"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:28.387899" 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-10-16T01:17:28.382445" elapsed="0.005841"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:17:28.381913" elapsed="0.006490"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:17:28.259561" elapsed="0.128919"/>
</kw>
<msg time="2026-10-16T01:17:28.388581" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:28.388622" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:28.258974" elapsed="0.129682"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:17:28.388888" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:17:28.388801" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:28.388782" 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 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-10-16T01:17:28.389360" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:28.389693" elapsed="0.000039"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:17:28.389775" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:17:28.258317" elapsed="0.131545"/>
</kw>
<msg time="2026-10-16T01:17:28.389952" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:28.389993" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:28.254819" elapsed="0.135208"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:28.390318" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:28.390096" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:28.390080" elapsed="0.000308"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:17:28.254664" elapsed="0.135746"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:17:27.962280" elapsed="0.428165"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:17:27.960155" elapsed="0.430349"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:17:27.958226" elapsed="0.432352"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:27.957839" elapsed="0.432784"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:17:27.956821" elapsed="0.433852"/>
</kw>
<kw name="Delete Sample Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:17:28.394848" 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-10-16T01:17:28.393676" elapsed="0.001209">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-10-16T01:17:27.956238" elapsed="0.438795">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-10-16T01:17:28.396554" elapsed="0.000219"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:17:28.396298" 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-10-16T01:17:28.397736" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:28.397633" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:28.397616" elapsed="0.000184"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:28.399665" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:28.399584" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:28.399568" elapsed="0.000175"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:17:28.400634" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:17:28.400293" elapsed="0.000366"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:17:28.401101" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:17:28.400828" elapsed="0.000297"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:17:28.401166" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:17:28.401289" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:17:28.399946" elapsed="0.001365"/>
</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-10-16T01:17:28.403896" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:28.403812" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:28.403795" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:28.405096" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:28.405013" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:28.404997" elapsed="0.000161"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:28.405557" 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-10-16T01:17:28.405300" elapsed="0.000282"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:28.405938" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:17:28.405759" elapsed="0.000203"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:17:28.443620" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:17:28.406537" elapsed="0.037291"/>
</kw>
<msg time="2026-10-16T01:17:28.444001" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:17:28.444043" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:28.406113" elapsed="0.037965"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:17:28.537741" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:28.444743" elapsed="0.093188"/>
</kw>
<msg time="2026-10-16T01:17:28.538089" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:17:28.538131" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:28.444256" elapsed="0.093910"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:28.538455" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:28.538242" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:28.538222" elapsed="0.000346"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:28.539121" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:28.538777" elapsed="0.000425"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:28.539458" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:28.539262" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:28.539246" elapsed="0.000322"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:17:28.539599" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:28.542171" 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-10-16T01:17:28.543995" elapsed="0.000464"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:28.545733" 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-10-16T01:17:28.540427" elapsed="0.005686"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:17:28.539919" elapsed="0.006310"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:17:28.404716" elapsed="0.141590"/>
</kw>
<msg time="2026-10-16T01:17:28.546392" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:28.546432" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:28.404104" elapsed="0.142361"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:17:28.546639" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:17:28.546551" elapsed="0.000351"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:28.546533" elapsed="0.000409"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:17:28.547273" elapsed="0.000076"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:28.547651" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:17:28.547735" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:17:28.403492" elapsed="0.144334"/>
</kw>
<msg time="2026-10-16T01:17:28.547911" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:28.547951" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:28.401682" elapsed="0.146303"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:28.548272" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:28.548052" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:28.548036" elapsed="0.000307"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:17:28.401540" elapsed="0.146825"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:28.551040" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:28.550956" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:28.550938" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:28.552201" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:28.552118" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:28.552101" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:28.552768" 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-10-16T01:17:28.552404" elapsed="0.000389"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:28.553133" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:17:28.552953" elapsed="0.000204"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:17:28.587665" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:17:28.553841" elapsed="0.034015"/>
</kw>
<msg time="2026-10-16T01:17:28.588012" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:17:28.588054" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:28.553307" elapsed="0.034780"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:17:28.663911" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:28.588686" elapsed="0.075424"/>
</kw>
<msg time="2026-10-16T01:17:28.664280" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:17:28.664322" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:28.588250" elapsed="0.076107"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:28.664681" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:28.664441" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:28.664418" elapsed="0.000385"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:28.665352" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:28.664987" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:28.665734" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:28.665502" elapsed="0.000353"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:28.665485" elapsed="0.000394"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:17:28.665911" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:28.668467" 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-10-16T01:17:28.670230" elapsed="0.000494"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:28.672090" elapsed="0.000303"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:17:28.666777" elapsed="0.005682"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:17:28.666221" elapsed="0.006368"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:17:28.551863" elapsed="0.120803"/>
</kw>
<msg time="2026-10-16T01:17:28.672773" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:28.672813" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:28.551249" elapsed="0.121599"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:17:28.673001" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:17:28.672917" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:28.672900" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:17:28.673407" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:28.673855" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:17:28.673932" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:17:28.550646" elapsed="0.123375"/>
</kw>
<msg time="2026-10-16T01:17:28.674118" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:28.674159" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:28.548639" elapsed="0.125554"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:28.674494" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:28.674273" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:28.674246" elapsed="0.000358"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:17:28.548485" elapsed="0.126141"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:28.677270" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:28.677186" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:28.677169" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:28.678418" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:28.678335" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:28.678319" elapsed="0.000161"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:28.678886" 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-10-16T01:17:28.678636" elapsed="0.000275"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:28.679247" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:17:28.679074" elapsed="0.000197"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:17:28.713905" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:17:28.679875" elapsed="0.034213"/>
</kw>
<msg time="2026-10-16T01:17:28.714243" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:17:28.714284" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:28.679422" elapsed="0.034898"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:17:28.812666" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:28.715043" elapsed="0.097825"/>
</kw>
<msg time="2026-10-16T01:17:28.813026" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:17:28.813066" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:28.714594" elapsed="0.098507"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:28.813373" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:28.813171" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:28.813153" elapsed="0.000314"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:28.814014" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:28.813664" elapsed="0.000431"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:28.814351" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:28.814155" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:28.814139" elapsed="0.000304"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:17:28.814474" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:28.816968" 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-10-16T01:17:28.818734" elapsed="0.000451"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:28.820551" 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-10-16T01:17:28.815277" elapsed="0.005665"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:17:28.814782" elapsed="0.006276"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:17:28.678082" elapsed="0.143053"/>
</kw>
<msg time="2026-10-16T01:17:28.821216" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:28.821255" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:28.677476" elapsed="0.143815"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:17:28.821443" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:17:28.821359" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:28.821342" elapsed="0.000192"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:17:28.821931" 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-10-16T01:17:28.822231" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:17:28.822296" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:17:28.676890" elapsed="0.145490"/>
</kw>
<msg time="2026-10-16T01:17:28.822463" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:28.822502" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:28.674903" elapsed="0.147649"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:28.822855" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:28.822620" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:28.822604" elapsed="0.000357"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:17:28.674764" elapsed="0.148219"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:17:28.401365" elapsed="0.421645"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:17:28.399283" elapsed="0.423785"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:17:28.397352" elapsed="0.425769"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:28.396968" elapsed="0.426197"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:17:28.395960" elapsed="0.427258"/>
</kw>
<kw name="Create Sample Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:17:28.827540" 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-10-16T01:17:28.826287" elapsed="0.001291">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-10-16T01:17:28.395382" elapsed="0.432357">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-10-16T01:17:28.829283" elapsed="0.000214"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:17:28.829038" 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-10-16T01:17:28.830471" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:28.830383" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:28.830364" 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-10-16T01:17:28.832421" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:28.832338" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:28.832322" elapsed="0.000161"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:17:28.833393" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:17:28.833070" elapsed="0.000349"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:17:28.833877" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:17:28.833589" elapsed="0.000311"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:17:28.833941" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:17:28.834065" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:17:28.832714" elapsed="0.001373"/>
</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-10-16T01:17:28.836635" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:28.836551" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:28.836534" elapsed="0.000177"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:28.837824" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:28.837739" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:28.837721" elapsed="0.000166"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:28.838263" 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-10-16T01:17:28.838031" elapsed="0.000257"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:28.838643" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:17:28.838451" elapsed="0.000216"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:17:28.882010" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:17:28.839255" elapsed="0.042931"/>
</kw>
<msg time="2026-10-16T01:17:28.882345" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:17:28.882387" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:28.838839" elapsed="0.043583"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:17:28.973905" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:28.883113" elapsed="0.090974"/>
</kw>
<msg time="2026-10-16T01:17:28.974242" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:17:28.974284" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:28.882651" elapsed="0.091669"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:28.974610" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:28.974389" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:28.974371" elapsed="0.000359"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:28.975265" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:28.974914" elapsed="0.000431"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:28.975623" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:28.975405" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:28.975389" elapsed="0.000350"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:17:28.975770" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:28.978251" 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-10-16T01:17:28.980090" elapsed="0.000482"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:28.981806" elapsed="0.000309"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:17:28.976560" elapsed="0.005620"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:17:28.976052" elapsed="0.006244"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:17:28.837443" elapsed="0.144930"/>
</kw>
<msg time="2026-10-16T01:17:28.982454" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:28.982493" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:28.836860" elapsed="0.145708"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:17:28.982918" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:17:28.982639" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:28.982622" elapsed="0.000374"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:17:28.983315" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:28.983633" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:17:28.983715" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:17:28.836251" elapsed="0.147553"/>
</kw>
<msg time="2026-10-16T01:17:28.983886" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:28.983925" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:28.834426" elapsed="0.149539"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:28.984247" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:28.984031" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:28.984015" elapsed="0.000380"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:17:28.834287" elapsed="0.150134"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:28.987021" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:28.986938" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:28.986920" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:28.988182" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:28.988100" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:28.988084" elapsed="0.000161"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:28.988625" 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-10-16T01:17:28.988386" elapsed="0.000263"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:28.988995" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:17:28.988825" elapsed="0.000194"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:17:29.037495" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:17:28.989597" elapsed="0.048161"/>
</kw>
<msg time="2026-10-16T01:17:29.037938" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:17:29.037980" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:28.989171" elapsed="0.048844"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:17:29.131207" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:29.038654" elapsed="0.092746"/>
</kw>
<msg time="2026-10-16T01:17:29.131576" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:17:29.131618" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:29.038192" elapsed="0.093461"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:29.132003" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:29.131771" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:29.131744" elapsed="0.000360"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:29.132654" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:29.132290" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:29.133018" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:29.132822" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:29.132805" elapsed="0.000311"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:17:29.133151" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:29.135802" elapsed="0.000479"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:17:29.137566" elapsed="0.000516"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:29.139468" 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-10-16T01:17:29.134038" elapsed="0.005854"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:17:29.133482" elapsed="0.006527"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:17:28.987844" elapsed="0.152244"/>
</kw>
<msg time="2026-10-16T01:17:29.140176" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:29.140216" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:28.987228" elapsed="0.153078"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:17:29.140467" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:17:29.140379" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:29.140362" 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 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-10-16T01:17:29.140997" 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-10-16T01:17:29.141307" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:17:29.141371" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:17:28.986633" elapsed="0.154826"/>
</kw>
<msg time="2026-10-16T01:17:29.141566" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:29.141607" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:28.984686" elapsed="0.156956"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:29.141949" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:29.141729" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:29.141712" elapsed="0.000308"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:17:28.984548" elapsed="0.157495"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:29.144755" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:29.144654" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:29.144636" elapsed="0.000184"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:29.145941" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:29.145858" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:29.145841" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:29.146375" 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-10-16T01:17:29.146145" elapsed="0.000255"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:29.146769" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:17:29.146573" elapsed="0.000221"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:17:29.183072" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:17:29.147356" elapsed="0.035896"/>
</kw>
<msg time="2026-10-16T01:17:29.183411" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:17:29.183453" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:29.146945" elapsed="0.036544"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:17:29.266607" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:29.184115" elapsed="0.082730"/>
</kw>
<msg time="2026-10-16T01:17:29.267022" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:17:29.267064" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:29.183672" elapsed="0.083427"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:29.267413" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:29.267185" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:29.267162" elapsed="0.000361"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:29.268091" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:29.267726" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:29.268497" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:29.268298" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:29.268282" elapsed="0.000323"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:17:29.268638" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:29.271203" 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-10-16T01:17:29.272955" elapsed="0.000481"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:29.274801" elapsed="0.000309"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:17:29.269494" elapsed="0.005683"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:17:29.268981" elapsed="0.006311"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:17:29.145577" elapsed="0.129794"/>
</kw>
<msg time="2026-10-16T01:17:29.275456" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:29.275497" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:29.144965" elapsed="0.130582"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:17:29.275780" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-10-16T01:17:29.275618" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:29.275601" elapsed="0.000261"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:17:29.276202" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:29.276521" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:17:29.276587" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:17:29.144335" elapsed="0.132340"/>
</kw>
<msg time="2026-10-16T01:17:29.276778" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:29.276824" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:29.142307" elapsed="0.134553"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:29.277150" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:29.276928" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:29.276912" elapsed="0.000310"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:17:29.142171" elapsed="0.135072"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:17:28.834140" elapsed="0.443136"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:17:28.832048" elapsed="0.445288"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:17:28.830125" elapsed="0.447269"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:28.829723" elapsed="0.447716"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:17:28.828679" elapsed="0.448814"/>
</kw>
<kw name="Create Sample Port And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:17:29.281815" 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-10-16T01:17:29.280565" elapsed="0.001287">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-10-16T01:17:28.828083" elapsed="0.453914">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-10-16T01:17:29.283502" elapsed="0.000290"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:17:29.283260" elapsed="0.000618"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:29.284795" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:29.284689" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:29.284672" elapsed="0.000187"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:29.286755" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:29.286655" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:29.286639" elapsed="0.000179"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:17:29.287721" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:17:29.287366" elapsed="0.000382"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:17:29.288169" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:17:29.287899" elapsed="0.000294"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:17:29.288233" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:17:29.288357" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:17:29.287017" elapsed="0.001363"/>
</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-10-16T01:17:29.290927" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:29.290843" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:29.290826" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:29.292083" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:29.292000" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:29.291983" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:29.292569" 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-10-16T01:17:29.292321" elapsed="0.000273"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:29.292949" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:17:29.292772" elapsed="0.000201"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:17:29.327614" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:17:29.293549" elapsed="0.034270"/>
</kw>
<msg time="2026-10-16T01:17:29.327979" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:17:29.328021" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:29.293127" elapsed="0.034929"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:17:29.422557" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:29.328652" elapsed="0.094127"/>
</kw>
<msg time="2026-10-16T01:17:29.422939" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:17:29.422980" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:29.328217" elapsed="0.094798"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:29.423295" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:29.423088" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:29.423068" elapsed="0.000318"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:29.423942" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:29.423581" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:29.424328" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:29.424133" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:29.424115" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:17:29.424453" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:29.426937" elapsed="0.000471"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:17:29.428648" elapsed="0.000481"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:29.430486" 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-10-16T01:17:29.425249" elapsed="0.005639"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:17:29.424757" elapsed="0.006251"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:17:29.291744" elapsed="0.139340"/>
</kw>
<msg time="2026-10-16T01:17:29.431166" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:29.431205" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:29.291135" elapsed="0.140105"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:17:29.431390" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:17:29.431307" elapsed="0.000136"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:29.431291" elapsed="0.000174"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:17:29.431886" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:29.432185" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:17:29.432249" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:17:29.290540" elapsed="0.141792"/>
</kw>
<msg time="2026-10-16T01:17:29.432418" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:29.432458" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:29.288748" elapsed="0.143745"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:29.432832" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:29.432600" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:29.432584" elapsed="0.000319"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:17:29.288592" elapsed="0.144332"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:29.435447" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:29.435364" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:29.435347" elapsed="0.000180"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:29.436685" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:29.436602" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:29.436586" elapsed="0.000186"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:29.437134" 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-10-16T01:17:29.436912" elapsed="0.000246"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:29.437484" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:17:29.437315" elapsed="0.000205"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:17:29.475442" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:17:29.438102" elapsed="0.037549"/>
</kw>
<msg time="2026-10-16T01:17:29.475903" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:17:29.475946" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:29.437673" elapsed="0.038309"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:17:29.575008" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:29.476629" elapsed="0.098581"/>
</kw>
<msg time="2026-10-16T01:17:29.575367" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:17:29.575408" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:29.476161" elapsed="0.099283"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:29.575798" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:29.575547" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:29.575521" elapsed="0.000377"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:29.576419" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:29.576078" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:29.576810" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:29.576589" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:29.576572" elapsed="0.000332"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:17:29.576937" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:29.579532" 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-10-16T01:17:29.581309" elapsed="0.000510"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:29.583201" 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-10-16T01:17:29.577815" elapsed="0.005782"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:17:29.577263" elapsed="0.006468"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:17:29.436329" elapsed="0.147479"/>
</kw>
<msg time="2026-10-16T01:17:29.583892" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:29.583932" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:29.435673" elapsed="0.148297"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:17:29.584123" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:17:29.584040" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:29.584023" elapsed="0.000177"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:17:29.584558" 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-10-16T01:17:29.584914" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:17:29.584979" 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-10-16T01:17:29.435075" elapsed="0.149993"/>
</kw>
<msg time="2026-10-16T01:17:29.585154" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:29.585193" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:29.433163" elapsed="0.152069"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:29.585570" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:29.585336" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:29.585320" elapsed="0.000322"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:17:29.433030" elapsed="0.152634"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:29.589985" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:29.589900" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:29.589883" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:29.591173" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:29.591090" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:29.591073" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:29.591648" 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-10-16T01:17:29.591377" elapsed="0.000295"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:29.592037" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:17:29.591857" elapsed="0.000204"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:17:29.626552" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:17:29.592651" elapsed="0.034126"/>
</kw>
<msg time="2026-10-16T01:17:29.626939" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:17:29.626981" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:29.592211" elapsed="0.034805"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:17:29.722083" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:29.627621" elapsed="0.094681"/>
</kw>
<msg time="2026-10-16T01:17:29.722474" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:17:29.722530" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:29.627179" elapsed="0.095388"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:29.722900" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:29.722652" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:29.722629" elapsed="0.000367"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:29.723587" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:29.723181" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:29.723956" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:29.723762" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:29.723745" elapsed="0.000304"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:17:29.724080" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:29.726660" 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-10-16T01:17:29.728472" elapsed="0.000521"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:29.730372" 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-10-16T01:17:29.724948" elapsed="0.005844"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:17:29.724393" elapsed="0.006516"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:17:29.590832" elapsed="0.140213"/>
</kw>
<msg time="2026-10-16T01:17:29.731131" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:29.731172" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:29.590198" elapsed="0.141010"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:17:29.731363" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:17:29.731278" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:29.731261" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:17:29.731876" 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-10-16T01:17:29.732187" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:17:29.732251" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:17:29.589566" elapsed="0.142771"/>
</kw>
<msg time="2026-10-16T01:17:29.732426" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:29.732465" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:29.586026" elapsed="0.146474"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:29.732819" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:29.732585" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:29.732568" elapsed="0.000323"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:17:29.585889" elapsed="0.147023"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:17:29.288432" elapsed="0.444513"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:17:29.286349" elapsed="0.446653"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:17:29.284416" elapsed="0.448640"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:29.284026" elapsed="0.449073"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:17:29.282922" elapsed="0.450228"/>
</kw>
<kw name="Modify the destination IP of Sample Port" owner="ClusterOvsdb">
<msg time="2026-10-16T01:17:29.736229" 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-10-16T01:17:29.734980" elapsed="0.001286">Variable '${original_owner}' not found.</status>
</kw>
<doc>Modify the dst ip of existing port in Owner.</doc>
<status status="FAIL" start="2026-10-16T01:17:29.282357" elapsed="0.454052">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-10-16T01:17:29.737923" elapsed="0.000200"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:17:29.737664" elapsed="0.000509"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:29.739082" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:29.738999" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:29.738982" elapsed="0.000165"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:29.741025" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:29.740943" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:29.740927" elapsed="0.000159"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:17:29.741996" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:17:29.741654" elapsed="0.000367"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:17:29.742440" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:17:29.742170" elapsed="0.000293"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:17:29.742503" elapsed="0.000080"/>
</return>
<msg time="2026-10-16T01:17:29.742689" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:17:29.741288" elapsed="0.001441"/>
</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-10-16T01:17:29.745239" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:29.745154" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:29.745138" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:29.746411" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:29.746329" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:29.746312" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:29.746892" 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-10-16T01:17:29.746634" elapsed="0.000283"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:29.747253" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:17:29.747076" elapsed="0.000201"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:17:29.786241" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:17:29.747951" elapsed="0.038471"/>
</kw>
<msg time="2026-10-16T01:17:29.786603" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:17:29.786644" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:29.747429" elapsed="0.039249"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:17:29.867033" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:29.787289" elapsed="0.079954"/>
</kw>
<msg time="2026-10-16T01:17:29.867414" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:17:29.867456" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:29.786864" elapsed="0.080628"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:29.867864" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:29.867592" elapsed="0.000346"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:29.867569" elapsed="0.000395"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:29.868525" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:29.868151" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:29.868890" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:29.868669" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:29.868653" elapsed="0.000331"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:17:29.869016" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:29.871539" 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-10-16T01:17:29.873263" elapsed="0.000503"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:29.875169" 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-10-16T01:17:29.869863" 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-10-16T01:17:29.869315" elapsed="0.006368"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:17:29.746074" elapsed="0.129766"/>
</kw>
<msg time="2026-10-16T01:17:29.875928" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:29.875968" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:29.745446" elapsed="0.130559"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:17:29.876157" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:17:29.876073" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:29.876057" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:17:29.876580" 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-10-16T01:17:29.876983" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:17:29.877049" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:17:29.744866" elapsed="0.132270"/>
</kw>
<msg time="2026-10-16T01:17:29.877220" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:29.877261" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:29.743070" elapsed="0.134225"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:29.877645" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:29.877364" elapsed="0.000347"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:29.877348" elapsed="0.000387"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:17:29.742932" elapsed="0.134825"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:29.880386" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:29.880303" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:29.880285" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:29.881664" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:29.881580" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:29.881563" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:29.882126" 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-10-16T01:17:29.881896" elapsed="0.000255"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:29.882482" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:17:29.882309" elapsed="0.000216"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:17:29.917576" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:17:29.883113" elapsed="0.034684"/>
</kw>
<msg time="2026-10-16T01:17:29.917955" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:17:29.917996" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:29.882680" elapsed="0.035351"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:17:29.993551" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:29.918640" elapsed="0.075117"/>
</kw>
<msg time="2026-10-16T01:17:29.993920" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:17:29.993961" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:29.918204" elapsed="0.075793"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:29.994275" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:29.994069" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:29.994050" elapsed="0.000367"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:29.994975" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:29.994614" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:29.995350" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:29.995139" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:29.995119" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:17:29.995476" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:29.997974" 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-10-16T01:17:29.999731" elapsed="0.000456"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:30.001558" 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-10-16T01:17:29.996277" elapsed="0.005668"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:17:29.995789" elapsed="0.006270"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:17:29.881306" elapsed="0.120830"/>
</kw>
<msg time="2026-10-16T01:17:30.002219" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:30.002258" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:29.880609" elapsed="0.121685"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:17:30.002446" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:17:30.002362" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:30.002345" elapsed="0.000195"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:17:30.002907" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:30.003210" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:17:30.003273" 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-10-16T01:17:29.880003" elapsed="0.123355"/>
</kw>
<msg time="2026-10-16T01:17:30.003441" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:30.003481" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:29.878016" elapsed="0.125566"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:30.003915" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:30.003653" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:30.003637" elapsed="0.000350"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:17:29.877877" elapsed="0.126131"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:30.006644" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:30.006560" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:30.006542" elapsed="0.000182"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:30.007825" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:30.007740" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:30.007723" elapsed="0.000165"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:30.008248" 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-10-16T01:17:30.008027" elapsed="0.000245"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:30.008649" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:17:30.008430" elapsed="0.000244"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:17:30.044029" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:17:30.009255" elapsed="0.034952"/>
</kw>
<msg time="2026-10-16T01:17:30.044363" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:17:30.044405" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:30.008847" elapsed="0.035593"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:17:30.133858" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:30.045066" elapsed="0.089018"/>
</kw>
<msg time="2026-10-16T01:17:30.134270" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:17:30.134311" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:30.044621" elapsed="0.089726"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:30.134739" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:30.134445" elapsed="0.000368"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:30.134415" elapsed="0.000424"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:30.135414" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:30.135028" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:30.135794" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:30.135580" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:30.135562" elapsed="0.000325"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:17:30.135919" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:30.138491" 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-10-16T01:17:30.140260" elapsed="0.000516"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:30.142004" 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-10-16T01:17:30.136790" elapsed="0.005601"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:17:30.136238" elapsed="0.006324"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:17:30.007447" elapsed="0.135196"/>
</kw>
<msg time="2026-10-16T01:17:30.143010" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:30.143053" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:30.006871" elapsed="0.136218"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:17:30.143245" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:17:30.143159" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:30.143143" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:17:30.143671" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:30.143997" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:17:30.144061" 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-10-16T01:17:30.006257" elapsed="0.137895"/>
</kw>
<msg time="2026-10-16T01:17:30.144296" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:30.144337" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:30.004257" elapsed="0.140116"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:30.144685" elapsed="0.000081"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:30.144444" elapsed="0.000354"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:30.144427" elapsed="0.000394"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:17:30.004122" elapsed="0.140721"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:17:29.742782" elapsed="0.402097"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:17:29.740642" elapsed="0.404298"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:17:29.738738" elapsed="0.406261"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:29.738314" elapsed="0.406733"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:17:29.737299" elapsed="0.407803"/>
</kw>
<kw name="Verify Sample Port Is Modified" owner="ClusterOvsdb">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:17:30.147481" 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-10-16T01:17:30.147146" elapsed="0.000375"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:17:30.152011" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:17:30.150724" elapsed="0.001325">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:17:31.161982" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:17:31.158916" elapsed="0.003165">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:17:32.171948" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:17:32.168941" elapsed="0.003104">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:17:33.181931" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:17:33.178823" elapsed="0.003206">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:17:34.191866" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:17:34.188859" elapsed="0.003107">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:17:35.202269" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:17:35.199259" elapsed="0.003106">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<msg time="2026-10-16T01:17:35.202601" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: Variable '${ovsdb_uuid}' not found.</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-10-16T01:17:30.147741" elapsed="5.055171">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: Variable '${ovsdb_uuid}' not found.</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-10-16T01:17:30.146778" elapsed="5.056507">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: Variable '${ovsdb_uuid}' not found.</status>
</kw>
<doc>Verify port is modified in all instances.</doc>
<status status="FAIL" start="2026-10-16T01:17:29.736665" elapsed="5.466939">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: Variable '${ovsdb_uuid}' not found.</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-10-16T01:17:35.207074" elapsed="0.000591"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:17:35.206346" elapsed="0.001625"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:35.210169" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:35.209944" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:35.209899" elapsed="0.000421"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:35.214555" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:35.214346" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:35.214308" elapsed="0.000417"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:17:35.216819" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:17:35.216026" elapsed="0.000850"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:17:35.217880" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:17:35.217210" elapsed="0.000724"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:17:35.218025" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:17:35.218308" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:17:35.215181" elapsed="0.003177"/>
</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-10-16T01:17:35.224095" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:35.223906" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:35.223867" elapsed="0.000370"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:35.226862" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:35.226637" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:35.226600" elapsed="0.000403"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:35.227905" 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-10-16T01:17:35.227322" elapsed="0.000639"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:35.228783" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:17:35.228318" elapsed="0.000522"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:17:35.277432" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:17:35.230188" elapsed="0.047628"/>
</kw>
<msg time="2026-10-16T01:17:35.278105" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:17:35.278187" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:35.229184" elapsed="0.049075"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:17:35.353202" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:35.279275" elapsed="0.074125"/>
</kw>
<msg time="2026-10-16T01:17:35.353578" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:17:35.353619" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:35.278563" elapsed="0.075092"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:35.354004" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:35.353765" elapsed="0.000382"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:35.353739" elapsed="0.000437"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:35.354757" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:35.354357" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:35.355096" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:35.354900" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:35.354883" elapsed="0.000306"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:17:35.355223" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:35.357890" 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-10-16T01:17:35.359657" elapsed="0.000502"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:35.361544" 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-10-16T01:17:35.356128" elapsed="0.005821"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:17:35.355580" elapsed="0.006488"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:17:35.226037" elapsed="0.136110"/>
</kw>
<msg time="2026-10-16T01:17:35.362233" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:35.362274" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:35.224595" elapsed="0.137716"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:17:35.362472" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:17:35.362387" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:35.362370" 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-10-16T01:17:35.362993" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:35.363298" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:17:35.363361" 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-10-16T01:17:35.223208" elapsed="0.140242"/>
</kw>
<msg time="2026-10-16T01:17:35.363553" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:35.363596" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:35.219160" elapsed="0.144473"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:35.363938" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:35.363718" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:35.363686" elapsed="0.000325"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:17:35.218847" elapsed="0.145187"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:35.366744" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:35.366644" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:35.366626" elapsed="0.000182"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:35.367901" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:35.367818" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:35.367801" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:35.368337" 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-10-16T01:17:35.368106" elapsed="0.000255"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:35.368772" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:17:35.368538" elapsed="0.000259"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:17:35.407055" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:17:35.369361" elapsed="0.037871"/>
</kw>
<msg time="2026-10-16T01:17:35.407388" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:17:35.407429" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:35.368951" elapsed="0.038513"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:17:35.479850" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:35.408088" elapsed="0.072113"/>
</kw>
<msg time="2026-10-16T01:17:35.480450" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:17:35.480495" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:35.407642" elapsed="0.072928"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:35.481057" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:35.480720" elapsed="0.000415"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:35.480657" elapsed="0.000506"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:35.481853" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:35.481349" elapsed="0.000587"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:35.482194" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:35.481997" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:35.481981" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:17:35.482327" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:35.485079" 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-10-16T01:17:35.486870" elapsed="0.000490"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:35.488758" 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-10-16T01:17:35.483287" elapsed="0.005853"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:17:35.482686" elapsed="0.006572"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:17:35.367539" elapsed="0.121799"/>
</kw>
<msg time="2026-10-16T01:17:35.489427" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:35.489467" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:35.366953" elapsed="0.122550"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:17:35.489808" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-16T01:17:35.489645" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:35.489628" elapsed="0.000262"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:17:35.490234" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:35.490557" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:17:35.490622" 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-10-16T01:17:35.366334" elapsed="0.124392"/>
</kw>
<msg time="2026-10-16T01:17:35.490889" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:35.490931" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:35.364298" elapsed="0.126668"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:35.491262" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:35.491036" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:35.491020" elapsed="0.000313"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:17:35.364160" elapsed="0.127195"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:35.494082" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:35.493997" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:35.493980" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:35.495249" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:35.495166" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:35.495149" elapsed="0.000164"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:35.495731" 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-10-16T01:17:35.495465" elapsed="0.000292"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:35.496100" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:17:35.495916" elapsed="0.000208"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:17:35.532959" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:17:35.496726" elapsed="0.036483"/>
</kw>
<msg time="2026-10-16T01:17:35.533415" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:17:35.533457" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:35.496276" elapsed="0.037217"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:17:35.605681" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:35.534262" elapsed="0.071626"/>
</kw>
<msg time="2026-10-16T01:17:35.606043" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:17:35.606084" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:35.533759" elapsed="0.072360"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:35.606436" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:35.606205" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:35.606180" elapsed="0.000375"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:35.607101" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:35.606760" elapsed="0.000422"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:35.607436" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:35.607242" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:35.607226" elapsed="0.000319"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:17:35.607580" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:35.610193" 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-10-16T01:17:35.611959" elapsed="0.000478"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:35.613889" 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-10-16T01:17:35.608452" elapsed="0.005824"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:17:35.607931" elapsed="0.006461"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:17:35.494909" elapsed="0.119560"/>
</kw>
<msg time="2026-10-16T01:17:35.614569" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:35.614610" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:35.494294" elapsed="0.120352"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:17:35.614876" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:17:35.614788" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:35.614769" elapsed="0.000186"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:17:35.615303" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:35.615632" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:17:35.615713" 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-10-16T01:17:35.493681" elapsed="0.122125"/>
</kw>
<msg time="2026-10-16T01:17:35.615895" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:35.615935" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:35.491632" elapsed="0.124338"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:35.616258" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:35.616041" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:35.616024" elapsed="0.000305"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:17:35.491481" elapsed="0.124871"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:17:35.218467" elapsed="0.397921"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:17:35.213671" elapsed="0.402773"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:17:35.209297" elapsed="0.407202"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:35.208316" elapsed="0.408247"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:17:35.205401" elapsed="0.411216"/>
</kw>
<kw name="Delete Sample Port And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:17:35.620804" 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-10-16T01:17:35.619556" elapsed="0.001285">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-10-16T01:17:35.204279" elapsed="0.416701">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-10-16T01:17:35.622523" elapsed="0.000218"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:17:35.622266" 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-10-16T01:17:35.623674" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:35.623583" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:35.623566" elapsed="0.000188"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:35.625634" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:35.625551" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:35.625533" elapsed="0.000179"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:17:35.626611" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:17:35.626263" elapsed="0.000374"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:17:35.627114" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:17:35.626837" elapsed="0.000305"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:17:35.627183" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:17:35.627313" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:17:35.625914" elapsed="0.001427"/>
</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-10-16T01:17:35.629903" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:35.629820" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:35.629802" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:35.631058" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:35.630975" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:35.630959" elapsed="0.000161"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:35.631493" 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-10-16T01:17:35.631263" elapsed="0.000271"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:35.631889" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:17:35.631710" elapsed="0.000203"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:17:35.668352" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:17:35.632472" elapsed="0.036072"/>
</kw>
<msg time="2026-10-16T01:17:35.668723" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:17:35.668767" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:35.632065" elapsed="0.036737"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:17:35.757904" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:35.669378" elapsed="0.088742"/>
</kw>
<msg time="2026-10-16T01:17:35.758298" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:17:35.758339" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:35.668962" elapsed="0.089414"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:35.758736" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:35.758460" elapsed="0.000349"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:35.758437" elapsed="0.000397"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:35.759401" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:35.759016" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:35.759782" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:35.759562" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:35.759546" elapsed="0.000330"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:17:35.759908" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:35.762459" 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-10-16T01:17:35.764275" elapsed="0.000514"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:35.766177" elapsed="0.000428"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:17:35.760760" elapsed="0.005912"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:17:35.760217" elapsed="0.006589"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:17:35.630720" elapsed="0.136164"/>
</kw>
<msg time="2026-10-16T01:17:35.766967" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:35.767007" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:35.630111" elapsed="0.136932"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:17:35.767199" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:17:35.767113" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:35.767096" elapsed="0.000181"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:17:35.767619" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:35.768009" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:17:35.768081" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:17:35.629498" elapsed="0.138668"/>
</kw>
<msg time="2026-10-16T01:17:35.768255" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:35.768294" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:35.627725" elapsed="0.140604"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:35.768636" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:35.768399" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:35.768383" elapsed="0.000342"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:17:35.627572" elapsed="0.141176"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:35.772665" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:35.772580" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:35.772563" elapsed="0.000181"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:35.773843" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:35.773759" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:35.773742" elapsed="0.000164"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:35.774272" 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-10-16T01:17:35.774046" elapsed="0.000250"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:35.774644" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:17:35.774453" elapsed="0.000215"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:17:35.812423" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:17:35.775242" elapsed="0.037370"/>
</kw>
<msg time="2026-10-16T01:17:35.812799" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:17:35.812840" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:35.774837" elapsed="0.038038"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:17:35.901030" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:35.813448" elapsed="0.087804"/>
</kw>
<msg time="2026-10-16T01:17:35.901435" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:17:35.901477" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:35.813035" elapsed="0.088558"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:35.901950" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:35.901684" elapsed="0.000339"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:35.901658" elapsed="0.000391"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:35.902622" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:35.902225" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:35.902979" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:35.902787" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:35.902770" elapsed="0.000302"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:17:35.903104" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:35.905690" 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-10-16T01:17:35.907427" elapsed="0.000513"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:35.909148" 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-10-16T01:17:35.903964" elapsed="0.005591"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:17:35.903412" elapsed="0.006264"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:17:35.773469" elapsed="0.136472"/>
</kw>
<msg time="2026-10-16T01:17:35.910025" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:35.910065" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:35.772891" elapsed="0.137210"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:17:35.910303" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:17:35.910172" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:35.910154" 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-10-16T01:17:35.910742" 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-10-16T01:17:35.911050" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:17:35.911114" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:17:35.772238" elapsed="0.138961"/>
</kw>
<msg time="2026-10-16T01:17:35.911285" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:35.911326" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:35.769011" elapsed="0.142353"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:35.911684" elapsed="0.000144"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:35.911433" elapsed="0.000428"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:35.911417" elapsed="0.000468"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:17:35.768874" elapsed="0.143033"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:35.981280" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:35.981161" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:35.981132" elapsed="0.000236"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:35.982741" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:35.982631" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:35.982614" elapsed="0.000259"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:35.983269" 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-10-16T01:17:35.983019" elapsed="0.000276"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:35.983657" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:17:35.983463" elapsed="0.000218"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:17:36.023724" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:17:35.984268" elapsed="0.039629"/>
</kw>
<msg time="2026-10-16T01:17:36.024054" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:17:36.024095" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:35.983854" elapsed="0.040275"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:17:36.119812" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:36.024755" elapsed="0.095286"/>
</kw>
<msg time="2026-10-16T01:17:36.120220" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:17:36.120261" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:36.024290" elapsed="0.096004"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:36.120651" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:36.120384" elapsed="0.000361"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:36.120357" elapsed="0.000414"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:36.121328" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:36.120952" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:36.121677" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:36.121470" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:36.121453" elapsed="0.000335"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:17:36.121822" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:36.124407" 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-10-16T01:17:36.126170" elapsed="0.000492"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:36.128063" elapsed="0.000309"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:17:36.122692" elapsed="0.005747"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:17:36.122155" elapsed="0.006415"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:17:35.982355" elapsed="0.146293"/>
</kw>
<msg time="2026-10-16T01:17:36.128749" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:36.128792" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:35.981581" elapsed="0.147245"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:17:36.128981" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:17:36.128895" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:36.128878" elapsed="0.000181"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:17:36.129392" 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-10-16T01:17:36.129871" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:17:36.129937" 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-10-16T01:17:35.980654" elapsed="0.149371"/>
</kw>
<msg time="2026-10-16T01:17:36.130115" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:36.130155" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:35.912170" elapsed="0.218019"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:36.130476" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:36.130259" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:36.130243" elapsed="0.000320"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:17:35.912031" elapsed="0.218555"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:17:35.627392" elapsed="0.503231"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:17:35.625240" elapsed="0.505445"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:17:35.623314" elapsed="0.507443"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:35.622933" elapsed="0.507869"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:17:35.621932" elapsed="0.508921"/>
</kw>
<kw name="Delete Sample Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:17:36.134928" 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-10-16T01:17:36.133684" elapsed="0.001280">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-10-16T01:17:35.621348" elapsed="0.513753">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-10-16T01:17:36.136586" elapsed="0.000220"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:17:36.136332" 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-10-16T01:17:36.137754" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:36.137652" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:36.137635" elapsed="0.000183"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:36.139669" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:36.139587" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:36.139571" elapsed="0.000183"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:17:36.140646" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:17:36.140304" elapsed="0.000368"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:17:36.141106" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:17:36.140838" elapsed="0.000292"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:17:36.141170" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:17:36.141294" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:17:36.139956" elapsed="0.001360"/>
</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-10-16T01:17:36.143831" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:36.143747" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:36.143729" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:36.144989" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:36.144906" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:36.144890" elapsed="0.000161"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:36.145420" 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-10-16T01:17:36.145192" elapsed="0.000281"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:36.145843" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:17:36.145649" elapsed="0.000219"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:17:36.182650" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:17:36.146428" elapsed="0.036420"/>
</kw>
<msg time="2026-10-16T01:17:36.183010" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:17:36.183052" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:36.146020" elapsed="0.037066"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:17:36.261336" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:36.183723" elapsed="0.077800"/>
</kw>
<msg time="2026-10-16T01:17:36.261682" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:17:36.261746" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:36.183254" elapsed="0.078527"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:36.262060" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:36.261853" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:36.261833" elapsed="0.000322"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:36.262687" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:36.262332" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:36.263039" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:36.262844" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:36.262828" elapsed="0.000305"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:17:36.263163" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:36.265636" elapsed="0.000494"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:17:36.267347" elapsed="0.000517"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:36.269226" 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-10-16T01:17:36.263961" elapsed="0.005654"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:17:36.263430" elapsed="0.006317"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:17:36.144628" elapsed="0.125196"/>
</kw>
<msg time="2026-10-16T01:17:36.269905" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:36.269943" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:36.144040" elapsed="0.125960"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:17:36.270153" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:17:36.270069" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:36.270052" elapsed="0.000177"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:17:36.270559" 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-10-16T01:17:36.270951" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:17:36.271052" 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-10-16T01:17:36.143433" elapsed="0.127706"/>
</kw>
<msg time="2026-10-16T01:17:36.271221" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:36.271260" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:36.141666" elapsed="0.129627"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:36.271591" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:36.271359" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:36.271343" elapsed="0.000320"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:17:36.141527" elapsed="0.130157"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:36.274230" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:36.274147" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:36.274130" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:36.275378" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:36.275297" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:36.275280" elapsed="0.000160"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:36.276154" 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-10-16T01:17:36.275928" elapsed="0.000251"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:36.276523" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:17:36.276337" elapsed="0.000211"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:17:36.310578" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:17:36.277123" elapsed="0.033645"/>
</kw>
<msg time="2026-10-16T01:17:36.310940" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:17:36.310982" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:36.276715" elapsed="0.034301"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:17:36.389204" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:36.311610" elapsed="0.077850"/>
</kw>
<msg time="2026-10-16T01:17:36.389680" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:17:36.389744" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:36.311176" elapsed="0.078603"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:36.390166" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:36.389881" elapsed="0.000360"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:36.389849" elapsed="0.000420"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:36.390923" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:36.390458" elapsed="0.000545"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:36.391257" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:36.391063" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:36.391046" elapsed="0.000303"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:17:36.391382" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:36.394030" 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-10-16T01:17:36.395844" elapsed="0.000471"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:36.397534" 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-10-16T01:17:36.392264" elapsed="0.005675"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:17:36.391741" elapsed="0.006315"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:17:36.275042" elapsed="0.123095"/>
</kw>
<msg time="2026-10-16T01:17:36.398224" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:36.398263" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:36.274437" elapsed="0.123860"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:17:36.398450" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:17:36.398366" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:36.398349" elapsed="0.000198"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:17:36.398927" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:36.399231" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:17:36.399295" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:17:36.273858" elapsed="0.125521"/>
</kw>
<msg time="2026-10-16T01:17:36.399466" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:36.399518" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:36.271941" elapsed="0.127611"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:36.400110" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:36.399621" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:36.399606" elapsed="0.000576"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:17:36.271807" elapsed="0.128397"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:36.402814" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:36.402728" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:36.402710" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:36.403983" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:36.403900" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:36.403883" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:36.404413" 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-10-16T01:17:36.404185" elapsed="0.000252"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:36.404998" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:17:36.404820" elapsed="0.000202"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:17:36.443969" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:17:36.405599" elapsed="0.038542"/>
</kw>
<msg time="2026-10-16T01:17:36.444296" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:17:36.444336" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:36.405172" elapsed="0.039197"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:17:36.535266" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:36.444999" elapsed="0.090554"/>
</kw>
<msg time="2026-10-16T01:17:36.535761" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:17:36.535804" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:36.444548" elapsed="0.091290"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:36.536168" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:36.535923" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:36.535899" elapsed="0.000369"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:36.536855" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:17:36.536445" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:36.537187" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:36.536993" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:36.536977" elapsed="0.000303"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:17:36.537312" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:36.539879" 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-10-16T01:17:36.541600" elapsed="0.000487"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:36.543276" 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-10-16T01:17:36.538160" elapsed="0.005514"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:17:36.537633" elapsed="0.006176"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:17:36.403621" elapsed="0.140266"/>
</kw>
<msg time="2026-10-16T01:17:36.543972" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:36.544012" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:36.403019" elapsed="0.141027"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:17:36.544197" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:17:36.544113" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:36.544097" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:17:36.544615" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:36.544931" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:17:36.544995" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:17:36.402403" elapsed="0.142676"/>
</kw>
<msg time="2026-10-16T01:17:36.545161" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:36.545201" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:36.400464" elapsed="0.144770"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:36.545529" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:36.545299" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:36.545284" elapsed="0.000318"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:17:36.400326" elapsed="0.145298"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:17:36.141367" elapsed="0.404289"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:17:36.139283" elapsed="0.406455"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:17:36.137384" elapsed="0.408441"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:36.137000" elapsed="0.408870"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:17:36.135996" elapsed="0.409924"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:36.548988" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:36.548755" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:36.548738" elapsed="0.000324"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:36.549381" 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-10-16T01:17:36.549473" 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-10-16T01:17:36.549251" elapsed="0.000246"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:36.550294" level="INFO">Attempting to execute command "sudo mn -c" on remote system "10.30.171.104" 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-10-16T01:17:36.550003" elapsed="0.000334"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:36.550847" level="INFO">${conn_id} = 201</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-10-16T01:17:36.550524" elapsed="0.000347"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:17:36.551788" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:17:36.551872" 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-10-16T01:17:36.551415" elapsed="0.000479"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:36.552042" elapsed="0.000284"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:17:36.553140" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:17:36.998420" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:16:56 UTC 2026

  System load:  0.04               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:17:16 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:17:36.552908" elapsed="0.445681"/>
</kw>
<msg time="2026-10-16T01:17:36.998668" 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-10-16T01:17:36.552529" elapsed="0.446235"/>
</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-10-16T01:17:36.551062" elapsed="0.447808"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:17:36.999404" level="INFO">Executing command 'sudo mn -c'.</msg>
<msg time="2026-10-16T01:17:38.199218" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:17:38.199575" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:17:38.199669" 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-10-16T01:17:36.999164" elapsed="1.200600"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:38.200220" elapsed="0.000599"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:38.202008" 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-10-16T01:17:38.201336" elapsed="0.000890"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:17:38.202674" elapsed="0.000067"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:38.202398" elapsed="0.000413"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:38.202348" 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-10-16T01:17:38.203152" elapsed="0.000065"/>
</return>
<status status="PASS" start="2026-10-16T01:17:38.202970" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:38.202939" elapsed="0.000396"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:17:38.203405" elapsed="0.000027"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:38.205066" elapsed="0.001090"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:17:38.206597" elapsed="0.000358"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:38.207270" elapsed="0.000195"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:17:38.204111" elapsed="0.003483"/>
</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-10-16T01:17:36.548296" elapsed="1.659485"/>
</kw>
<msg time="2026-10-16T01:17:38.207892" 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-10-16T01:17:36.547780" elapsed="1.660221"/>
</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-10-16T01:17:36.547168" elapsed="1.660990"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:38.212234" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:38.211684" elapsed="0.000668"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:38.211645" elapsed="0.000759"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:38.213158" 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-10-16T01:17:38.213359" 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-10-16T01:17:38.212878" elapsed="0.000535"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:38.214659" 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.104" 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-10-16T01:17:38.213993" elapsed="0.000798"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:38.215898" 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-10-16T01:17:38.215179" elapsed="0.000773"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:17:38.217810" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:17:38.217967" 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-10-16T01:17:38.217206" elapsed="0.000812"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:38.218339" elapsed="0.000773"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:17:38.220921" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:17:38.617220" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:16:56 UTC 2026

  System load:  0.04               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:17:36 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:17:38.220363" elapsed="0.397155"/>
</kw>
<msg time="2026-10-16T01:17:38.617606" 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-10-16T01:17:38.219475" elapsed="0.398217"/>
</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-10-16T01:17:38.216372" elapsed="0.401448"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:17:38.618364" 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-10-16T01:17:38.661995" level="INFO">Command exited with return code -1.</msg>
<msg time="2026-10-16T01:17:38.662150" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:17:38.662204" 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-10-16T01:17:38.618113" elapsed="0.044121"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:38.662451" elapsed="0.000818"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:38.664205" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:17:38.663810" elapsed="0.000449"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:17:38.664559" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:38.664371" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:38.664338" elapsed="0.000326"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:17:38.664870" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-10-16T01:17:38.664755" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:38.664734" elapsed="0.000245"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:17:38.665021" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:38.666059" 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-10-16T01:17:38.666765" elapsed="0.000209"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:38.667166" elapsed="0.000120"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:17:38.665440" elapsed="0.001910"/>
</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-10-16T01:17:38.210726" elapsed="0.456716"/>
</kw>
<msg time="2026-10-16T01:17:38.667520" 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-10-16T01:17:38.209480" elapsed="0.458105"/>
</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-10-16T01:17:38.208498" elapsed="0.459184"/>
</kw>
<arg>${tools_system}</arg>
<status status="PASS" start="2026-10-16T01:17:36.546861" elapsed="2.120914"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:38.670301" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:38.669976" elapsed="0.000397"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:38.669951" elapsed="0.000455"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:38.670888" 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-10-16T01:17:38.671014" 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-10-16T01:17:38.670689" elapsed="0.000358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:38.671746" level="INFO">Attempting to execute command "sudo ovs-vsctl del-manager" on remote system "10.30.171.104" 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-10-16T01:17:38.671304" elapsed="0.000503"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:38.672458" 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-10-16T01:17:38.672047" elapsed="0.000444"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:17:38.673647" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:17:38.673814" 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-10-16T01:17:38.673279" elapsed="0.000567"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:38.674050" elapsed="0.000393"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:17:38.675545" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:17:39.063157" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:16:56 UTC 2026

  System load:  0.04               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:17:38 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:17:38.675202" elapsed="0.388091"/>
</kw>
<msg time="2026-10-16T01:17:39.063369" 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-10-16T01:17:38.674682" elapsed="0.388766"/>
</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-10-16T01:17:38.672793" elapsed="0.390780"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:17:39.064098" level="INFO">Executing command 'sudo ovs-vsctl del-manager'.</msg>
<msg time="2026-10-16T01:17:39.087592" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:17:39.087782" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:17:39.087840" 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-10-16T01:17:39.063868" elapsed="0.024002"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:39.088085" elapsed="0.000639"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:39.089478" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:17:39.089103" elapsed="0.000449"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:17:39.089856" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:39.089665" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:39.089631" elapsed="0.000325"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:17:39.090135" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-10-16T01:17:39.090023" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:39.090004" elapsed="0.000238"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:17:39.090284" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:39.091318" elapsed="0.000445"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:17:39.092019" elapsed="0.000200"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:39.092410" elapsed="0.000195"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:17:39.090746" elapsed="0.001933"/>
</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-10-16T01:17:38.669351" elapsed="0.423454"/>
</kw>
<msg time="2026-10-16T01:17:39.092873" 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-10-16T01:17:38.668604" elapsed="0.424335"/>
</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-10-16T01:17:38.668011" elapsed="0.425027"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:39.095626" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:39.095279" elapsed="0.000444"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:39.095256" elapsed="0.000502"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:39.096275" 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-10-16T01:17:39.096490" 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-10-16T01:17:39.096044" elapsed="0.000539"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:39.097301" level="INFO">Attempting to execute command "sudo /usr/share/openvswitch/scripts/ovs-ctl stop" on remote system "10.30.171.104" 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-10-16T01:17:39.096894" elapsed="0.000466"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:39.098057" 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-10-16T01:17:39.097621" elapsed="0.000470"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:17:39.099231" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:17:39.099327" 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-10-16T01:17:39.098882" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:39.099577" elapsed="0.000413"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:17:39.101079" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:17:39.538126" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:16:56 UTC 2026

  System load:  0.04               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:17:38 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:17:39.100757" elapsed="0.437509"/>
</kw>
<msg time="2026-10-16T01:17:39.538343" 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-10-16T01:17:39.100212" elapsed="0.438209"/>
</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-10-16T01:17:39.098353" elapsed="0.440191"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:17:39.539051" level="INFO">Executing command 'sudo /usr/share/openvswitch/scripts/ovs-ctl stop'.</msg>
<msg time="2026-10-16T01:17:39.713961" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:17:39.714236" level="INFO">${stdout} =  * Exiting ovs-vswitchd (850)
 * Exiting ovsdb-server (812)</msg>
<msg time="2026-10-16T01:17:39.714325" 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-10-16T01:17:39.538833" elapsed="0.175540"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:39.714846" elapsed="0.000491"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:39.716477" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:17:39.715890" elapsed="0.000696"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:17:39.717022" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:39.716781" elapsed="0.000345"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:39.716731" elapsed="0.000446"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:17:39.717462" elapsed="0.000086"/>
</return>
<status status="PASS" start="2026-10-16T01:17:39.717284" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:39.717254" elapsed="0.000416"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:17:39.717779" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:39.719432" elapsed="0.000741"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:17:39.720597" elapsed="0.000349"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:39.721253" elapsed="0.000192"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:17:39.718439" elapsed="0.003139"/>
</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-10-16T01:17:39.094665" elapsed="0.627100"/>
</kw>
<msg time="2026-10-16T01:17:39.721993" 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-10-16T01:17:39.093926" elapsed="0.628179"/>
</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-10-16T01:17:39.093286" elapsed="0.628977"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:39.726752" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:39.726186" elapsed="0.000684"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:39.726148" elapsed="0.000774"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:39.727636" 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-10-16T01:17:39.727877" 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-10-16T01:17:39.727339" elapsed="0.000593"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:39.729030" level="INFO">Attempting to execute command "sudo rm -rf /etc/openvswitch/conf.db" on remote system "10.30.171.104" 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-10-16T01:17:39.728341" elapsed="0.000783"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:39.730335" 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-10-16T01:17:39.729527" elapsed="0.000862"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:17:39.732254" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:17:39.732407" 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-10-16T01:17:39.731675" elapsed="0.000780"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:39.732831" elapsed="0.000625"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:17:39.735341" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:17:40.133431" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:16:56 UTC 2026

  System load:  0.04               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:17:39 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:17:39.734773" elapsed="0.398811"/>
</kw>
<msg time="2026-10-16T01:17:40.133661" 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-10-16T01:17:39.733874" elapsed="0.399880"/>
</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-10-16T01:17:39.730862" elapsed="0.402992"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:17:40.134336" level="INFO">Executing command 'sudo rm -rf /etc/openvswitch/conf.db'.</msg>
<msg time="2026-10-16T01:17:40.157287" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:17:40.157435" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:17:40.157490" 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-10-16T01:17:40.134118" elapsed="0.023419"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:40.157778" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:40.158802" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:17:40.158391" elapsed="0.000465"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:17:40.159125" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:40.158965" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:40.158931" elapsed="0.000291"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:17:40.159398" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-10-16T01:17:40.159287" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:40.159269" elapsed="0.000235"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:17:40.159563" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:40.160661" 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-10-16T01:17:40.161333" elapsed="0.000213"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:40.161761" 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-10-16T01:17:40.160076" elapsed="0.001872"/>
</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-10-16T01:17:39.725192" elapsed="0.436850"/>
</kw>
<msg time="2026-10-16T01:17:40.162108" 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-10-16T01:17:39.723798" elapsed="0.438372"/>
</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-10-16T01:17:39.722676" elapsed="0.439592"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:40.164844" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:40.164479" elapsed="0.000440"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:40.164456" elapsed="0.000496"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:40.165391" 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-10-16T01:17:40.165531" 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-10-16T01:17:40.165216" elapsed="0.000350"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:40.166243" level="INFO">Attempting to execute command "sudo /usr/share/openvswitch/scripts/ovs-ctl start" on remote system "10.30.171.104" 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-10-16T01:17:40.165845" elapsed="0.000456"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:40.166992" 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-10-16T01:17:40.166557" elapsed="0.000468"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:17:40.168165" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:17:40.168261" 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-10-16T01:17:40.167817" elapsed="0.000473"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:40.168493" elapsed="0.000426"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:17:40.170000" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:17:40.553052" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:16:56 UTC 2026

  System load:  0.04               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:17:40 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:17:40.169661" elapsed="0.383592"/>
</kw>
<msg time="2026-10-16T01:17:40.553350" 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-10-16T01:17:40.169142" elapsed="0.384311"/>
</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-10-16T01:17:40.167288" elapsed="0.386306"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:17:40.554225" level="INFO">Executing command 'sudo /usr/share/openvswitch/scripts/ovs-ctl start'.</msg>
<msg time="2026-10-16T01:17:40.699599" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:17:40.700060" 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-10-16T01:17:40.700163" 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-10-16T01:17:40.553942" elapsed="0.146276"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:40.700813" elapsed="0.000932"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:40.703138" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:17:40.702392" elapsed="0.000840"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:17:40.703760" elapsed="0.000044"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:40.703411" elapsed="0.000471"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:40.703358" elapsed="0.000581"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:17:40.704255" elapsed="0.000073"/>
</return>
<status status="PASS" start="2026-10-16T01:17:40.704056" elapsed="0.000346"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:40.704024" elapsed="0.000430"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:17:40.704560" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:40.706325" elapsed="0.000717"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:17:40.707455" elapsed="0.000389"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:40.708157" elapsed="0.000273"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:17:40.705325" elapsed="0.003248"/>
</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-10-16T01:17:40.163899" elapsed="0.544864"/>
</kw>
<msg time="2026-10-16T01:17:40.708879" 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-10-16T01:17:40.163135" elapsed="0.545855"/>
</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-10-16T01:17:40.162527" elapsed="0.546621"/>
</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-10-16T01:17:36.546484" elapsed="4.162775"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:17:40.710405" 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-10-16T01:17:40.709739" elapsed="0.000721"/>
</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-10-16T01:17:40.718043" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:17:40.717247" elapsed="0.000854"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:17:40.719101" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:17:40.718433" elapsed="0.000720"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:17:40.719244" elapsed="0.000060"/>
</return>
<msg time="2026-10-16T01:17:40.719554" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:17:40.716408" elapsed="0.003199"/>
</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-10-16T01:17:40.728787" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:17:40.728119" elapsed="0.000725"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:17:40.728938" elapsed="0.000060"/>
</return>
<msg time="2026-10-16T01:17:40.729214" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:17:40.727352" elapsed="0.001912"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:40.732069" 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-10-16T01:17:40.731528" elapsed="0.000633"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:40.733308" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:17:40.732732" elapsed="0.000669"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:17:40.742005" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:17:40.742121" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:17:40.742372" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:40.734115" elapsed="0.009121">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:17:40.733563" elapsed="0.009843">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:40.743885" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:40.743477" elapsed="0.000542"/>
</branch>
<status status="FAIL" start="2026-10-16T01:17:40.733503" elapsed="0.010567">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:40.744894" elapsed="0.000055"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:40.745165" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:40.745091" elapsed="0.000159"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:17:40.745055" 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-10-16T01:17:40.745619" elapsed="0.000044"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:17:40.745791" 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-10-16T01:17:40.729986" elapsed="0.016024">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:40.746130" elapsed="0.000074"/>
</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-10-16T01:17:40.726316" elapsed="0.020052">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:40.746892" elapsed="0.000050"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:17:40.720023" elapsed="0.027024">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:17:40.719755" elapsed="0.027409">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:17:40.715288" elapsed="0.032059">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:41.754434" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:17:41.753503" elapsed="0.000997"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:17:41.755526" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:17:41.754898" elapsed="0.000683"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:17:41.755678" elapsed="0.000104"/>
</return>
<msg time="2026-10-16T01:17:41.756016" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:17:41.752671" elapsed="0.003499"/>
</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-10-16T01:17:41.762481" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:17:41.761886" elapsed="0.000672"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:17:41.762651" elapsed="0.000085"/>
</return>
<msg time="2026-10-16T01:17:41.762950" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:17:41.761138" elapsed="0.001862"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:41.765594" 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-10-16T01:17:41.765078" elapsed="0.000607"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:41.766624" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:17:41.766126" 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-10-16T01:17:41.773478" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:17:41.773626" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:17:41.773905" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:41.767381" elapsed="0.007362">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:17:41.766881" elapsed="0.008032">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:41.775328" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:41.774985" elapsed="0.000473"/>
</branch>
<status status="FAIL" start="2026-10-16T01:17:41.766841" elapsed="0.008688">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:41.776340" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:41.776640" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:41.776563" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:17:41.776499" elapsed="0.000302"/>
</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-10-16T01:17:41.777113" elapsed="0.000042"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:17:41.777249" elapsed="0.000030"/>
</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-10-16T01:17:41.763671" elapsed="0.013787">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:41.777600" 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-10-16T01:17:41.760177" elapsed="0.017640">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:41.778275" elapsed="0.000047"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:17:41.756571" elapsed="0.021854">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:17:41.756289" elapsed="0.022270">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:17:41.751379" elapsed="0.027476">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:42.785921" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:17:42.785024" elapsed="0.000963"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:17:42.786995" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:17:42.786334" elapsed="0.000715"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:17:42.787146" elapsed="0.000075"/>
</return>
<msg time="2026-10-16T01:17:42.787452" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:17:42.784177" elapsed="0.003324"/>
</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-10-16T01:17:42.793929" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:17:42.793278" elapsed="0.000706"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:17:42.794077" elapsed="0.000056"/>
</return>
<msg time="2026-10-16T01:17:42.794344" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:17:42.792545" elapsed="0.001849"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:42.797182" 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-10-16T01:17:42.796652" elapsed="0.000623"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:42.798207" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:17:42.797729" elapsed="0.000565"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:17:42.805284" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:17:42.805400" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:17:42.805647" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:42.798986" elapsed="0.007501">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:17:42.798435" elapsed="0.008259">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:42.807148" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:42.806802" elapsed="0.000474"/>
</branch>
<status status="FAIL" start="2026-10-16T01:17:42.798395" elapsed="0.008931">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:42.808132" elapsed="0.000052"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:42.808401" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:42.808328" elapsed="0.000157"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:17:42.808291" elapsed="0.000262"/>
</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-10-16T01:17:42.808883" elapsed="0.000043"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:17:42.809020" elapsed="0.000031"/>
</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-10-16T01:17:42.795240" elapsed="0.014089">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:42.809449" 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-10-16T01:17:42.791578" elapsed="0.018083">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:42.810150" elapsed="0.000049"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:17:42.787917" elapsed="0.022387">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:17:42.787635" elapsed="0.022784">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:17:42.782911" elapsed="0.027722">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:43.818045" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:17:43.817152" elapsed="0.000958"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:17:43.819116" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:17:43.818456" elapsed="0.000713"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:17:43.819265" elapsed="0.000073"/>
</return>
<msg time="2026-10-16T01:17:43.819593" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:17:43.816302" elapsed="0.003344"/>
</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-10-16T01:17:43.825463" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:17:43.824870" elapsed="0.000721"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:17:43.825685" elapsed="0.000086"/>
</return>
<msg time="2026-10-16T01:17:43.825986" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:17:43.824123" elapsed="0.001934"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:43.828664" 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-10-16T01:17:43.828146" elapsed="0.000640"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:43.829691" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:17:43.829196" 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-10-16T01:17:43.836595" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:17:43.836743" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:17:43.836962" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:43.830445" elapsed="0.007332">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:17:43.829950" elapsed="0.007997">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:43.838360" elapsed="0.000134"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:43.838017" elapsed="0.000593"/>
</branch>
<status status="FAIL" start="2026-10-16T01:17:43.829911" elapsed="0.008749">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:43.839445" elapsed="0.000051"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:43.839768" elapsed="0.000178"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:43.839666" elapsed="0.000338"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:17:43.839628" elapsed="0.000422"/>
</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-10-16T01:17:43.840353" elapsed="0.000041"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:17:43.840489" elapsed="0.000052"/>
</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-10-16T01:17:43.826761" elapsed="0.013994">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:43.840879" 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-10-16T01:17:43.823166" elapsed="0.017902">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:43.841579" elapsed="0.000050"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:17:43.820045" elapsed="0.021733">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:17:43.819790" elapsed="0.022109">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:17:43.815042" elapsed="0.027041">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:44.849660" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:17:44.848764" elapsed="0.000996"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:17:44.850767" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:17:44.850109" elapsed="0.000713"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:17:44.850918" elapsed="0.000073"/>
</return>
<msg time="2026-10-16T01:17:44.851220" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:17:44.847911" elapsed="0.003358"/>
</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-10-16T01:17:44.857259" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:17:44.856633" elapsed="0.000680"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:17:44.857407" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:17:44.857728" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:17:44.855916" elapsed="0.001866"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:44.860541" 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-10-16T01:17:44.860020" elapsed="0.000616"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:44.861574" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:17:44.861078" elapsed="0.000586"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:17:44.868347" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:17:44.868460" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:17:44.868864" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:44.862349" elapsed="0.007348">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:17:44.861834" elapsed="0.008064">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:44.870314" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:44.869971" elapsed="0.000471"/>
</branch>
<status status="FAIL" start="2026-10-16T01:17:44.861793" elapsed="0.008698">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:44.871311" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:44.871599" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:44.871505" elapsed="0.000183"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:17:44.871471" elapsed="0.000297"/>
</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-10-16T01:17:44.872069" elapsed="0.000042"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:17:44.872205" elapsed="0.000031"/>
</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-10-16T01:17:44.858441" elapsed="0.013976">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:44.872559" 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-10-16T01:17:44.854963" elapsed="0.017818">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:44.873259" elapsed="0.000047"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:17:44.851660" elapsed="0.021750">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:17:44.851382" elapsed="0.022162">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:17:44.846566" elapsed="0.027193">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:45.881249" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:17:45.880350" elapsed="0.000965"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:17:45.882408" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:17:45.881768" elapsed="0.000694"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:17:45.882579" elapsed="0.000077"/>
</return>
<msg time="2026-10-16T01:17:45.882926" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:17:45.879482" elapsed="0.003494"/>
</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-10-16T01:17:45.889244" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:17:45.888600" elapsed="0.000700"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:17:45.889506" elapsed="0.000084"/>
</return>
<msg time="2026-10-16T01:17:45.889838" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:17:45.887873" elapsed="0.002017"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:45.892750" 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-10-16T01:17:45.892168" elapsed="0.000680"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:45.893800" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:17:45.893264" elapsed="0.000625"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:17:45.900620" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:17:45.900803" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:17:45.901076" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:45.894569" elapsed="0.007348">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:17:45.894031" elapsed="0.008072">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:45.902623" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:45.902181" elapsed="0.000608"/>
</branch>
<status status="FAIL" start="2026-10-16T01:17:45.893991" elapsed="0.008848">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:45.903679" elapsed="0.000083"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:45.903991" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:45.903914" elapsed="0.000165"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:17:45.903875" 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-10-16T01:17:45.904424" elapsed="0.000042"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:17:45.904580" 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-10-16T01:17:45.890574" elapsed="0.014253">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:45.904946" 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-10-16T01:17:45.886877" elapsed="0.018258">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:17:45.905614" elapsed="0.000049"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:17:45.883348" elapsed="0.022449">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:17:45.883091" elapsed="0.022824">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:17:45.878227" elapsed="0.027875">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<msg time="2026-10-16T01:17:45.906300" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</msg>
<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="FAIL" start="2026-10-16T01:17:40.711082" elapsed="5.195539">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<doc>Cleans up test environment, close existing sessions.</doc>
<status status="FAIL" start="2026-10-16T01:17:36.546123" elapsed="9.360747">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<doc>Cleans up test environment, close existing sessions in teardown.</doc>
<status status="FAIL" start="2026-10-16T01:17:36.135454" elapsed="9.771707">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</test>
<kw name="Delete All Sessions" owner="RequestsLibrary" type="TEARDOWN">
<msg time="2026-10-16T01:17:45.909205" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects </doc>
<status status="PASS" start="2026-10-16T01:17:45.908845" elapsed="0.000564"/>
</kw>
<doc>Test suite for Ovsdb Southbound Cluster - Owner failover and recover</doc>
<status status="FAIL" start="2026-10-16T01:13:58.843363" elapsed="227.066116"/>
</suite>
<suite id="s1-s1-s2" name="Southbound Cluster Extension" source="/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:17:45.953751" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-16T01:17:45.951133" elapsed="0.002698"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-10-16T01:17:45.950777" elapsed="0.003152"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-10-16T01:17:45.956918" 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-10-16T01:17:45.955441" elapsed="0.001505"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-10-16T01:17:45.957136" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:45.957028" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:45.957005" elapsed="0.000197"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-16T01:17:45.957739" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-16T01:17:45.957379" elapsed="0.000402"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-10-16T01:17:45.958212" 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-10-16T01:17:45.957938" elapsed="0.000298"/>
</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-10-16T01:17:45.958771" elapsed="0.000271"/>
</kw>
<msg time="2026-10-16T01:17:45.959130" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:45.959172" 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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:45.958397" elapsed="0.000797"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:17:45.959841" 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-10-16T01:17:45.959366" elapsed="0.000507"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:17:45.960780" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:17:45.960501" elapsed="0.000304"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:17:45.961182" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:17:45.960945" elapsed="0.000262"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:17:45.961822" 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-10-16T01:17:45.961377" elapsed="0.000471"/>
</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-10-16T01:17:45.962737" elapsed="0.000174"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:17:45.963341" level="INFO">${member_ip} = 10.30.170.180</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:17:45.963064" elapsed="0.000302"/>
</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-10-16T01:17:45.963537" elapsed="0.000191"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:17:45.964682" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:17:45.964162" elapsed="0.000559"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:17:45.964766" elapsed="0.000041"/>
</return>
<msg time="2026-10-16T01:17:45.964913" 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-10-16T01:17:45.963903" elapsed="0.001034"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:17:45.965578" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.180:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a899633a610&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-10-16T01:17:45.965205" elapsed="0.000540"/>
</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-10-16T01:17:45.965956" elapsed="0.000171"/>
</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-10-16T01:17:45.962275" elapsed="0.003908"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:17:45.962108" elapsed="0.004116"/>
</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-10-16T01:17:45.966951" elapsed="0.000145"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:17:45.967548" level="INFO">${member_ip} = 10.30.170.14</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:17:45.967248" elapsed="0.000325"/>
</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-10-16T01:17:45.967746" elapsed="0.000167"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:17:45.968616" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:17:45.968341" elapsed="0.000299"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:17:45.968681" elapsed="0.000045"/>
</return>
<msg time="2026-10-16T01:17:45.968829" 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-10-16T01:17:45.968082" elapsed="0.000770"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:17:45.969323" level="INFO">Creating Session using : alias=ClusterManagement__session_2, url=http://10.30.170.14:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a89964f0450&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-10-16T01:17:45.969017" elapsed="0.000414"/>
</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-10-16T01:17:45.969604" elapsed="0.000164"/>
</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-10-16T01:17:45.966480" elapsed="0.003343"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:17:45.966311" elapsed="0.003550"/>
</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-10-16T01:17:45.970545" elapsed="0.000145"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:17:45.971133" level="INFO">${member_ip} = 10.30.170.84</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:17:45.970856" elapsed="0.000301"/>
</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-10-16T01:17:45.971317" elapsed="0.000161"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:17:45.972192" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:17:45.971932" elapsed="0.000285"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:17:45.972257" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:17:45.972380" 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-10-16T01:17:45.971658" elapsed="0.000744"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:17:45.972903" level="INFO">Creating Session using : alias=ClusterManagement__session_3, url=http://10.30.170.84:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a89964e90d0&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-10-16T01:17:45.972583" elapsed="0.000422"/>
</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-10-16T01:17:45.973164" elapsed="0.000146"/>
</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-10-16T01:17:45.970098" elapsed="0.003264"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:17:45.969938" elapsed="0.003464"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-10-16T01:17:45.961904" elapsed="0.011577"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-16T01:17:45.974087" level="INFO">${ClusterManagement__member_index_list} = [1, 2, 3]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-16T01:17:45.973688" elapsed="0.000441"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-16T01:17:45.974680" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.180', 2: '10.30.170.14', 3: '10.30.170.84'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-16T01:17:45.974309" elapsed="0.000428"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-16T01:17:45.975261" 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 the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-16T01:17:45.974918" elapsed="0.000383"/>
</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-10-16T01:17:45.960132" elapsed="0.015222"/>
</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-10-16T01:17:45.954935" elapsed="0.020471"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:45.975603" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:45.975479" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:45.975458" elapsed="0.000210"/>
</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-10-16T01:17:45.977094" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:17:45.976761" elapsed="0.000358"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:17:45.977554" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:17:45.977270" elapsed="0.000308"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:17:45.977619" elapsed="0.000029"/>
</return>
<msg time="2026-10-16T01:17:45.977766" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:17:45.976241" elapsed="0.001548"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:45.978637" level="INFO">${member_ip} = 10.30.170.180</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-10-16T01:17:45.978415" elapsed="0.000247"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:45.979387" 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-10-16T01:17:45.979479" 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-10-16T01:17:45.979225" elapsed="0.000278"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:45.982763" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:45.982085" elapsed="0.000779"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:45.982042" elapsed="0.000901"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:45.983761" 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-10-16T01:17:45.984089" 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-10-16T01:17:45.983288" elapsed="0.000920"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:45.985095" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.180" 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-10-16T01:17:45.984525" elapsed="0.000722"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:45.986383" 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-10-16T01:17:45.985561" elapsed="0.000940"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:17:45.987926" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:17:45.988051" 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-10-16T01:17:45.987600" elapsed="0.000474"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:45.988271" elapsed="0.000304"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:17:45.989546" level="INFO">Logging into '10.30.170.180:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:17:46.678621" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-194-generic x86_64)

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

 System information as of Fri Oct 16 01:17:46 UTC 2026

  System load:  0.16               Processes:             121
  Usage of /:   13.9% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.180
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:13:59 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:17:45.989174" elapsed="0.689623"/>
</kw>
<msg time="2026-10-16T01:17:46.678880" 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-10-16T01:17:45.988801" elapsed="0.690165"/>
</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-10-16T01:17:45.986900" elapsed="0.692294"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:17:46.680091" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-10-16T01:17:46.692796" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-10-16T01:17:46.693071" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:17:46.693228" 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-10-16T01:17:46.679602" elapsed="0.013741"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:46.693647" elapsed="0.001163"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:46.697959" 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-10-16T01:17:46.696422" elapsed="0.001922"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:17:46.699433" elapsed="0.000068"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:46.698801" elapsed="0.000830"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:46.698621" elapsed="0.001221"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:17:46.700788" elapsed="0.000296"/>
</return>
<status status="PASS" start="2026-10-16T01:17:46.700143" elapsed="0.001050"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:46.700057" elapsed="0.001314"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:17:46.701598" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:46.704979" elapsed="0.000922"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:17:46.706585" elapsed="0.000557"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:46.707760" 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-10-16T01:17:46.703051" elapsed="0.005027"/>
</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-10-16T01:17:45.981203" elapsed="0.727148"/>
</kw>
<msg time="2026-10-16T01:17:46.708495" 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-10-16T01:17:45.980556" elapsed="0.728034"/>
</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-10-16T01:17:45.980164" elapsed="0.728529"/>
</kw>
<msg time="2026-10-16T01:17:46.708774" 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-10-16T01:17:45.979670" elapsed="0.729164"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:46.709676" 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-10-16T01:17:46.710433" elapsed="0.000204"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:46.710903" elapsed="0.000154"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:17:46.709206" elapsed="0.001929"/>
</kw>
<msg time="2026-10-16T01:17:46.711251" 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-10-16T01:17:45.978870" elapsed="0.732412"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:46.711973" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:17:46.711602" elapsed="0.000424"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-10-16T01:17:46.712114" elapsed="0.000038"/>
</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-10-16T01:17:45.978108" elapsed="0.734151"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:17:45.977952" elapsed="0.734352"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:46.713558" level="INFO">${member_ip} = 10.30.170.14</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-10-16T01:17:46.713229" elapsed="0.000365"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:46.714596" 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-10-16T01:17:46.714746" 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-10-16T01:17:46.714382" elapsed="0.000399"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:46.721436" elapsed="0.000062"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:46.720500" elapsed="0.001095"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:46.720438" elapsed="0.001290"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:46.722874" 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-10-16T01:17:46.723237" 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-10-16T01:17:46.722168" elapsed="0.001232"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:46.724665" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.14" 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-10-16T01:17:46.723890" elapsed="0.001021"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:46.726551" level="INFO">${conn_id} = 216</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-10-16T01:17:46.725324" elapsed="0.001419"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:17:46.728883" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:17:46.728999" 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-10-16T01:17:46.728428" elapsed="0.000605"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:46.729350" elapsed="0.000611"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:17:46.731390" level="INFO">Logging into '10.30.170.14:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:17:47.355374" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-194-generic x86_64)

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

 System information as of Fri Oct 16 01:17:46 UTC 2026

  System load:  0.11               Processes:             120
  Usage of /:   14.0% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.14
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:14:00 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:17:46.730935" elapsed="0.624598"/>
</kw>
<msg time="2026-10-16T01:17:47.355680" 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-10-16T01:17:46.730292" elapsed="0.625488"/>
</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-10-16T01:17:46.727287" elapsed="0.628718"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:17:47.356881" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-10-16T01:17:47.369685" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-10-16T01:17:47.370087" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:17:47.370305" 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-10-16T01:17:47.356399" elapsed="0.014064"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:47.370897" elapsed="0.000719"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:47.373309" 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-10-16T01:17:47.372568" elapsed="0.000974"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:17:47.374242" elapsed="0.000044"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:47.373790" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:47.373720" elapsed="0.000734"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:17:47.375074" elapsed="0.000082"/>
</return>
<status status="PASS" start="2026-10-16T01:17:47.374649" elapsed="0.000571"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:47.374597" elapsed="0.000726"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:17:47.375439" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:47.377595" 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-10-16T01:17:47.378555" elapsed="0.000310"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:47.379183" elapsed="0.000207"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:17:47.376342" elapsed="0.003144"/>
</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-10-16T01:17:46.719318" elapsed="0.660538"/>
</kw>
<msg time="2026-10-16T01:17:47.379998" 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-10-16T01:17:46.718412" elapsed="0.661655"/>
</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-10-16T01:17:46.715676" elapsed="0.664490"/>
</kw>
<msg time="2026-10-16T01:17:47.380217" 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-10-16T01:17:46.714994" elapsed="0.665281"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:47.381169" elapsed="0.000398"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:17:47.381845" elapsed="0.000186"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:47.382222" elapsed="0.000121"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:17:47.380665" elapsed="0.001742"/>
</kw>
<msg time="2026-10-16T01:17:47.382534" 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-10-16T01:17:46.713885" elapsed="0.668682"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:47.383224" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:17:47.382913" elapsed="0.000364"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-10-16T01:17:47.383329" elapsed="0.000036"/>
</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-10-16T01:17:46.712755" elapsed="0.670712"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:17:46.712427" elapsed="0.671098"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:47.384694" level="INFO">${member_ip} = 10.30.170.84</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-10-16T01:17:47.384382" elapsed="0.000376"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:47.385733" 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-10-16T01:17:47.385860" 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-10-16T01:17:47.385537" elapsed="0.000357"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:47.390150" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:47.389270" elapsed="0.001017"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:47.389214" elapsed="0.001180"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:47.391389" 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-10-16T01:17:47.391812" 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-10-16T01:17:47.390864" elapsed="0.001108"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:47.393176" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.84" 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-10-16T01:17:47.392391" elapsed="0.000990"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:47.394923" level="INFO">${conn_id} = 219</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-10-16T01:17:47.393967" elapsed="0.001113"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:17:47.396976" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:17:47.397074" 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-10-16T01:17:47.396592" elapsed="0.000514"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:47.397371" elapsed="0.000544"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:17:47.399155" level="INFO">Logging into '10.30.170.84:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:17:48.066577" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-194-generic x86_64)

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

 System information as of Fri Oct 16 01:17:47 UTC 2026

  System load:  0.2                Processes:             123
  Usage of /:   14.2% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.84
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:14:00 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:17:47.398917" elapsed="0.667862"/>
</kw>
<msg time="2026-10-16T01:17:48.066889" 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-10-16T01:17:47.398201" elapsed="0.668789"/>
</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-10-16T01:17:47.395599" elapsed="0.671674"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:17:48.068441" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-10-16T01:17:48.081556" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-10-16T01:17:48.081954" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:17:48.082167" 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-10-16T01:17:48.067839" elapsed="0.014484"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:48.082741" elapsed="0.000672"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:48.085199" 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-10-16T01:17:48.084305" elapsed="0.001199"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:17:48.086183" elapsed="0.000042"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:48.085775" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:48.085679" elapsed="0.000713"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:17:48.086954" elapsed="0.000080"/>
</return>
<status status="PASS" start="2026-10-16T01:17:48.086587" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:48.086532" elapsed="0.000672"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:17:48.087323" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:48.089269" 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-10-16T01:17:48.090213" elapsed="0.000283"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:48.090852" elapsed="0.000208"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:17:48.088273" elapsed="0.002880"/>
</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-10-16T01:17:47.388143" elapsed="0.703278"/>
</kw>
<msg time="2026-10-16T01:17:48.091576" 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-10-16T01:17:47.387289" elapsed="0.704357"/>
</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-10-16T01:17:47.386755" elapsed="0.705072"/>
</kw>
<msg time="2026-10-16T01:17:48.091881" 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-10-16T01:17:47.386099" elapsed="0.705840"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:48.092847" 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-10-16T01:17:48.093493" elapsed="0.000199"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:48.093915" 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-10-16T01:17:48.092318" elapsed="0.001786"/>
</kw>
<msg time="2026-10-16T01:17:48.094217" 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-10-16T01:17:47.385035" elapsed="0.709215"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:48.094939" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:17:48.094570" elapsed="0.000422"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-10-16T01:17:48.095046" elapsed="0.000037"/>
</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-10-16T01:17:47.383954" elapsed="0.711231"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:17:47.383725" elapsed="0.711506"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:17:45.977840" elapsed="2.117435"/>
</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-10-16T01:17:45.975890" elapsed="2.119456"/>
</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-10-16T01:17:48.095571" elapsed="0.000308"/>
</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-10-16T01:17:48.103249" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:48.103127" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:48.103102" elapsed="0.000235"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:48.103815" 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-10-16T01:17:48.103913" 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-10-16T01:17:48.103622" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:48.104352" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:17:48.104123" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:48.104874" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:17:48.104631" elapsed="0.000283"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:48.105603" 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-10-16T01:17:48.105413" elapsed="0.000308">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-10-16T01:17:48.105817" level="INFO">${status} = FAIL</msg>
<msg time="2026-10-16T01:17:48.105858" 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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:48.105068" elapsed="0.000812"/>
</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-10-16T01:17:48.106157" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:48.105947" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:48.105931" elapsed="0.000315"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:48.106896" level="INFO">${ip_address} = 10.30.170.180</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_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-10-16T01:17:48.106674" elapsed="0.000246"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-10-16T01:17:48.106963" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:17:48.107083" level="INFO">${odl_ip} = 10.30.170.180</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-10-16T01:17:48.106421" elapsed="0.000684"/>
</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-10-16T01:17:48.107275" elapsed="0.000325"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:48.107930" level="INFO">index=222
host=10.30.170.180
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-10-16T01:17:48.108018" level="INFO">${karaf_connection_object} = index=222
host=10.30.170.180
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-10-16T01:17:48.107821" elapsed="0.000221"/>
</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-10-16T01:17:48.108197" elapsed="0.000233"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-10-16T01:17:48.108840" level="INFO">Logging into '10.30.170.180:8101' as 'karaf'.</msg>
<msg time="2026-10-16T01:17:48.432133" 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-10-16T01:17:48.108622" elapsed="0.323664"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:48.434094" 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-10-16T01:17:48.434617" elapsed="0.000174"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:48.434932" elapsed="0.000094"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:17:48.433447" elapsed="0.001627"/>
</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-10-16T01:17:48.432765" elapsed="0.002351"/>
</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-10-16T01:17:48.102801" elapsed="0.332361"/>
</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-10-16T01:17:48.096849" elapsed="0.338357"/>
</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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:48.096302" elapsed="0.339009"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:17:48.096109" elapsed="0.339241"/>
</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-10-16T01:17:48.440527" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:48.440415" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:48.440392" elapsed="0.000211"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:48.440938" 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-10-16T01:17:48.441035" 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-10-16T01:17:48.440812" elapsed="0.000248"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:48.441478" level="INFO">{1: 222}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:17:48.441243" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:48.442002" level="INFO">2</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:17:48.441784" elapsed="0.000258"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:48.442756" 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-10-16T01:17:48.442554" elapsed="0.000313">Dictionary does not contain key '2'.</status>
</kw>
<msg time="2026-10-16T01:17:48.442966" level="INFO">${status} = FAIL</msg>
<msg time="2026-10-16T01:17:48.443006" 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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:48.442192" elapsed="0.000835"/>
</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-10-16T01:17:48.443301" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:48.443093" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:48.443077" elapsed="0.000312"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:48.444043" level="INFO">${ip_address} = 10.30.170.14</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_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-10-16T01:17:48.443837" elapsed="0.000230"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-10-16T01:17:48.444110" elapsed="0.000029"/>
</return>
<msg time="2026-10-16T01:17:48.444236" level="INFO">${odl_ip} = 10.30.170.14</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-10-16T01:17:48.443582" elapsed="0.000676"/>
</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-10-16T01:17:48.444425" elapsed="0.000348"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:48.445086" level="INFO">index=224
host=10.30.170.14
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-10-16T01:17:48.445173" level="INFO">${karaf_connection_object} = index=224
host=10.30.170.14
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-10-16T01:17:48.444980" elapsed="0.000217"/>
</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-10-16T01:17:48.445349" elapsed="0.000254"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-10-16T01:17:48.445998" level="INFO">Logging into '10.30.170.14:8101' as 'karaf'.</msg>
<msg time="2026-10-16T01:17:48.688582" 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-10-16T01:17:48.445795" elapsed="0.242938"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:48.690170" 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-10-16T01:17:48.690758" elapsed="0.000154"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:48.691051" elapsed="0.000093"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:17:48.689802" elapsed="0.001390"/>
</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-10-16T01:17:48.689131" elapsed="0.002103"/>
</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-10-16T01:17:48.440163" elapsed="0.251117"/>
</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-10-16T01:17:48.436020" elapsed="0.255303"/>
</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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:48.435603" elapsed="0.255768"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:17:48.435448" elapsed="0.255971"/>
</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-10-16T01:17:48.696554" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:48.696443" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:48.696420" elapsed="0.000208"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:48.696975" 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-10-16T01:17:48.697072" 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-10-16T01:17:48.696848" elapsed="0.000248"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:48.697536" level="INFO">{1: 222, 2: 224}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:17:48.697289" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:48.697999" level="INFO">3</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:17:48.697782" elapsed="0.000256"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:48.698754" 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-10-16T01:17:48.698553" elapsed="0.000306">Dictionary does not contain key '3'.</status>
</kw>
<msg time="2026-10-16T01:17:48.698957" level="INFO">${status} = FAIL</msg>
<msg time="2026-10-16T01:17:48.698997" 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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:48.698188" elapsed="0.000830"/>
</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-10-16T01:17:48.699294" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:48.699086" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:48.699070" elapsed="0.000312"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:48.700033" level="INFO">${ip_address} = 10.30.170.84</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_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-10-16T01:17:48.699825" elapsed="0.000232"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-10-16T01:17:48.700099" elapsed="0.000029"/>
</return>
<msg time="2026-10-16T01:17:48.700225" level="INFO">${odl_ip} = 10.30.170.84</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-10-16T01:17:48.699571" elapsed="0.000677"/>
</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-10-16T01:17:48.700418" elapsed="0.000350"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:48.701088" level="INFO">index=226
host=10.30.170.84
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-10-16T01:17:48.701176" level="INFO">${karaf_connection_object} = index=226
host=10.30.170.84
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-10-16T01:17:48.700981" elapsed="0.000219"/>
</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-10-16T01:17:48.701354" elapsed="0.000253"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-10-16T01:17:48.702040" level="INFO">Logging into '10.30.170.84:8101' as 'karaf'.</msg>
<msg time="2026-10-16T01:17:49.055876" 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-10-16T01:17:48.701838" elapsed="0.354185"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:49.057572" elapsed="0.000348"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:17:49.058101" elapsed="0.000150"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:49.058388" elapsed="0.000091"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:17:49.057181" elapsed="0.001361"/>
</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-10-16T01:17:49.056458" elapsed="0.002128"/>
</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-10-16T01:17:48.696190" elapsed="0.362442"/>
</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-10-16T01:17:48.692101" elapsed="0.366573"/>
</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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:48.691686" elapsed="0.367059"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:17:48.691545" elapsed="0.367238"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-10-16T01:17:48.095949" elapsed="0.962870"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-10-16T01:17:45.954324" elapsed="3.104553"/>
</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-10-16T01:17:49.059739" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:49.059625" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:49.059604" 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-10-16T01:17:49.061625" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:49.061542" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:49.061524" elapsed="0.000163"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:17:49.062551" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:17:49.062208" elapsed="0.000370"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:17:49.063011" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:17:49.062741" elapsed="0.000294"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:17:49.063075" elapsed="0.000033"/>
</return>
<msg time="2026-10-16T01:17:49.063209" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:17:49.061908" elapsed="0.001323"/>
</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-10-16T01:17:49.065630" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:49.065540" elapsed="0.000132"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:49.065510" elapsed="0.000183"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:49.066793" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:49.066666" elapsed="0.000244"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:49.066649" elapsed="0.000285"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:49.067445" level="INFO">${karaf_connection_index} = 222</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:17:49.067079" elapsed="0.000473"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:49.068028" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:17:49.067811" elapsed="0.000256"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:17:49.121451" 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-10-16T01:17:49.069799" elapsed="0.051816"/>
</kw>
<msg time="2026-10-16T01:17:49.121779" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:17:49.121847" 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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:49.068290" elapsed="0.053607"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:17:49.194148" 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 "- "m "a "n "g "a "n "e "s "e "/ "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 "[78Cn "[A[78Cd
 "_ "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-10-16T01:17:49.123487" elapsed="0.070836"/>
</kw>
<msg time="2026-10-16T01:17:49.194461" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:17:49.194541" 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 "- "m "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:49.122149" elapsed="0.072444"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:49.195019" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:49.194769" elapsed="0.000387"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:49.194749" elapsed="0.000432"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:49.195896" 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 "- "m "a "n "g "a "n "e "s "e "/ "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 "[78Cn "[A[78Cd
 "_ "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-10-16T01:17:49.195365" elapsed="0.000659"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:49.196382" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:49.196141" elapsed="0.000392"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:49.196123" elapsed="0.000436"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:17:49.196591" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:49.198572" elapsed="0.000299"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:17:49.199092" elapsed="0.000139"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:49.199411" elapsed="0.000090"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:17:49.197940" elapsed="0.001677"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:17:49.196891" elapsed="0.002863"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:17:49.066449" elapsed="0.133383"/>
</kw>
<msg time="2026-10-16T01:17:49.199914" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:49.199953" 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 "- "m "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:49.065859" elapsed="0.134157"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:17:49.200187" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:17:49.200093" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:49.200076" elapsed="0.000188"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:17:49.200635" 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-10-16T01:17:49.201061" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:17:49.201127" 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-10-16T01:17:49.065266" elapsed="0.135947"/>
</kw>
<msg time="2026-10-16T01:17:49.201295" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:49.201334" 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 "- "m "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:49.063580" elapsed="0.137788"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:49.201664" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:49.201433" elapsed="0.000374"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:49.201418" elapsed="0.000414"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:17:49.063428" elapsed="0.138426"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:49.204110" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:49.204025" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:49.204009" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:49.205280" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:49.205175" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:49.205158" elapsed="0.000251"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:49.205943" 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-10-16T01:17:49.205567" elapsed="0.000415"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:49.206417" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:17:49.206214" elapsed="0.000241"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:17:49.252584" 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-10-16T01:17:49.208037" elapsed="0.044723"/>
</kw>
<msg time="2026-10-16T01:17:49.252920" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:17:49.252996" 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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:49.206731" elapsed="0.046315"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:17:49.318643" 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 "- "m "a "n "g "a "n "e "s "e "/ "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 "[78Cn "[A[78Cd
 "_ "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-10-16T01:17:49.254748" elapsed="0.064095"/>
</kw>
<msg time="2026-10-16T01:17:49.318981" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:17:49.319048" 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 "- "m "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:49.253325" elapsed="0.065771"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:49.319539" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:49.319262" elapsed="0.000412"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:49.319236" elapsed="0.000553"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:49.320695" 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 "- "m "a "n "g "a "n "e "s "e "/ "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 "[78Cn "[A[78Cd
 "_ "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-10-16T01:17:49.319993" elapsed="0.000848"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:49.321205" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:49.320959" elapsed="0.000382"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:49.320941" elapsed="0.000469"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:17:49.321447" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:49.323479" elapsed="0.000350"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:17:49.324054" elapsed="0.000147"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:49.324381" elapsed="0.000092"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:17:49.322858" elapsed="0.001730"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:17:49.321782" elapsed="0.002903"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:17:49.204973" elapsed="0.119850"/>
</kw>
<msg time="2026-10-16T01:17:49.324906" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:49.324946" 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 "- "m "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:49.204319" elapsed="0.120663"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:17:49.325134" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:17:49.325050" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:49.325034" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:17:49.325575" 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-10-16T01:17:49.325970" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:17:49.326036" 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-10-16T01:17:49.203791" elapsed="0.122329"/>
</kw>
<msg time="2026-10-16T01:17:49.326202" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:49.326242" 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 "- "m "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:49.202100" elapsed="0.124177"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:49.326572" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:49.326344" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:49.326328" elapsed="0.000316"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:17:49.201964" elapsed="0.124702"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:49.328974" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:49.328890" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:49.328871" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:49.330061" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:49.329957" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:49.329940" elapsed="0.000250"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:49.330716" 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-10-16T01:17:49.330334" elapsed="0.000422"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:49.331196" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:17:49.330988" elapsed="0.000245"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:17:49.389276" 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-10-16T01:17:49.332763" elapsed="0.056654"/>
</kw>
<msg time="2026-10-16T01:17:49.389570" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:17:49.389637" 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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:49.331449" elapsed="0.058237"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:17:49.468482" 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 "- "m "a "n "g "a "n "e "s "e "/ "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 "[78Cn "[A[78Cd
 "_ "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-10-16T01:17:49.391314" elapsed="0.077660"/>
</kw>
<msg time="2026-10-16T01:17:49.469351" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:17:49.469502" 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 "- "m "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:49.390000" elapsed="0.079656"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:49.470977" elapsed="0.000102"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:49.470308" elapsed="0.000977"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:49.470251" elapsed="0.001095"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:49.472977" 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 "- "m "a "n "g "a "n "e "s "e "/ "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 "[78Cn "[A[78Cd
 "_ "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-10-16T01:17:49.471806" elapsed="0.001451"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:49.474128" elapsed="0.000094"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:49.473535" elapsed="0.000893"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:49.473477" elapsed="0.001006"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:17:49.474576" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:49.479648" elapsed="0.000998"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:17:49.481183" elapsed="0.000320"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:49.481989" elapsed="0.000208"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:17:49.477663" elapsed="0.004762"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:17:49.475264" elapsed="0.007427"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:17:49.329756" elapsed="0.153190"/>
</kw>
<msg time="2026-10-16T01:17:49.483129" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:49.483216" 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 "- "m "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:49.329182" elapsed="0.154111"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:17:49.483662" elapsed="0.000144"/>
</return>
<status status="PASS" start="2026-10-16T01:17:49.483442" elapsed="0.000414"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:49.483406" elapsed="0.000484"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:17:49.484417" elapsed="0.000035"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:49.484967" elapsed="0.000034"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:17:49.485064" elapsed="0.000021"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:17:49.328632" elapsed="0.156555"/>
</kw>
<msg time="2026-10-16T01:17:49.485309" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:49.485367" 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 "- "m "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:49.326945" elapsed="0.158472"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:49.485888" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:49.485530" elapsed="0.000489"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:49.485492" elapsed="0.000564"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:17:49.326807" elapsed="0.159282"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:17:49.063282" elapsed="0.422850"/>
</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-10-16T01:17:49.061305" elapsed="0.424904"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-10-16T01:17:49.059431" elapsed="0.426854"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:49.059028" elapsed="0.427315"/>
</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-10-16T01:17:45.950349" elapsed="3.536064"/>
</kw>
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-10-16T01:17:49.487697" 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-10-16T01:17:49.487247" elapsed="0.000507"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="PASS" start="2026-10-16T01:17:49.487958" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-10-16T01:17:49.487849" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:49.487826" elapsed="0.000241"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:49.488325" elapsed="0.000028"/>
</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-10-16T01:17:49.488591" elapsed="0.000027"/>
</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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:49.488859" elapsed="0.000027"/>
</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-10-16T01:17:49.489128" elapsed="0.000026"/>
</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-10-16T01:17:49.489463" elapsed="0.000031"/>
</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-10-16T01:17:49.486853" elapsed="0.002740"/>
</kw>
<status status="PASS" start="2026-10-16T01:17:45.949912" elapsed="3.539748"/>
</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-10-16T01:17:49.491425" elapsed="0.000336"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:17:49.491063" elapsed="0.000772"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:49.493218" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:49.493099" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:49.493077" elapsed="0.000229"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:49.496215" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:49.496097" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:49.496074" elapsed="0.000231"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:17:49.497590" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:17:49.497119" elapsed="0.000506"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:17:49.498237" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:17:49.497855" elapsed="0.000416"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:17:49.498327" elapsed="0.000036"/>
</return>
<msg time="2026-10-16T01:17:49.498540" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:17:49.496602" elapsed="0.001973"/>
</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-10-16T01:17:49.501973" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:49.501855" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:49.501831" 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-10-16T01:17:49.503591" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:49.503457" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:49.503434" elapsed="0.000319"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:49.504279" level="INFO">${karaf_connection_index} = 222</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:17:49.503962" elapsed="0.000351"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:49.504834" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:17:49.504552" elapsed="0.000315"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:17:49.542388" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:17:49.505670" elapsed="0.036901"/>
</kw>
<msg time="2026-10-16T01:17:49.542763" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:17:49.542805" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:49.505080" elapsed="0.037761"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:17:49.613377" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:17:49.543430" elapsed="0.070135"/>
</kw>
<msg time="2026-10-16T01:17:49.613753" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:17:49.613796" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:49.543010" elapsed="0.070821"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:49.614104" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:49.613902" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:49.613884" elapsed="0.000315"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:49.614750" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:17:49.614380" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:49.615085" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:49.614891" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:49.614874" elapsed="0.000304"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:17:49.615208" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:49.617674" 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-10-16T01:17:49.619438" elapsed="0.000615"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:49.621260" 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-10-16T01:17:49.616003" elapsed="0.005651"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:17:49.615482" elapsed="0.006323"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:17:49.503099" elapsed="0.118788"/>
</kw>
<msg time="2026-10-16T01:17:49.621968" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:49.622006" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:49.502263" elapsed="0.119778"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:17:49.622195" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:17:49.622110" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:49.622093" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:17:49.622596" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:49.623055" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:17:49.623121" 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-10-16T01:17:49.501421" elapsed="0.121784"/>
</kw>
<msg time="2026-10-16T01:17:49.623287" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:49.623325" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:49.499048" elapsed="0.124312"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:49.623658" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:49.623426" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:49.623410" elapsed="0.000355"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:17:49.498856" elapsed="0.124931"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:49.626443" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:49.626355" elapsed="0.000135"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:49.626335" elapsed="0.000176"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:49.627622" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:49.627538" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:49.627508" elapsed="0.000176"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:49.628162" 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-10-16T01:17:49.627925" elapsed="0.000262"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:49.628536" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:17:49.628346" elapsed="0.000214"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:17:49.680217" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:17:49.629146" elapsed="0.051514"/>
</kw>
<msg time="2026-10-16T01:17:49.681061" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:17:49.681151" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:49.628733" elapsed="0.052495"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:17:49.771181" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:17:49.682600" elapsed="0.088764"/>
</kw>
<msg time="2026-10-16T01:17:49.771537" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:17:49.771580" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:49.681609" elapsed="0.090006"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:49.771919" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:49.771688" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:49.771669" elapsed="0.000346"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:49.772559" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:17:49.772197" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:49.772923" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:49.772717" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:49.772684" elapsed="0.000333"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:17:49.773048" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:49.775611" 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-10-16T01:17:49.777361" elapsed="0.000503"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:49.779242" elapsed="0.002034"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:17:49.773874" elapsed="0.007472"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:17:49.773338" elapsed="0.008128"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:17:49.627272" elapsed="0.154292"/>
</kw>
<msg time="2026-10-16T01:17:49.781648" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:49.781688" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:49.626675" elapsed="0.155063"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:17:49.781897" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:17:49.781810" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:49.781792" elapsed="0.000185"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:17:49.782297" 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-10-16T01:17:49.782613" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:17:49.782679" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:17:49.626045" elapsed="0.156763"/>
</kw>
<msg time="2026-10-16T01:17:49.782890" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:49.782929" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:49.624032" elapsed="0.158931"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:49.783250" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:49.783030" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:49.783014" elapsed="0.000308"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:17:49.623896" elapsed="0.159448"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:49.785693" elapsed="0.000049"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:49.785608" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:49.785590" 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-10-16T01:17:49.786887" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:49.786803" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:49.786786" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:49.787315" 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-10-16T01:17:49.787090" elapsed="0.000250"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:49.787688" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:17:49.787498" elapsed="0.000231"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:17:49.829543" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:17:49.788295" elapsed="0.041473"/>
</kw>
<msg time="2026-10-16T01:17:49.829948" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:17:49.829991" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:49.787883" elapsed="0.042141"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:17:49.932827" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:17:49.830625" elapsed="0.102470"/>
</kw>
<msg time="2026-10-16T01:17:49.933279" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:17:49.933321" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:49.830188" elapsed="0.103166"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:49.933727" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:49.933446" elapsed="0.000356"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:49.933417" elapsed="0.000413"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:49.934405" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:17:49.934015" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:49.934773" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:49.934556" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:49.934539" elapsed="0.000331"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:17:49.934904" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:49.937488" 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-10-16T01:17:49.939251" elapsed="0.000558"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:49.941141" elapsed="0.000628"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:17:49.935780" elapsed="0.006061"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:17:49.935230" elapsed="0.006730"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:17:49.786526" elapsed="0.155512"/>
</kw>
<msg time="2026-10-16T01:17:49.942120" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:49.942160" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:49.785941" elapsed="0.156252"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:17:49.942349" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:17:49.942263" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:49.942246" elapsed="0.000182"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:17:49.942808" 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-10-16T01:17:49.943111" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:17:49.943176" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:17:49.785304" elapsed="0.157957"/>
</kw>
<msg time="2026-10-16T01:17:49.943344" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:49.943383" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:49.783612" elapsed="0.159804"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:49.943773" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:49.943482" elapsed="0.000343"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:49.943467" elapsed="0.000381"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:17:49.783458" elapsed="0.160412"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:17:49.498642" elapsed="0.445259"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:17:49.495666" elapsed="0.448291"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:17:49.492673" elapsed="0.451368"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:49.492045" elapsed="0.452040"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:17:49.490468" elapsed="0.453665"/>
</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-10-16T01:17:49.951929" elapsed="0.000186"/>
</kw>
<msg time="2026-10-16T01:17:49.952158" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:49.951380" elapsed="0.000825"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:17:49.950993" elapsed="0.001280"/>
</kw>
<msg time="2026-10-16T01:17:49.952312" 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-10-16T01:17:49.948172" elapsed="0.004179"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:17:49.947818" elapsed="0.004597"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:49.952882" 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-10-16T01:17:49.952637" elapsed="0.000286"/>
</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-10-16T01:17:49.955781" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:17:49.955423" elapsed="0.000383"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:17:49.956229" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:17:49.955956" elapsed="0.000296"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:17:49.956293" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:17:49.956418" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:17:49.955075" elapsed="0.001365"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:17:49.956599" elapsed="0.000324"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:17:49.957397" 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-10-16T01:17:49.957091" elapsed="0.000331"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:17:49.957868" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:17:49.957581" elapsed="0.000326"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:17:49.958311" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:17:49.958061" elapsed="0.000275"/>
</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-10-16T01:17:49.960419" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:17:49.960152" elapsed="0.000292"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:17:49.960485" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:17:49.960621" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:17:49.959837" elapsed="0.000807"/>
</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-10-16T01:17:49.978719" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:17:49.978387" elapsed="0.000359"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:17:49.979433" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:17:49.979219" elapsed="0.000342">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:17:49.979649" 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-10-16T01:17:49.978903" elapsed="0.000768"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:17:49.980167" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:17:49.979857" elapsed="0.000334"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:17:49.980471" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:17:49.980633" 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-10-16T01:17:49.980357" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:49.981087" 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-10-16T01:17:49.980864" elapsed="0.000264"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:49.982035" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:17:49.981805" elapsed="0.000271"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:17:49.982504" 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-10-16T01:17:49.982250" 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-10-16T01:17:49.982837" elapsed="0.000020"/>
</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-10-16T01:17:49.983020" elapsed="0.000022"/>
</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-10-16T01:17:49.983199" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:17:49.982693" elapsed="0.000558"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:17:49.982583" elapsed="0.000695"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:17:49.983317" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:17:49.983447" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:17:49.981439" elapsed="0.002030"/>
</kw>
<status status="PASS" start="2026-10-16T01:17:49.981189" elapsed="0.002309"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:49.983680" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:49.983534" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:49.981172" elapsed="0.002595"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:17:49.984324" 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-10-16T01:17:49.983925" elapsed="0.000424"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:17:49.984394" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:17:49.977883" elapsed="0.006611"/>
</kw>
<msg time="2026-10-16T01:17:49.984557" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:49.973430" elapsed="0.011221"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:49.988861" elapsed="0.000067"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:49.993156" elapsed="0.000068"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:49.997602" elapsed="0.000068"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:49.998022" 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-10-16T01:17:49.998412" 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-10-16T01:17:49.998937" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:49.998792" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:17:49.998778" 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-10-16T01:17:49.999162" elapsed="0.000019"/>
</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-10-16T01:17:49.999336" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:49.999495" elapsed="0.000029"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:17:49.998750" elapsed="0.000805"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:17:49.998606" elapsed="0.000984"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:49.999920" elapsed="0.000053"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:50.000067" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:17:50.000247" 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-10-16T01:17:49.971191" elapsed="0.029103"/>
</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-10-16T01:17:50.002580" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:17:50.002368" elapsed="0.000274">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:17:50.002846" 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-10-16T01:17:50.001962" elapsed="0.000928"/>
</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-10-16T01:17:50.003335" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:50.003023" elapsed="0.000386"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:17:50.004036" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:17:50.003760" elapsed="0.000300"/>
</kw>
<status status="PASS" start="2026-10-16T01:17:50.003464" elapsed="0.000654"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:50.002983" elapsed="0.001189"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:17:50.005152" 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-10-16T01:17:50.004487" elapsed="0.000709"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:17:50.005287" elapsed="0.000060"/>
</return>
<msg time="2026-10-16T01:17:50.005586" 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-manganese/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-10-16T01:17:50.001100" elapsed="0.004543"/>
</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-10-16T01:17:50.008011" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:17:50.007812" elapsed="0.000258">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:17:50.008283" 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-10-16T01:17:50.007368" elapsed="0.000957"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:17:50.008659" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:17:50.008455" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:50.008417" 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-10-16T01:17:50.009267" elapsed="0.000052"/>
</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-10-16T01:17:50.009659" elapsed="0.000186"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:17:50.009934" elapsed="0.000028"/>
</return>
<msg time="2026-10-16T01:17:50.010166" 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-manganese/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-10-16T01:17:50.006431" elapsed="0.003782"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:50.013577" 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-10-16T01:17:50.013262" elapsed="0.000407"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:50.014442" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:17:50.014130" 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-10-16T01:17:50.021895" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:17:50.021950" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:17:50.022051" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:17:50.015042" elapsed="0.007377">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:17:50.014690" elapsed="0.007904">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:17:50.022897" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:50.022661" elapsed="0.000341"/>
</branch>
<status status="FAIL" start="2026-10-16T01:17:50.014650" elapsed="0.008408">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:17:50.023723" elapsed="0.000068"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:50.024015" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:50.023924" elapsed="0.000149"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:17:50.023885" 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-10-16T01:17:50.024419" elapsed="0.000052"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:17:50.024576" elapsed="0.000027"/>
</return>
<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="FAIL" start="2026-10-16T01:17:50.010943" elapsed="0.013784">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:50.024958" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:17:49.962726" elapsed="0.062391">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:17:50.025394" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:50.025235" elapsed="0.000591"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:17:50.025218" elapsed="0.000635"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:17:50.025884" elapsed="0.000017"/>
</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="FAIL" start="2026-10-16T01:17:49.962101" elapsed="0.063882">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:17:49.960719" elapsed="0.065325">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:17:49.960688" elapsed="0.065384">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:50.026336" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:17:50.026549" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:50.026734" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:17:50.026935" elapsed="0.000021"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:17:50.027136" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:17:50.027299" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:17:50.027460" elapsed="0.000019"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:17:50.027577" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:17:49.959331" elapsed="0.068341">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:17:50.027852" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:17:49.958739" elapsed="0.069203">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:50.028159" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:50.028020" elapsed="0.000188"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:50.028367" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:50.028231" elapsed="0.000184"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:50.028588" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:50.028436" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:17:50.028004" elapsed="0.000652"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:17:49.958564" elapsed="0.070130">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:17:49.958381" elapsed="0.070382">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:17:50.028811" elapsed="0.000013"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:17:49.954467" elapsed="0.074432">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:50.029106" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:50.029326" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:50.029185" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:17:50.029170" elapsed="0.000223"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:50.029532" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:50.029716" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:17:50.029776" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:17:49.953793" elapsed="0.076073">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:17:49.953578" elapsed="0.076349">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:17:49.953455" elapsed="0.076519">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:17:49.953125" elapsed="0.076928">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:50.030258" elapsed="0.000021"/>
</kw>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:17:49.944340" elapsed="0.086019">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:17:49.489780" elapsed="0.540709">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:17:50.031960" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:17:50.031588" elapsed="0.000631"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:50.033396" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:50.033206" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:50.033188" elapsed="0.000279"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:50.035486" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:50.035402" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:50.035385" elapsed="0.000175"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:17:50.036449" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:17:50.036126" elapsed="0.000348"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:17:50.036925" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:17:50.036635" elapsed="0.000314"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:17:50.036990" elapsed="0.000064"/>
</return>
<msg time="2026-10-16T01:17:50.037158" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:17:50.035775" elapsed="0.001406"/>
</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-10-16T01:17:50.039596" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:50.039497" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:50.039481" elapsed="0.000177"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:50.040937" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:50.040669" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:50.040653" elapsed="0.000377"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:50.041615" level="INFO">${karaf_connection_index} = 222</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:17:50.041291" elapsed="0.000350"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:50.042006" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:17:50.041824" elapsed="0.000207"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:17:50.079094" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:17:50.042634" elapsed="0.036639"/>
</kw>
<msg time="2026-10-16T01:17:50.079435" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:17:50.079477" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:50.042187" elapsed="0.037324"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:17:50.162591" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:17:50.080146" elapsed="0.082641"/>
</kw>
<msg time="2026-10-16T01:17:50.162944" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:17:50.162985" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:50.079694" elapsed="0.083326"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:50.163318" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:50.163097" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:50.163076" elapsed="0.000336"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:50.164000" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:17:50.163625" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:50.164338" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:50.164138" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:50.164122" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:17:50.164461" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:50.167283" elapsed="0.000679"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:17:50.169206" elapsed="0.000504"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:50.170901" 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-10-16T01:17:50.165463" elapsed="0.005823"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:17:50.164942" elapsed="0.006465"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:17:50.040400" elapsed="0.131084"/>
</kw>
<msg time="2026-10-16T01:17:50.171578" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:50.171618" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:50.039824" elapsed="0.131828"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:17:50.171835" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:17:50.171749" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:50.171731" elapsed="0.000181"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:17:50.172239" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:50.172552" elapsed="0.000058"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:17:50.172655" 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-10-16T01:17:50.039202" elapsed="0.133659"/>
</kw>
<msg time="2026-10-16T01:17:50.172944" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:50.172983" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:50.037501" elapsed="0.135517"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:50.173300" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:50.173085" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:50.173069" elapsed="0.000302"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:17:50.037363" elapsed="0.136030"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:50.175801" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:50.175688" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:50.175671" 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-10-16T01:17:50.177164" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:50.177079" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:50.177060" elapsed="0.000167"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:50.177610" 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-10-16T01:17:50.177371" elapsed="0.000263"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:50.177984" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:17:50.177813" elapsed="0.000195"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:17:50.216209" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:17:50.178582" elapsed="0.037802"/>
</kw>
<msg time="2026-10-16T01:17:50.216555" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:17:50.216597" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:50.178160" elapsed="0.038472"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:17:50.280290" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:17:50.217235" elapsed="0.063263"/>
</kw>
<msg time="2026-10-16T01:17:50.280689" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:17:50.280756" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:50.216815" elapsed="0.063977"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:50.281123" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:50.280881" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:50.280855" elapsed="0.000364"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:50.281810" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:17:50.281399" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:50.282147" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:50.281955" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:50.281938" elapsed="0.000301"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:17:50.282271" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:50.284837" 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-10-16T01:17:50.286616" elapsed="0.000493"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:50.288307" elapsed="0.000519"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:17:50.283120" elapsed="0.005776"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:17:50.282590" elapsed="0.006423"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:17:50.176601" elapsed="0.112488"/>
</kw>
<msg time="2026-10-16T01:17:50.289171" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:50.289209" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:50.176008" elapsed="0.113237"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:17:50.289395" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:17:50.289312" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:50.289295" elapsed="0.000177"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:17:50.289837" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:50.290136" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:17:50.290199" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:17:50.175384" elapsed="0.114899"/>
</kw>
<msg time="2026-10-16T01:17:50.290366" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:50.290405" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:50.173659" elapsed="0.116781"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:50.290756" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:50.290505" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:50.290489" elapsed="0.000340"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:17:50.173508" elapsed="0.117343"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:50.293490" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:50.293406" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:50.293389" elapsed="0.000180"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:17:50.294714" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:50.294589" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:50.294567" elapsed="0.000229"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:17:50.295241" 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-10-16T01:17:50.294973" elapsed="0.000297"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:50.295676" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:17:50.295469" elapsed="0.000252"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:17:50.333721" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:17:50.296302" elapsed="0.037594"/>
</kw>
<msg time="2026-10-16T01:17:50.334073" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:17:50.334114" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:50.295885" elapsed="0.038264"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:17:50.402967" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:17:50.334773" elapsed="0.068403"/>
</kw>
<msg time="2026-10-16T01:17:50.403333" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:17:50.403374" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:50.334311" elapsed="0.069098"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:50.403693" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:50.403478" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:50.403460" elapsed="0.000349"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:50.404323" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:17:50.403987" elapsed="0.000416"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:50.404674" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:50.404463" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:50.404447" elapsed="0.000336"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:17:50.404814" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:50.407278" 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-10-16T01:17:50.409029" elapsed="0.000499"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:50.410936" elapsed="0.000439"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:17:50.405582" elapsed="0.005862"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:17:50.405081" elapsed="0.006496"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:17:50.294309" elapsed="0.117345"/>
</kw>
<msg time="2026-10-16T01:17:50.411750" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:50.411789" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:50.293729" elapsed="0.118095"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:17:50.411975" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:17:50.411892" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:50.411875" elapsed="0.000177"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:17:50.412357" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:50.412666" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:17:50.412831" 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-10-16T01:17:50.293113" elapsed="0.119806"/>
</kw>
<msg time="2026-10-16T01:17:50.413000" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:17:50.413039" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:50.291102" elapsed="0.121972"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:50.413357" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:50.413141" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:50.413125" elapsed="0.000304"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:17:50.290966" elapsed="0.122485"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:17:50.037228" elapsed="0.376249"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:17:50.035108" elapsed="0.378439"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:17:50.032794" elapsed="0.380841"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:17:50.032364" elapsed="0.381316"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:17:50.031243" elapsed="0.382503"/>
</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-10-16T01:17:50.416369" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:17:50.416040" elapsed="0.000354"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:17:50.416846" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:17:50.416559" elapsed="0.000312"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:17:50.416914" elapsed="0.000028"/>
</return>
<msg time="2026-10-16T01:17:50.417041" 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-10-16T01:17:50.415652" elapsed="0.001412"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:50.419165" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:50.418932" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:50.418915" elapsed="0.000324"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:50.419716" 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-10-16T01:17:50.419811" 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-10-16T01:17:50.419427" elapsed="0.000407"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:50.420307" level="INFO">Attempting to execute command "sudo mn -c" on remote system "10.30.171.104" 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-10-16T01:17:50.420020" elapsed="0.000329"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:50.420857" level="INFO">${conn_id} = 237</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-10-16T01:17:50.420536" elapsed="0.000345"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:17:50.421691" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:17:50.421776" 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-10-16T01:17:50.421419" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:50.421942" elapsed="0.000443"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:17:50.423179" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:17:50.787121" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:16:56 UTC 2026

  System load:  0.04               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:17:40 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:17:50.422945" elapsed="0.364316"/>
</kw>
<msg time="2026-10-16T01:17:50.787337" 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-10-16T01:17:50.422562" elapsed="0.364851"/>
</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-10-16T01:17:50.421071" elapsed="0.366458"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:17:50.788054" level="INFO">Executing command 'sudo mn -c'.</msg>
<msg time="2026-10-16T01:17:51.976371" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:17:51.976770" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:17:51.976987" 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-10-16T01:17:50.787822" elapsed="1.189224"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:51.977484" elapsed="0.000740"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:51.979379" 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-10-16T01:17:51.978780" 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-10-16T01:17:51.979955" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:51.979681" elapsed="0.000376"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:51.979634" 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-10-16T01:17:51.980398" elapsed="0.000060"/>
</return>
<status status="PASS" start="2026-10-16T01:17:51.980216" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:51.980184" elapsed="0.000416"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:17:51.980672" elapsed="0.000057"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:51.982291" elapsed="0.000692"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:17:51.983578" elapsed="0.000355"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:51.984248" elapsed="0.000197"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:17:51.981351" elapsed="0.003225"/>
</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-10-16T01:17:50.418490" elapsed="1.566274"/>
</kw>
<msg time="2026-10-16T01:17:51.984872" 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-10-16T01:17:50.417988" elapsed="1.566987"/>
</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-10-16T01:17:50.417570" elapsed="1.567560"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:51.989192" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:51.988643" elapsed="0.000667"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:51.988605" elapsed="0.000756"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:51.990111" 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-10-16T01:17:51.990314" 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-10-16T01:17:51.989832" elapsed="0.000537"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:51.991473" 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.104" 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-10-16T01:17:51.990828" elapsed="0.000768"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:51.992691" 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-10-16T01:17:51.992013" elapsed="0.000761"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:17:51.995008" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:17:51.995165" 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-10-16T01:17:51.994403" elapsed="0.000813"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:51.995648" elapsed="0.000677"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:17:51.998130" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:17:52.387918" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:16:56 UTC 2026

  System load:  0.04               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:17:50 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:17:51.997581" elapsed="0.390471"/>
</kw>
<msg time="2026-10-16T01:17:52.388133" 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-10-16T01:17:51.996739" elapsed="0.391469"/>
</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-10-16T01:17:51.993199" elapsed="0.395109"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:17:52.388816" 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-10-16T01:17:52.431894" level="INFO">Command exited with return code -1.</msg>
<msg time="2026-10-16T01:17:52.432122" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:17:52.432208" 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-10-16T01:17:52.388585" elapsed="0.043670"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:52.432629" elapsed="0.000485"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:52.434231" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:17:52.433638" elapsed="0.000678"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:17:52.434762" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:52.434476" elapsed="0.000392"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:52.434430" 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-10-16T01:17:52.435205" elapsed="0.000052"/>
</return>
<status status="PASS" start="2026-10-16T01:17:52.435024" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:52.434994" elapsed="0.000377"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:17:52.435439" elapsed="0.000028"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:52.437063" elapsed="0.000688"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:17:52.438151" elapsed="0.000309"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:52.438827" elapsed="0.000197"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:17:52.436130" elapsed="0.002999"/>
</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-10-16T01:17:51.987668" elapsed="0.451610"/>
</kw>
<msg time="2026-10-16T01:17:52.439382" 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-10-16T01:17:51.986459" elapsed="0.453024"/>
</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-10-16T01:17:51.985475" elapsed="0.454186"/>
</kw>
<arg>${tools_system}</arg>
<status status="PASS" start="2026-10-16T01:17:50.417241" elapsed="2.022565"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:17:52.440689" level="INFO">${ovs_opt} = </msg>
<var>${ovs_opt}</var>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:17:52.440147" elapsed="0.000625"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-10-16T01:17:52.442282" level="INFO">${ovs_opt} =   tcp:10.30.170.180:6640</msg>
<var>${ovs_opt}</var>
<arg>${ovs_opt}</arg>
<arg>${SPACE}tcp:${ODL_SYSTEM_${index}_IP}:${ovs_mgr_port}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-10-16T01:17:52.441451" elapsed="0.000893"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:52.443342" level="INFO">  tcp:10.30.170.180:6640</msg>
<arg>${ovs_opt}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:17:52.442831" elapsed="0.000599"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:17:52.441145" elapsed="0.002462"/>
</iter>
<iter>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-10-16T01:17:52.444983" level="INFO">${ovs_opt} =   tcp:10.30.170.180:6640  tcp:10.30.170.14:6640</msg>
<var>${ovs_opt}</var>
<arg>${ovs_opt}</arg>
<arg>${SPACE}tcp:${ODL_SYSTEM_${index}_IP}:${ovs_mgr_port}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-10-16T01:17:52.444168" elapsed="0.000872"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:52.446017" level="INFO">  tcp:10.30.170.180:6640  tcp:10.30.170.14:6640</msg>
<arg>${ovs_opt}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:17:52.445484" elapsed="0.000623"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:17:52.443833" elapsed="0.002339"/>
</iter>
<iter>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-10-16T01:17:52.447405" level="INFO">${ovs_opt} =   tcp:10.30.170.180:6640  tcp:10.30.170.14:6640  tcp:10.30.170.84:6640</msg>
<var>${ovs_opt}</var>
<arg>${ovs_opt}</arg>
<arg>${SPACE}tcp:${ODL_SYSTEM_${index}_IP}:${ovs_mgr_port}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-10-16T01:17:52.446662" elapsed="0.000798"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:52.448404" level="INFO">  tcp:10.30.170.180:6640  tcp:10.30.170.14:6640  tcp:10.30.170.84:6640</msg>
<arg>${ovs_opt}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:17:52.447928" elapsed="0.000566"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:17:52.446345" elapsed="0.002235"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:17:52.440882" elapsed="0.007758"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:52.454583" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:52.454239" elapsed="0.000418"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:52.454214" elapsed="0.000475"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:52.455147" 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-10-16T01:17:52.455273" 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-10-16T01:17:52.454971" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:52.456114" level="INFO">Attempting to execute command "sudo ovs-vsctl set-manager   tcp:10.30.170.180:6640  tcp:10.30.170.14:6640  tcp:10.30.170.84:6640" on remote system "10.30.171.104" 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-10-16T01:17:52.455583" elapsed="0.000594"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:52.456874" 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-10-16T01:17:52.456423" elapsed="0.000485"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:17:52.458048" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:17:52.458145" 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-10-16T01:17:52.457679" elapsed="0.000496"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:52.458381" elapsed="0.000433"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:17:52.459898" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:17:52.889950" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:16:56 UTC 2026

  System load:  0.04               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:17:52 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:17:52.459558" elapsed="0.430545"/>
</kw>
<msg time="2026-10-16T01:17:52.890180" 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-10-16T01:17:52.459041" elapsed="0.431215"/>
</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-10-16T01:17:52.457172" elapsed="0.433191"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:17:52.890902" level="INFO">Executing command 'sudo ovs-vsctl set-manager   tcp:10.30.170.180:6640  tcp:10.30.170.14:6640  tcp:10.30.170.84:6640'.</msg>
<msg time="2026-10-16T01:17:52.913823" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:17:52.913982" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:17:52.914037" 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-10-16T01:17:52.890658" elapsed="0.023408"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:52.914393" elapsed="0.000348"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:52.915432" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:17:52.915064" elapsed="0.000421"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:17:52.915782" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:52.915604" elapsed="0.000244"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:52.915575" elapsed="0.000304"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:17:52.916064" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-10-16T01:17:52.915946" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:52.915927" elapsed="0.000249"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:17:52.916220" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:52.917225" elapsed="0.000417"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:17:52.917917" elapsed="0.000426"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:52.918559" elapsed="0.000128"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:17:52.916643" elapsed="0.002134"/>
</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-10-16T01:17:52.453634" elapsed="0.465242"/>
</kw>
<msg time="2026-10-16T01:17:52.918942" 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-10-16T01:17:52.450068" elapsed="0.468939"/>
</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-10-16T01:17:52.449053" elapsed="0.470056"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:52.927036" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:52.926675" elapsed="0.000435"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:52.926649" elapsed="0.000493"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:52.927597" 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-10-16T01:17:52.927748" 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-10-16T01:17:52.927403" elapsed="0.000380"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:52.928446" level="INFO">Attempting to execute command "sudo ovs-vsctl show" on remote system "10.30.171.104" 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-10-16T01:17:52.928041" elapsed="0.000464"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:17:52.929194" 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-10-16T01:17:52.928783" elapsed="0.000444"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:17:52.930503" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:17:52.930616" 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-10-16T01:17:52.930009" elapsed="0.000637"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:52.930869" elapsed="0.000402"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:17:52.932649" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:17:53.314952" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:16:56 UTC 2026

  System load:  0.04               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:17:52 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:17:52.932035" elapsed="0.383147"/>
</kw>
<msg time="2026-10-16T01:17:53.315258" 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-10-16T01:17:52.931491" elapsed="0.383847"/>
</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-10-16T01:17:52.929487" elapsed="0.385953"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:17:53.315952" level="INFO">Executing command 'sudo ovs-vsctl show'.</msg>
<msg time="2026-10-16T01:17:53.338956" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:17:53.339182" level="INFO">${stdout} = 0f15dba2-cffa-4d91-9a10-c1cf86e94f54
    Manager "tcp:10.30.170.180:6640"
        is_connected: true
    Manager "tcp:10.30.170.84:6640"
        is_connected: true
    Manager "tcp:10.30.170.14:6640"
...</msg>
<msg time="2026-10-16T01:17:53.339242" 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-10-16T01:17:53.315734" elapsed="0.023541"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:53.339597" elapsed="0.000475"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:53.340919" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:17:53.340466" elapsed="0.000507"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:17:53.341247" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:17:53.341080" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:53.341048" elapsed="0.000298"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:17:53.341545" elapsed="0.000043"/>
</return>
<status status="PASS" start="2026-10-16T01:17:53.341413" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:53.341394" elapsed="0.000270"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:17:53.341728" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:17:53.342758" elapsed="0.000415"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:17:53.343425" elapsed="0.000217"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:17:53.343857" elapsed="0.000125"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:17:53.342153" elapsed="0.001897"/>
</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-10-16T01:17:52.926063" elapsed="0.418085"/>
</kw>
<msg time="2026-10-16T01:17:53.344217" 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-10-16T01:17:52.925313" elapsed="0.418973"/>
</kw>
<msg time="2026-10-16T01:17:53.344427" level="INFO">${output} = 0f15dba2-cffa-4d91-9a10-c1cf86e94f54
    Manager "tcp:10.30.170.180:6640"
        is_connected: true
    Manager "tcp:10.30.170.84:6640"
        is_connected: true
    Manager "tcp:10.30.170.14: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-10-16T01:17:52.924683" elapsed="0.419778"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:53.345080" level="INFO">0f15dba2-cffa-4d91-9a10-c1cf86e94f54
    Manager "tcp:10.30.170.180:6640"
        is_connected: true
    Manager "tcp:10.30.170.84:6640"
        is_connected: true
    Manager "tcp:10.30.170.14: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-10-16T01:17:53.344762" elapsed="0.000376"/>
</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 the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-16T01:17:53.345501" elapsed="0.000451"/>
</kw>
<status status="PASS" start="2026-10-16T01:17:53.345219" elapsed="0.000783"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:53.345198" elapsed="0.000836"/>
</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 the `container` contains the `item`.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:53.346379" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:17:53.346102" elapsed="0.000348"/>
</branch>
<status status="PASS" start="2026-10-16T01:17:53.346082" elapsed="0.000400"/>
</if>
<return>
<value>${output}</value>
<status status="PASS" start="2026-10-16T01:17:53.346539" elapsed="0.000034"/>
</return>
<msg time="2026-10-16T01:17:53.346735" level="INFO">${output} = 0f15dba2-cffa-4d91-9a10-c1cf86e94f54
    Manager "tcp:10.30.170.180:6640"
        is_connected: true
    Manager "tcp:10.30.170.84:6640"
        is_connected: true
    Manager "tcp:10.30.170.14: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-10-16T01:17:52.924093" elapsed="0.422678"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-10-16T01:17:53.346907" elapsed="0.000036"/>
</return>
<arg>${tools_system}</arg>
<doc>Uses "vsctl show" to check for string "is_connected"</doc>
<status status="PASS" start="2026-10-16T01:17:52.920056" elapsed="0.426991"/>
</kw>
<msg time="2026-10-16T01:17:53.347145" level="INFO">${output} = 0f15dba2-cffa-4d91-9a10-c1cf86e94f54
    Manager "tcp:10.30.170.180:6640"
        is_connected: true
    Manager "tcp:10.30.170.84:6640"
        is_connected: true
    Manager "tcp:10.30.170.14: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-10-16T01:17:52.919355" elapsed="0.427823"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:17:53.347794" level="INFO">0f15dba2-cffa-4d91-9a10-c1cf86e94f54
    Manager "tcp:10.30.170.180:6640"
        is_connected: true
    Manager "tcp:10.30.170.84:6640"
        is_connected: true
    Manager "tcp:10.30.170.14: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-10-16T01:17:53.347446" elapsed="0.000408"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-10-16T01:17:53.348295" 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-10-16T01:17:53.348068" elapsed="0.000259"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:17:53.349452" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:17:53.349082" elapsed="0.000404"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:17:53.349561" elapsed="0.000035"/>
</return>
<msg time="2026-10-16T01:17:53.349751" 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-10-16T01:17:53.348613" elapsed="0.001172"/>
</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-10-16T01:17:53.353692" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:17:53.353294" elapsed="0.000452"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:17:53.360348" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:17:53.360422" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:17:53.360592" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:17:53.353956" elapsed="0.007232">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:17:53.361576" elapsed="0.000034"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:17:53.361884" elapsed="0.000031"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:17:53.362122" elapsed="0.000026"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:53.362358" elapsed="0.000025"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:17:53.362601" elapsed="0.000026"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:53.362907" elapsed="0.000027"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:17:53.363276" elapsed="0.000026"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:17:53.363514" elapsed="0.000155"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:53.363905" elapsed="0.000027"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:53.364149" elapsed="0.000027"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:17:53.364437" elapsed="0.000026"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:17:53.363095" elapsed="0.001476"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:17:53.362996" elapsed="0.001614"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:17:53.364663" elapsed="0.000020"/>
</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="FAIL" start="2026-10-16T01:17:53.352757" elapsed="0.012066">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:17:55.371481" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:17:55.370784" elapsed="0.000785"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:17:55.378313" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:17:55.378430" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:17:55.378687" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:17:55.371953" elapsed="0.007662">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:17:55.380250" elapsed="0.000053"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:17:55.380755" elapsed="0.000050"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:17:55.381134" elapsed="0.000043"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:55.381511" elapsed="0.000062"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:17:55.381935" elapsed="0.000043"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:55.382389" elapsed="0.000041"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:17:55.383023" elapsed="0.000042"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:17:55.383405" elapsed="0.000041"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:55.383838" elapsed="0.000043"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:55.384223" elapsed="0.000041"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:17:55.384729" elapsed="0.000045"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:17:55.382731" elapsed="0.002121"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:17:55.382548" elapsed="0.002359"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:17:55.384992" elapsed="0.000032"/>
</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="FAIL" start="2026-10-16T01:17:55.369693" elapsed="0.015517">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:17:57.391193" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:17:57.390438" elapsed="0.000818"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:17:57.397955" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:17:57.398172" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:17:57.398392" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:17:57.391630" elapsed="0.007672">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:17:57.399960" elapsed="0.000054"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:17:57.400414" elapsed="0.000048"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:17:57.400846" elapsed="0.000045"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:57.401230" elapsed="0.000042"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:17:57.401617" elapsed="0.000044"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:57.402104" elapsed="0.000042"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:17:57.402737" elapsed="0.000046"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:17:57.403129" elapsed="0.000042"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:57.403513" elapsed="0.000067"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:57.403952" elapsed="0.000043"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:17:57.404414" elapsed="0.000042"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:17:57.402398" elapsed="0.002156"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:17:57.402244" elapsed="0.002367"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:17:57.404697" elapsed="0.000061"/>
</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="FAIL" start="2026-10-16T01:17:57.389361" elapsed="0.015586">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:17:59.411385" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:17:59.410659" elapsed="0.000789"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:17:59.417951" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:17:59.418067" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:17:59.418298" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:17:59.411851" elapsed="0.007363">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:17:59.419913" elapsed="0.000239"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:17:59.420598" elapsed="0.000050"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:17:59.421015" elapsed="0.000043"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:59.421395" elapsed="0.000042"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:17:59.421811" elapsed="0.000043"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:59.422266" elapsed="0.000041"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:17:59.422902" elapsed="0.000043"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:17:59.423289" elapsed="0.000041"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:59.423692" elapsed="0.000078"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:17:59.424118" elapsed="0.000042"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:17:59.424599" elapsed="0.000043"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:17:59.422581" elapsed="0.002167"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:17:59.422404" elapsed="0.002402"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:17:59.424892" elapsed="0.000034"/>
</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="FAIL" start="2026-10-16T01:17:59.409602" elapsed="0.015514">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:18:01.431154" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:18:01.430349" elapsed="0.000868"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:18:01.438201" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:18:01.438319" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:18:01.438560" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:18:01.431605" elapsed="0.007856">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:18:01.440133" elapsed="0.000057"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:18:01.440613" elapsed="0.000049"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:18:01.441024" elapsed="0.000043"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:01.441407" elapsed="0.000040"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:18:01.441815" elapsed="0.000044"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:01.442314" elapsed="0.000046"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:18:01.443014" elapsed="0.000046"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:18:01.443561" elapsed="0.000045"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:01.443984" elapsed="0.000043"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:01.444373" elapsed="0.000042"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:18:01.444885" elapsed="0.000043"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:18:01.442661" elapsed="0.002346"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:18:01.442470" elapsed="0.002593"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:18:01.445150" elapsed="0.000034"/>
</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="FAIL" start="2026-10-16T01:18:01.429154" elapsed="0.016218">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:18:03.452313" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:18:03.451567" elapsed="0.000807"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:18:03.459275" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:18:03.459391" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:18:03.459751" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:18:03.452776" elapsed="0.007995">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:18:03.461359" elapsed="0.000053"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:18:03.461855" elapsed="0.000049"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:18:03.462231" elapsed="0.000042"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:03.462627" elapsed="0.000042"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:18:03.463020" elapsed="0.000041"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:03.463468" elapsed="0.000041"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:18:03.464093" elapsed="0.000041"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:18:03.464471" elapsed="0.000040"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:03.464902" elapsed="0.000043"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:03.465281" elapsed="0.000041"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:18:03.465776" elapsed="0.000044"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:18:03.463807" elapsed="0.002092"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:18:03.463626" elapsed="0.002329"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:18:03.466040" elapsed="0.000033"/>
</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="FAIL" start="2026-10-16T01:18:03.450411" elapsed="0.015944">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:18:05.472618" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:18:05.471888" elapsed="0.000796"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:18:05.479359" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:18:05.479473" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:18:05.479745" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:18:05.473068" elapsed="0.007577">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:18:05.481283" elapsed="0.000056"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:18:05.481793" elapsed="0.000052"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:18:05.482173" elapsed="0.000042"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:05.482568" elapsed="0.000042"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:18:05.482961" elapsed="0.000042"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:05.483411" elapsed="0.000041"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:18:05.484049" elapsed="0.000042"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:18:05.484430" elapsed="0.000041"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:05.484863" elapsed="0.000043"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:05.485247" elapsed="0.000041"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:18:05.485772" elapsed="0.000055"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:18:05.483758" elapsed="0.002150"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:18:05.483571" elapsed="0.002394"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:18:05.486050" elapsed="0.000034"/>
</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="FAIL" start="2026-10-16T01:18:05.470768" elapsed="0.015506">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:18:07.492660" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:18:07.491935" elapsed="0.000817"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:18:07.499443" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:18:07.499580" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:18:07.499966" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:18:07.493111" elapsed="0.007792">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:18:07.501501" elapsed="0.000076"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:18:07.502010" elapsed="0.000048"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:18:07.502390" elapsed="0.000042"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:07.502820" elapsed="0.000043"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:18:07.503188" elapsed="0.000041"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:07.503657" elapsed="0.000068"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:18:07.504293" elapsed="0.000042"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:18:07.504730" elapsed="0.000044"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:07.505119" elapsed="0.000042"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:07.505502" elapsed="0.000061"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:18:07.506012" elapsed="0.000042"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:18:07.504001" elapsed="0.002131"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:18:07.503844" elapsed="0.002345"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:18:07.506274" elapsed="0.000033"/>
</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="FAIL" start="2026-10-16T01:18:07.490867" elapsed="0.015627">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:18:09.512419" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:18:09.511689" elapsed="0.000791"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:18:09.519100" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:18:09.519218" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:18:09.519432" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:18:09.512889" elapsed="0.007457">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:18:09.521007" elapsed="0.000055"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:18:09.521465" elapsed="0.000048"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:18:09.521898" elapsed="0.000044"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:09.522279" elapsed="0.000042"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:18:09.522666" elapsed="0.000070"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:09.523314" elapsed="0.000042"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:18:09.523954" elapsed="0.000043"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:18:09.524341" elapsed="0.000041"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:09.524776" elapsed="0.000044"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:09.525166" elapsed="0.000042"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:18:09.525644" elapsed="0.000043"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:18:09.523634" elapsed="0.002156"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:18:09.523456" elapsed="0.002392"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:18:09.525935" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:18:09.510620" elapsed="0.015539">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:18:11.532535" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:18:11.531822" elapsed="0.000841"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:18:11.539309" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:18:11.539425" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:18:11.539685" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:18:11.533084" elapsed="0.007526">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:18:11.541244" elapsed="0.000056"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:18:11.541754" elapsed="0.000051"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:18:11.542138" elapsed="0.000042"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:11.542518" elapsed="0.000061"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:18:11.542936" elapsed="0.000043"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:11.543389" elapsed="0.000041"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:18:11.544030" elapsed="0.000042"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:18:11.544410" elapsed="0.000041"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:11.544871" elapsed="0.000045"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:11.545262" elapsed="0.000041"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:18:11.545891" elapsed="0.000044"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:18:11.543736" elapsed="0.002277"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:18:11.543527" elapsed="0.002543"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:18:11.546157" elapsed="0.000034"/>
</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="FAIL" start="2026-10-16T01:18:11.530764" elapsed="0.015616">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:18:13.550353" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:18:13.549843" elapsed="0.000553"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:18:13.555639" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:18:13.555737" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:18:13.555890" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:18:13.550634" elapsed="0.005829">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:18:13.556881" elapsed="0.000034"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:18:13.557170" elapsed="0.000030"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:18:13.557406" elapsed="0.000026"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:13.557664" elapsed="0.000027"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:18:13.557918" elapsed="0.000026"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:13.558199" elapsed="0.000027"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:18:13.558586" elapsed="0.000027"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:18:13.558848" elapsed="0.000026"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:13.559095" elapsed="0.000026"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:13.559333" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:18:13.559635" elapsed="0.000027"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:18:13.558390" elapsed="0.001342"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:18:13.558289" elapsed="0.001480"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:18:13.559825" elapsed="0.000022"/>
</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="FAIL" start="2026-10-16T01:18:13.549099" elapsed="0.010867">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:18:15.566359" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:18:15.565594" elapsed="0.000827"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:18:15.573169" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:18:15.573289" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:18:15.573526" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:18:15.566827" elapsed="0.007620">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:18:15.575133" elapsed="0.000058"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:18:15.575617" elapsed="0.000052"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:18:15.576042" elapsed="0.000043"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:15.576423" elapsed="0.000041"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:18:15.576838" elapsed="0.000043"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:15.577293" elapsed="0.000041"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:18:15.577936" elapsed="0.000043"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:18:15.578322" elapsed="0.000042"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:15.578754" elapsed="0.000046"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:15.579143" elapsed="0.000041"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:18:15.579640" elapsed="0.000044"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:18:15.577616" elapsed="0.002172"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:18:15.577433" elapsed="0.002412"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:18:15.579931" elapsed="0.000034"/>
</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="FAIL" start="2026-10-16T01:18:15.564508" elapsed="0.015647">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:18:17.586063" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:18:17.585312" elapsed="0.000815"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:18:17.593281" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:18:17.593399" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:18:17.593643" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:18:17.586481" elapsed="0.008187">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:18:17.595303" elapsed="0.000055"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:18:17.595815" elapsed="0.000050"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:18:17.596198" elapsed="0.000043"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:17.596619" elapsed="0.000042"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:18:17.597017" elapsed="0.000042"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:17.597470" elapsed="0.000041"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:18:17.598118" elapsed="0.000042"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:18:17.598504" elapsed="0.000041"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:17.598940" elapsed="0.000044"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:17.599330" elapsed="0.000042"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:18:17.599842" elapsed="0.000043"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:18:17.597821" elapsed="0.002143"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:18:17.597638" elapsed="0.002382"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:18:17.600106" elapsed="0.000033"/>
</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="FAIL" start="2026-10-16T01:18:17.584250" elapsed="0.016077">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:18:19.606824" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:18:19.606070" elapsed="0.000821"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:18:19.613384" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:18:19.613518" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:18:19.613844" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:18:19.607245" elapsed="0.007531">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:18:19.615379" elapsed="0.000055"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:18:19.615888" elapsed="0.000050"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:18:19.616268" elapsed="0.000043"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:19.616670" elapsed="0.000071"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:18:19.617077" elapsed="0.000042"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:19.617654" elapsed="0.000070"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:18:19.618284" elapsed="0.000042"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:18:19.618697" elapsed="0.000070"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:19.619118" elapsed="0.000043"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:19.619504" elapsed="0.000042"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:18:19.620017" elapsed="0.000044"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:18:19.617991" elapsed="0.002147"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:18:19.617834" elapsed="0.002360"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:18:19.620280" elapsed="0.000033"/>
</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="FAIL" start="2026-10-16T01:18:19.605004" elapsed="0.015497">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:18:21.626328" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:18:21.625615" elapsed="0.000772"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:18:21.633164" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:18:21.633302" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:18:21.633558" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:18:21.626785" elapsed="0.007702">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:18:21.635158" elapsed="0.000057"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:18:21.635632" elapsed="0.000049"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:18:21.636042" elapsed="0.000042"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:21.636417" elapsed="0.000040"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:18:21.636820" elapsed="0.000042"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:21.637269" elapsed="0.000039"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:18:21.637892" elapsed="0.000043"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:18:21.638272" elapsed="0.000041"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:21.638671" elapsed="0.000064"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:21.639076" elapsed="0.000041"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:18:21.639538" elapsed="0.000039"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:18:21.637558" elapsed="0.002240"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:18:21.637404" elapsed="0.002451"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:18:21.639941" elapsed="0.000033"/>
</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="FAIL" start="2026-10-16T01:18:21.624541" elapsed="0.015626">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:18:23.646636" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:18:23.645900" elapsed="0.000828"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:18:23.653205" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:18:23.653324" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:18:23.653586" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:18:23.647090" elapsed="0.007439">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:18:23.655199" elapsed="0.000055"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:18:23.655804" elapsed="0.000051"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:18:23.656191" elapsed="0.000043"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:23.656568" elapsed="0.000064"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:18:23.656986" elapsed="0.000041"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:23.657440" elapsed="0.000040"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:18:23.658072" elapsed="0.000042"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:18:23.658455" elapsed="0.000041"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:23.658886" elapsed="0.000043"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:23.659268" elapsed="0.000042"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:18:23.659763" elapsed="0.000045"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:18:23.657780" elapsed="0.002105"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:18:23.657577" elapsed="0.002364"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:18:23.660025" elapsed="0.000033"/>
</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="FAIL" start="2026-10-16T01:18:23.644828" elapsed="0.015419">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<msg time="2026-10-16T01:18:23.660433" level="FAIL">Keyword 'OVSDB.Get OVSDB UUID' failed after retrying for 30 seconds. The last error was: Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:17:53.350028" elapsed="30.310625">Keyword 'OVSDB.Get OVSDB UUID' failed after retrying for 30 seconds. The last error was: Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<return>
<value>${ovsdb_uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:18:23.660914" elapsed="0.000038"/>
</return>
<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="FAIL" start="2026-10-16T01:17:50.415204" elapsed="33.245920">Keyword 'OVSDB.Get OVSDB UUID' failed after retrying for 30 seconds. The last error was: Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${ovsdb_uuid}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:23.661545" elapsed="0.000066"/>
</kw>
<doc>Connect OVS to all cluster instances.</doc>
<status status="FAIL" start="2026-10-16T01:17:50.030822" elapsed="33.631087">Keyword 'OVSDB.Get OVSDB UUID' failed after retrying for 30 seconds. The last error was: Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</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-10-16T01:18:23.665262" elapsed="0.000532"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:18:23.664675" elapsed="0.001234"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:23.668081" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:23.667826" elapsed="0.000354"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:23.667763" elapsed="0.000467"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:23.672976" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:23.672779" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:23.672684" elapsed="0.000440"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:18:23.675296" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:18:23.674423" elapsed="0.000941"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:23.676499" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:23.675835" elapsed="0.000720"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:18:23.676679" elapsed="0.000096"/>
</return>
<msg time="2026-10-16T01:18:23.677042" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:18:23.673579" elapsed="0.003662"/>
</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-10-16T01:18:23.682766" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:23.682520" elapsed="0.000347"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:23.682481" elapsed="0.000434"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:23.685457" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:23.685236" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:23.685199" elapsed="0.000425"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:23.686622" level="INFO">${karaf_connection_index} = 222</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:18:23.686031" elapsed="0.000653"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:23.687555" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:23.687143" elapsed="0.000492"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:23.724023" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:23.689022" elapsed="0.035252"/>
</kw>
<msg time="2026-10-16T01:18:23.724494" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:23.724552" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:23.688013" elapsed="0.036607"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:23.824135" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:23.725467" elapsed="0.098927"/>
</kw>
<msg time="2026-10-16T01:18:23.824607" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:23.824652" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:23.724871" elapsed="0.099898"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:23.825145" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:23.824872" elapsed="0.000349"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:23.824842" elapsed="0.000406"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:23.825897" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:23.825432" elapsed="0.000558"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:23.826252" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:23.826052" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:23.826035" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:23.826380" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:23.829018" elapsed="0.000489"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:18:23.830799" elapsed="0.001637"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:23.833837" 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-10-16T01:18:23.827257" elapsed="0.006970"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:23.826732" elapsed="0.007615"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:23.684619" elapsed="0.149806"/>
</kw>
<msg time="2026-10-16T01:18:23.834509" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:23.834551" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:23.683236" elapsed="0.151350"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:23.834820" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-10-16T01:18:23.834671" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:23.834654" 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 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-10-16T01:18:23.835226" 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-10-16T01:18:23.835536" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:23.835616" 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-10-16T01:18:23.681822" elapsed="0.153896"/>
</kw>
<msg time="2026-10-16T01:18:23.835804" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:23.835845" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:23.678038" elapsed="0.157843"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:23.836170" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:23.835949" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:23.835933" elapsed="0.000312"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:18:23.677694" elapsed="0.158579"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:23.838762" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:23.838659" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:23.838642" elapsed="0.000183"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:23.839964" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:23.839842" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:23.839825" elapsed="0.000205"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:23.840406" 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-10-16T01:18:23.840175" elapsed="0.000256"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:23.840803" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:23.840607" elapsed="0.000221"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:23.880688" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:23.841399" elapsed="0.039500"/>
</kw>
<msg time="2026-10-16T01:18:23.881059" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:23.881100" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:23.840980" elapsed="0.040156"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:23.977838" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:23.881753" elapsed="0.096391"/>
</kw>
<msg time="2026-10-16T01:18:23.978362" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:23.978407" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:23.881298" elapsed="0.097148"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:23.978903" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:23.978553" elapsed="0.000428"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:23.978520" elapsed="0.000489"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:23.979623" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:23.979194" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:23.979998" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:23.979798" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:23.979781" elapsed="0.000313"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:23.980128" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:23.982974" 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-10-16T01:18:23.984763" elapsed="0.000484"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:23.986643" elapsed="0.000543"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:18:23.981072" elapsed="0.006183"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:23.980474" elapsed="0.006902"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:23.839547" elapsed="0.147907"/>
</kw>
<msg time="2026-10-16T01:18:23.987537" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:23.987578" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:23.838971" elapsed="0.148657"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:23.987860" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:18:23.987770" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:23.987682" 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-10-16T01:18:23.988346" 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-10-16T01:18:23.988740" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:23.988808" 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-10-16T01:18:23.838346" elapsed="0.150549"/>
</kw>
<msg time="2026-10-16T01:18:23.988980" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:23.989021" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:23.836526" elapsed="0.152531"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:23.989346" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:23.989126" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:23.989110" elapsed="0.000315"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:18:23.836388" elapsed="0.153059"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:23.991920" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:23.991834" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:23.991817" elapsed="0.000167"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:23.993086" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:23.993001" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:23.992985" elapsed="0.000165"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:23.993526" 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-10-16T01:18:23.993292" elapsed="0.000259"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:23.993982" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:23.993790" elapsed="0.000217"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:24.039694" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:23.994584" elapsed="0.045300"/>
</kw>
<msg time="2026-10-16T01:18:24.040041" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:24.040082" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:23.994161" elapsed="0.045955"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:24.143245" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:24.040739" elapsed="0.102752"/>
</kw>
<msg time="2026-10-16T01:18:24.143692" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:24.143756" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:24.040277" elapsed="0.103516"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:24.144136" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:24.143886" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:24.143858" elapsed="0.000379"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:24.144831" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:24.144418" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:24.145184" elapsed="0.000074"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:24.144988" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:24.144972" elapsed="0.000364"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:24.145370" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:24.147991" 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-10-16T01:18:24.149763" elapsed="0.000479"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:24.151635" elapsed="0.000843"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:18:24.146236" elapsed="0.006320"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:24.145693" elapsed="0.007084"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:23.992744" elapsed="0.160120"/>
</kw>
<msg time="2026-10-16T01:18:24.152951" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:24.152992" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:23.992128" elapsed="0.160900"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:24.153195" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-10-16T01:18:24.153102" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:24.153083" elapsed="0.000198"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:18:24.153829" 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-10-16T01:18:24.154133" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:24.154197" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:18:23.991511" elapsed="0.162771"/>
</kw>
<msg time="2026-10-16T01:18:24.154366" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:24.154406" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:23.989811" elapsed="0.164630"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:24.154844" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:24.154513" elapsed="0.000383"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:24.154497" elapsed="0.000422"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:18:23.989566" elapsed="0.165375"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:18:23.677352" elapsed="0.477619"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:18:23.672030" elapsed="0.482994"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:18:23.667170" elapsed="0.487907"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:23.666238" elapsed="0.488881"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:18:23.663869" elapsed="0.491299"/>
</kw>
<kw name="Get Ovsdb Entity Owner Status For One Device" owner="ClusterOvsdb">
<msg time="2026-10-16T01:18:24.158941" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:18:24.157736" elapsed="0.001241">Variable '${ovsdb_uuid}' not found.</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-10-16T01:18:24.159152" elapsed="0.000019"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${original_owner}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:24.159351" elapsed="0.000018"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${original_candidate}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:24.159537" elapsed="0.000018"/>
</kw>
<doc>Check Entity Owner Status and identify owner and candidate.</doc>
<status status="FAIL" start="2026-10-16T01:18:23.662471" elapsed="0.497286">Variable '${ovsdb_uuid}' not found.</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-10-16T01:18:24.161228" elapsed="0.000215"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:18:24.160981" 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-10-16T01:18:24.162412" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:24.162326" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:24.162309" elapsed="0.000167"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:24.164376" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:24.164292" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:24.164275" elapsed="0.000165"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:18:24.165355" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:18:24.165028" elapsed="0.000353"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:24.165919" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:24.165575" elapsed="0.000370"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:18:24.165989" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:18:24.166121" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:18:24.164659" 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-10-16T01:18:24.168826" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:24.168732" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:24.168713" elapsed="0.000186"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:24.170050" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:24.169962" elapsed="0.000132"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:24.169945" elapsed="0.000170"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:24.170500" level="INFO">${karaf_connection_index} = 222</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:18:24.170262" elapsed="0.000264"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:24.170926" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:24.170728" elapsed="0.000224"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:24.204447" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:24.171538" elapsed="0.033096"/>
</kw>
<msg time="2026-10-16T01:18:24.204810" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:24.204852" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:24.171109" elapsed="0.033778"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:24.289939" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:24.205467" elapsed="0.084690"/>
</kw>
<msg time="2026-10-16T01:18:24.290339" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:24.290381" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:24.205049" elapsed="0.085369"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:24.290794" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:24.290507" elapsed="0.000360"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:24.290482" elapsed="0.000410"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:24.291455" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:24.291072" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:24.291893" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:24.291679" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:24.291661" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:24.292023" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:24.294632" 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-10-16T01:18:24.296374" elapsed="0.000515"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:24.298459" 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-10-16T01:18:24.292886" elapsed="0.006000"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:24.292337" elapsed="0.006670"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:24.169654" elapsed="0.129432"/>
</kw>
<msg time="2026-10-16T01:18:24.299174" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:24.299216" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:24.169048" elapsed="0.130205"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:24.299415" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-10-16T01:18:24.299327" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:24.299309" elapsed="0.000187"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:18:24.299888" 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-10-16T01:18:24.300193" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:24.300259" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:18:24.168401" elapsed="0.131945"/>
</kw>
<msg time="2026-10-16T01:18:24.300431" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:24.300473" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:24.166484" elapsed="0.134025"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:24.300856" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:24.300576" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:24.300561" elapsed="0.000369"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:18:24.166341" elapsed="0.134611"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:24.303569" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:24.303483" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:24.303465" elapsed="0.000186"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:24.304815" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:24.304727" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:24.304691" elapsed="0.000188"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:24.305256" 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-10-16T01:18:24.305024" elapsed="0.000258"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:24.305642" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:24.305443" elapsed="0.000224"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:24.348046" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:24.306256" elapsed="0.041998"/>
</kw>
<msg time="2026-10-16T01:18:24.348540" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:24.348584" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:24.305837" elapsed="0.042823"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:24.429446" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:24.349367" elapsed="0.080308"/>
</kw>
<msg time="2026-10-16T01:18:24.429892" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:24.429936" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:24.348885" elapsed="0.081087"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:24.430326" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:24.430071" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:24.430042" elapsed="0.000387"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:24.431038" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:24.430631" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:24.431386" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:24.431189" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:24.431172" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:24.431514" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:24.434236" 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-10-16T01:18:24.436055" elapsed="0.000494"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:24.438034" 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-10-16T01:18:24.432436" elapsed="0.005992"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:24.431886" elapsed="0.006662"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:24.304399" elapsed="0.134245"/>
</kw>
<msg time="2026-10-16T01:18:24.438756" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:24.438801" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:24.303818" elapsed="0.135020"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:24.438999" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:18:24.438910" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:24.438893" elapsed="0.000184"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:18:24.439411" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:24.439851" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:24.439922" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:18:24.303181" elapsed="0.136831"/>
</kw>
<msg time="2026-10-16T01:18:24.440101" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:24.440143" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:24.301206" elapsed="0.138974"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:24.440530" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:24.440299" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:24.440282" elapsed="0.000343"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:18:24.301069" elapsed="0.139580"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:24.443318" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:24.443228" elapsed="0.000134"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:24.443205" elapsed="0.000178"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:24.444499" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:24.444414" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:24.444398" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:24.444990" 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-10-16T01:18:24.444751" elapsed="0.000265"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:24.445358" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:24.445178" elapsed="0.000206"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:24.481192" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:24.446023" elapsed="0.035345"/>
</kw>
<msg time="2026-10-16T01:18:24.481526" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:24.481568" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:24.445537" elapsed="0.036084"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:24.576881" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:24.482231" elapsed="0.094938"/>
</kw>
<msg time="2026-10-16T01:18:24.577384" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:24.577430" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:24.481807" elapsed="0.095662"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:24.577913" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:24.577571" elapsed="0.000424"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:24.577542" elapsed="0.000480"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:24.578641" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:24.578211" elapsed="0.000537"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:24.579027" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:24.578813" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:24.578795" elapsed="0.000331"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:24.579163" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:24.581819" elapsed="0.000489"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:18:24.583581" elapsed="0.000514"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:24.585313" 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-10-16T01:18:24.580057" elapsed="0.005910"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:24.579484" elapsed="0.006606"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:24.444159" elapsed="0.142093"/>
</kw>
<msg time="2026-10-16T01:18:24.586338" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:24.586379" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:24.443537" elapsed="0.142879"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:24.586572" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-10-16T01:18:24.586486" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:24.586469" elapsed="0.000195"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:18:24.587005" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:24.587311" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:24.587376" 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-10-16T01:18:24.442909" elapsed="0.144555"/>
</kw>
<msg time="2026-10-16T01:18:24.587552" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:24.587603" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:24.440947" elapsed="0.146694"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:24.588008" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:24.587788" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:24.587769" elapsed="0.000312"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:18:24.440803" elapsed="0.147300"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:18:24.166196" elapsed="0.421938"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:18:24.163998" elapsed="0.424190"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:18:24.162071" elapsed="0.426175"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:24.161657" elapsed="0.426633"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:18:24.160618" elapsed="0.427722"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:24.591928" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:24.591681" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:24.591663" elapsed="0.000340"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:24.592319" 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-10-16T01:18:24.592410" 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-10-16T01:18:24.592192" elapsed="0.000242"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:24.592933" level="INFO">Attempting to execute command "sudo ovs-vsctl add-br br-s1" on remote system "10.30.171.104" 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-10-16T01:18:24.592630" elapsed="0.000345"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:24.593447" level="INFO">${conn_id} = 251</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-10-16T01:18:24.593151" elapsed="0.000320"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:18:24.594293" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:18:24.594362" 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-10-16T01:18:24.594037" elapsed="0.000346"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:24.594531" elapsed="0.000355"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:18:24.595743" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:18:25.170558" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:18:24 UTC 2026

  System load:  0.01               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:17:53 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:18:24.595456" elapsed="0.575290"/>
</kw>
<msg time="2026-10-16T01:18:25.170831" 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-10-16T01:18:24.595087" elapsed="0.575829"/>
</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-10-16T01:18:24.593672" elapsed="0.577351"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:18:25.171533" level="INFO">Executing command 'sudo ovs-vsctl add-br br-s1'.</msg>
<msg time="2026-10-16T01:18:25.255051" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:18:25.255300" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:18:25.255391" 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-10-16T01:18:25.171305" elapsed="0.084134"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:25.255891" elapsed="0.000428"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:25.257455" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:18:25.256873" elapsed="0.000669"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:18:25.257989" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:25.257750" elapsed="0.000342"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:25.257678" elapsed="0.000463"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:18:25.258429" elapsed="0.000056"/>
</return>
<status status="PASS" start="2026-10-16T01:18:25.258249" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:25.258218" elapsed="0.000412"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:18:25.258733" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:25.260322" elapsed="0.000681"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:18:25.261406" elapsed="0.000366"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:25.262089" elapsed="0.000198"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:18:25.259388" elapsed="0.003003"/>
</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-10-16T01:18:24.591256" elapsed="0.671285"/>
</kw>
<msg time="2026-10-16T01:18:25.262667" 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-10-16T01:18:24.590750" elapsed="0.672047"/>
</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-10-16T01:18:24.590312" elapsed="0.672642"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:18:25.264095" 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-10-16T01:18:25.263377" elapsed="0.000775"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:18:25.265267" 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-10-16T01:18:25.264577" elapsed="0.000746"/>
</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-10-16T01:18:25.275291" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:18:25.274479" elapsed="0.000870"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:25.276495" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:25.275847" elapsed="0.000704"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:18:25.276673" elapsed="0.000091"/>
</return>
<msg time="2026-10-16T01:18:25.277005" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:18:25.273662" elapsed="0.003394"/>
</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-10-16T01:18:25.283024" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:18:25.282353" elapsed="0.000727"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:18:25.283175" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:18:25.283448" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:18:25.281612" elapsed="0.001888"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:25.286197" 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-10-16T01:18:25.285638" elapsed="0.000655"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:25.287347" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:18:25.286841" elapsed="0.000601"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:18:25.294818" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:18:25.294935" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:18:25.295148" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:18:25.288169" elapsed="0.007798">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:18:25.287623" elapsed="0.008507">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:18:25.296534" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:25.296199" elapsed="0.000487"/>
</branch>
<status status="FAIL" start="2026-10-16T01:18:25.287556" elapsed="0.009209">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:18:25.297504" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:25.297837" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:25.297760" elapsed="0.000163"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:18:25.297685" elapsed="0.000284"/>
</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-10-16T01:18:25.298273" elapsed="0.000043"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:18:25.298410" elapsed="0.000030"/>
</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-10-16T01:18:25.284202" elapsed="0.014441">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:25.298790" 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-10-16T01:18:25.280658" elapsed="0.018322">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:18:25.299434" elapsed="0.000049"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:18:25.277416" elapsed="0.022269">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:18:25.277165" elapsed="0.022673">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:18:25.272503" elapsed="0.027519">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:18:26.309620" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:18:26.308774" elapsed="0.000912"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:26.310738" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:26.310064" elapsed="0.000731"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:18:26.310896" elapsed="0.000073"/>
</return>
<msg time="2026-10-16T01:18:26.311201" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:18:26.307919" elapsed="0.003334"/>
</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-10-16T01:18:26.317121" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:18:26.316452" elapsed="0.000726"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:18:26.317272" elapsed="0.000057"/>
</return>
<msg time="2026-10-16T01:18:26.317545" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:18:26.315739" elapsed="0.001858"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:26.320338" 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-10-16T01:18:26.319828" elapsed="0.000607"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:26.321385" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:18:26.320894" elapsed="0.000582"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:18:26.328448" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:18:26.328560" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:18:26.329200" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:18:26.322174" elapsed="0.007840">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:18:26.321637" elapsed="0.008541">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:18:26.330585" elapsed="0.000069"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:26.330248" elapsed="0.000523"/>
</branch>
<status status="FAIL" start="2026-10-16T01:18:26.321577" elapsed="0.009245">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:18:26.331554" elapsed="0.000072"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:26.331873" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:26.331797" elapsed="0.000163"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:18:26.331760" elapsed="0.000246"/>
</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-10-16T01:18:26.332402" elapsed="0.000045"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:18:26.332548" 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-10-16T01:18:26.318373" elapsed="0.014442">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:26.332938" 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-10-16T01:18:26.314776" elapsed="0.018351">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:18:26.333586" elapsed="0.000071"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:18:26.311632" elapsed="0.022160">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:18:26.311363" elapsed="0.022545">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:18:26.306659" elapsed="0.027433">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:18:27.339184" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:18:27.338751" elapsed="0.000465"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:27.339715" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:27.339383" elapsed="0.000361"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:18:27.339793" elapsed="0.000038"/>
</return>
<msg time="2026-10-16T01:18:27.339942" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:18:27.338331" elapsed="0.001636"/>
</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-10-16T01:18:27.342583" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:18:27.342307" elapsed="0.000317"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:18:27.342671" elapsed="0.000041"/>
</return>
<msg time="2026-10-16T01:18:27.342816" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:18:27.341985" elapsed="0.000856"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:27.344062" 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-10-16T01:18:27.343814" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:27.344572" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:18:27.344324" 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-10-16T01:18:27.348872" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:18:27.348926" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:18:27.349028" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:18:27.344960" elapsed="0.004439">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:18:27.344716" elapsed="0.004817">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:18:27.349918" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:27.349567" elapsed="0.000424"/>
</branch>
<status status="FAIL" start="2026-10-16T01:18:27.344682" elapsed="0.005333">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:18:27.350354" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:27.350478" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:27.350444" elapsed="0.000073"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:18:27.350427" elapsed="0.000111"/>
</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-10-16T01:18:27.350693" elapsed="0.000036"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:18:27.350774" 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-10-16T01:18:27.343154" elapsed="0.007716">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:27.350924" 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-10-16T01:18:27.341540" elapsed="0.009470">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:18:27.351219" elapsed="0.000022"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:18:27.340144" elapsed="0.011145">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:18:27.340023" elapsed="0.011318">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:18:27.337563" elapsed="0.013861">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:18:28.361242" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:18:28.360368" elapsed="0.000935"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:28.362325" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:28.361679" elapsed="0.000701"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:18:28.362475" elapsed="0.000068"/>
</return>
<msg time="2026-10-16T01:18:28.362826" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:18:28.359477" elapsed="0.003401"/>
</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-10-16T01:18:28.368690" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:18:28.368064" elapsed="0.000711"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:18:28.368871" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:18:28.369140" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:18:28.367305" elapsed="0.001884"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:28.371971" 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-10-16T01:18:28.371294" elapsed="0.000771"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:28.373024" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:18:28.372478" elapsed="0.000636"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:18:28.379503" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:18:28.379781" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:18:28.380007" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:18:28.373843" elapsed="0.006970">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:18:28.373252" elapsed="0.007727">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:18:28.381389" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:28.381050" elapsed="0.000469"/>
</branch>
<status status="FAIL" start="2026-10-16T01:18:28.373214" elapsed="0.008356">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:18:28.382766" elapsed="0.000055"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:28.383042" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:28.382966" elapsed="0.000161"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:18:28.382931" elapsed="0.000243"/>
</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-10-16T01:18:28.383482" elapsed="0.000044"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:18:28.383644" 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-10-16T01:18:28.369901" elapsed="0.013985">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:28.384008" 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-10-16T01:18:28.366358" elapsed="0.017838">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:18:28.384684" elapsed="0.000086"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:18:28.363237" elapsed="0.021645">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:18:28.362989" elapsed="0.022008">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:18:28.358044" elapsed="0.027136">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:18:29.395011" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:18:29.394099" elapsed="0.000977"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:29.396106" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:29.395426" elapsed="0.000734"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:18:29.396257" elapsed="0.000071"/>
</return>
<msg time="2026-10-16T01:18:29.396559" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:18:29.393230" elapsed="0.003404"/>
</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-10-16T01:18:29.402598" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:18:29.401988" elapsed="0.000689"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:18:29.402914" elapsed="0.000063"/>
</return>
<msg time="2026-10-16T01:18:29.403198" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:18:29.401224" elapsed="0.002026"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:29.406050" 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-10-16T01:18:29.405485" elapsed="0.000660"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:29.407109" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:18:29.406563" elapsed="0.000636"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:18:29.414156" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:18:29.414270" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:18:29.414478" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:18:29.407988" elapsed="0.007282">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:18:29.407346" elapsed="0.008088">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:18:29.415902" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:29.415505" elapsed="0.000537"/>
</branch>
<status status="FAIL" start="2026-10-16T01:18:29.407308" elapsed="0.008784">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:18:29.416880" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:29.420070" elapsed="0.000039"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:29.417074" elapsed="0.003104"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:18:29.417039" elapsed="0.003190"/>
</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-10-16T01:18:29.420575" elapsed="0.000083"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:18:29.420802" 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-10-16T01:18:29.404063" elapsed="0.016962">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:29.421147" 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-10-16T01:18:29.400212" elapsed="0.021129">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:18:29.421867" elapsed="0.000051"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:18:29.397027" elapsed="0.025001">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:18:29.396776" elapsed="0.025374">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:18:29.391889" elapsed="0.030446">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:18:30.432522" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:18:30.431578" elapsed="0.001181"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:30.433885" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:30.433155" elapsed="0.000805"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:18:30.434068" elapsed="0.000078"/>
</return>
<msg time="2026-10-16T01:18:30.434391" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:18:30.430667" elapsed="0.003779"/>
</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-10-16T01:18:30.440444" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:18:30.439829" elapsed="0.000673"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:18:30.440598" elapsed="0.000088"/>
</return>
<msg time="2026-10-16T01:18:30.440936" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:18:30.439055" elapsed="0.001932"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:30.443654" 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-10-16T01:18:30.443123" elapsed="0.000657"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:30.444747" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:18:30.444198" elapsed="0.000643"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:18:30.451267" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:18:30.451381" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:18:30.451593" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:18:30.445502" elapsed="0.006892">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:18:30.444986" elapsed="0.007574">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:18:30.453029" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:30.452655" elapsed="0.000507"/>
</branch>
<status status="FAIL" start="2026-10-16T01:18:30.444947" elapsed="0.008265">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:18:30.454008" elapsed="0.000054"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:30.454276" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:30.454202" elapsed="0.000158"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:18:30.454168" 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-10-16T01:18:30.454766" elapsed="0.000047"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:18:30.454911" elapsed="0.000030"/>
</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-10-16T01:18:30.441683" elapsed="0.013439">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:30.455244" 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-10-16T01:18:30.438021" elapsed="0.017413">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:18:30.456028" elapsed="0.000051"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:18:30.434873" elapsed="0.021314">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:18:30.434561" elapsed="0.021743">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:18:30.429323" elapsed="0.027168">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<msg time="2026-10-16T01:18:30.456753" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<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="FAIL" start="2026-10-16T01:18:25.265807" elapsed="5.191152">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${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="NOT RUN" start="2026-10-16T01:18:30.457456" elapsed="0.000046"/>
</kw>
<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-10-16T01:18:24.589945" elapsed="5.867808">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<doc>Create bridge with OVS command and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-10-16T01:18:24.160077" elapsed="6.297959">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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-10-16T01:18:30.461968" elapsed="0.000500"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:18:30.461293" elapsed="0.001296"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:30.465003" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:30.464760" elapsed="0.000346"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:30.464688" elapsed="0.000468"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:30.469663" elapsed="0.000065"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:30.469440" elapsed="0.000357"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:30.469402" elapsed="0.000442"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:18:30.471943" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:18:30.471149" elapsed="0.000852"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:30.473014" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:30.472336" elapsed="0.000734"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:18:30.473164" elapsed="0.000060"/>
</return>
<msg time="2026-10-16T01:18:30.473448" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:18:30.470294" elapsed="0.003205"/>
</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-10-16T01:18:30.479366" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:30.479017" elapsed="0.000454"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:30.478931" elapsed="0.000586"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:30.482108" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:30.481918" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:30.481881" elapsed="0.000366"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:30.483140" level="INFO">${karaf_connection_index} = 222</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:18:30.482567" elapsed="0.000629"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:30.484116" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:30.483669" elapsed="0.000501"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:30.520604" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:30.485987" elapsed="0.034917"/>
</kw>
<msg time="2026-10-16T01:18:30.521126" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:30.521185" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:30.484516" elapsed="0.036719"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:30.594012" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:30.522182" elapsed="0.072174"/>
</kw>
<msg time="2026-10-16T01:18:30.594603" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:30.594665" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:30.521467" elapsed="0.073259"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:30.595172" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:30.594846" elapsed="0.000403"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:30.594810" elapsed="0.000468"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:30.595961" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:30.595464" elapsed="0.000585"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:30.596309" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:30.596110" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:30.596093" elapsed="0.000310"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:30.596439" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:30.599168" 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-10-16T01:18:30.600981" elapsed="0.000496"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:30.602887" 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-10-16T01:18:30.597377" elapsed="0.005898"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:30.596828" elapsed="0.006564"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:30.481276" elapsed="0.122194"/>
</kw>
<msg time="2026-10-16T01:18:30.603555" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:30.603595" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:30.479906" elapsed="0.123740"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:30.603875" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:18:30.603788" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:30.603769" elapsed="0.000184"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:18:30.604292" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:30.604601" elapsed="0.000037"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:30.604756" 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-10-16T01:18:30.478261" elapsed="0.126586"/>
</kw>
<msg time="2026-10-16T01:18:30.604932" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:30.604971" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:30.474388" elapsed="0.130619"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:30.605296" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:30.605076" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:30.605060" elapsed="0.000307"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:18:30.474032" elapsed="0.131358"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:30.607960" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:30.607874" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:30.607856" elapsed="0.000167"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:30.609132" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:30.609047" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:30.609031" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:30.609570" 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-10-16T01:18:30.609337" elapsed="0.000258"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:30.609973" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:30.609791" elapsed="0.000206"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:30.646673" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:30.610564" elapsed="0.036304"/>
</kw>
<msg time="2026-10-16T01:18:30.647025" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:30.647067" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:30.610149" elapsed="0.036953"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:30.708791" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:30.647755" elapsed="0.061240"/>
</kw>
<msg time="2026-10-16T01:18:30.709164" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:30.709205" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:30.647266" elapsed="0.061975"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:30.709561" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:30.709329" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:30.709302" elapsed="0.000374"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:30.710477" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:30.709882" elapsed="0.000681"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:30.710868" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:30.710642" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:30.710607" elapsed="0.000355"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:30.710996" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:30.713529" 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-10-16T01:18:30.715326" elapsed="0.000506"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:30.717194" elapsed="0.000309"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:18:30.711865" elapsed="0.005705"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:30.711306" elapsed="0.006410"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:30.608792" elapsed="0.109002"/>
</kw>
<msg time="2026-10-16T01:18:30.717877" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:30.717917" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:30.608169" elapsed="0.109783"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:30.718104" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:18:30.718020" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:30.718003" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:18:30.718505" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:30.718910" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:30.718976" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:18:30.607547" elapsed="0.111513"/>
</kw>
<msg time="2026-10-16T01:18:30.719145" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:30.719185" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:30.605670" elapsed="0.113550"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:30.719499" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:30.719286" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:30.719270" elapsed="0.000300"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:18:30.605517" elapsed="0.114074"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:30.722097" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:30.722012" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:30.721995" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:30.723255" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:30.723172" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:30.723155" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:30.723720" 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-10-16T01:18:30.723456" elapsed="0.000290"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:30.724078" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:30.723903" elapsed="0.000199"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:30.759587" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:30.724675" elapsed="0.035201"/>
</kw>
<msg time="2026-10-16T01:18:30.760087" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:30.760128" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:30.724251" elapsed="0.035913"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:30.831306" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:30.760966" elapsed="0.070604"/>
</kw>
<msg time="2026-10-16T01:18:30.831768" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:30.831810" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:30.760393" elapsed="0.071453"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:30.832168" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:30.831936" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:30.831910" elapsed="0.000359"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:30.832839" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:30.832452" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:30.833176" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:30.832981" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:30.832965" elapsed="0.000304"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:30.833303" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:30.836221" 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-10-16T01:18:30.837995" elapsed="0.000483"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:30.839718" 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-10-16T01:18:30.834205" elapsed="0.005906"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:30.833656" elapsed="0.006575"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:30.722917" elapsed="0.117390"/>
</kw>
<msg time="2026-10-16T01:18:30.840390" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:30.840431" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:30.722305" elapsed="0.118161"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:30.840632" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-10-16T01:18:30.840534" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:30.840518" 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-10-16T01:18:30.841065" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:30.841370" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:30.841434" 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-10-16T01:18:30.721713" elapsed="0.119807"/>
</kw>
<msg time="2026-10-16T01:18:30.841605" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:30.841667" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:30.719889" elapsed="0.121853"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:30.842028" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:30.841812" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:30.841796" elapsed="0.000303"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:18:30.719750" elapsed="0.122370"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:18:30.473604" elapsed="0.368549"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:18:30.468561" elapsed="0.373650"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:18:30.464104" elapsed="0.378198"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:30.463030" elapsed="0.379318"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:18:30.460312" elapsed="0.382087"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:30.846177" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:30.845943" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:30.845926" elapsed="0.000325"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:30.846572" 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-10-16T01:18:30.846686" 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-10-16T01:18:30.846440" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:30.847202" 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.104" 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-10-16T01:18:30.846915" elapsed="0.000330"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:30.847755" level="INFO">${conn_id} = 256</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-10-16T01:18:30.847419" elapsed="0.000360"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:18:30.848592" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:18:30.848677" 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-10-16T01:18:30.848322" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:30.848865" elapsed="0.000287"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:18:30.849940" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:18:31.260555" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:18:24 UTC 2026

  System load:  0.01               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:18:25 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:18:30.849691" elapsed="0.411064"/>
</kw>
<msg time="2026-10-16T01:18:31.260838" 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-10-16T01:18:30.849312" elapsed="0.411611"/>
</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-10-16T01:18:30.847971" elapsed="0.413065"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:18:31.261576" level="INFO">Executing command 'sudo ovs-vsctl add-port br-s1 vx1 -- set Interface vx1 type=vxlan'.</msg>
<msg time="2026-10-16T01:18:31.294983" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:18:31.295134" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:18:31.295192" 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-10-16T01:18:31.261331" elapsed="0.033892"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:31.295437" elapsed="0.000343"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:31.296504" 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-10-16T01:18:31.296115" elapsed="0.000447"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:18:31.296887" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:31.296714" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:31.296662" elapsed="0.000407"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:18:31.297257" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-10-16T01:18:31.297140" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:31.297120" elapsed="0.000246"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:18:31.297409" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:31.298455" 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-10-16T01:18:31.299150" elapsed="0.000201"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:31.299544" elapsed="0.000141"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:18:31.297873" elapsed="0.001902"/>
</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-10-16T01:18:30.845491" elapsed="0.454381"/>
</kw>
<msg time="2026-10-16T01:18:31.299938" 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-10-16T01:18:30.844977" elapsed="0.455024"/>
</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-10-16T01:18:30.844519" elapsed="0.455580"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:18:31.300822" 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-10-16T01:18:31.300369" elapsed="0.000487"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:18:31.301504" 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-10-16T01:18:31.301118" elapsed="0.000420"/>
</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-10-16T01:18:31.308174" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:18:31.307595" elapsed="0.000620"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:31.308978" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:31.308460" elapsed="0.000559"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:18:31.309089" elapsed="0.000037"/>
</return>
<msg time="2026-10-16T01:18:31.309267" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:18:31.307005" elapsed="0.002293"/>
</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-10-16T01:18:31.312985" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:18:31.312558" elapsed="0.000461"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:18:31.313076" elapsed="0.000035"/>
</return>
<msg time="2026-10-16T01:18:31.313243" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:18:31.312117" elapsed="0.001157"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:31.314921" 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-10-16T01:18:31.314573" elapsed="0.000406"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:31.315822" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:18:31.315234" elapsed="0.000648"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:18:31.320559" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:18:31.320647" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:18:31.320867" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:18:31.316314" elapsed="0.005062">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:18:31.315965" elapsed="0.005515">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:18:31.321772" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:31.321524" elapsed="0.000331"/>
</branch>
<status status="FAIL" start="2026-10-16T01:18:31.315943" elapsed="0.005944">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:18:31.322361" elapsed="0.000040"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:31.322535" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:31.322489" elapsed="0.000099"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:18:31.322467" elapsed="0.000170"/>
</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-10-16T01:18:31.322849" elapsed="0.000081"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:18:31.323001" 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-10-16T01:18:31.313737" elapsed="0.009403">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:31.323214" 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-10-16T01:18:31.311516" elapsed="0.011814">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:18:31.323636" elapsed="0.000032"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:18:31.309538" elapsed="0.014216">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:18:31.309372" elapsed="0.014456">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:18:31.306152" elapsed="0.017792">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:18:32.334494" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:18:32.333531" elapsed="0.001067"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:32.335806" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:32.335073" elapsed="0.000794"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:18:32.336012" elapsed="0.000099"/>
</return>
<msg time="2026-10-16T01:18:32.336379" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:18:32.332542" elapsed="0.003891"/>
</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-10-16T01:18:32.342560" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:18:32.341947" elapsed="0.000669"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:18:32.342764" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:18:32.343044" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:18:32.341185" elapsed="0.001909"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:32.345834" 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-10-16T01:18:32.345267" elapsed="0.000665"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:32.347016" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:18:32.346344" elapsed="0.000765"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:18:32.354827" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:18:32.354943" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:18:32.355159" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:18:32.348267" elapsed="0.007786">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:18:32.347289" elapsed="0.008937">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:18:32.356730" elapsed="0.000071"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:32.356301" elapsed="0.000606"/>
</branch>
<status status="FAIL" start="2026-10-16T01:18:32.347248" elapsed="0.009717">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:18:32.357778" elapsed="0.000055"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:32.358046" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:32.357973" elapsed="0.000158"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:18:32.357937" elapsed="0.000239"/>
</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-10-16T01:18:32.358531" elapsed="0.000045"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:18:32.358693" elapsed="0.000060"/>
</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-10-16T01:18:32.343822" elapsed="0.015116">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:32.359055" 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-10-16T01:18:32.340163" elapsed="0.019078">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:18:32.359744" elapsed="0.000051"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:18:32.336912" elapsed="0.022988">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:18:32.336557" elapsed="0.023458">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:18:32.330946" elapsed="0.029251">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:18:33.369954" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:18:33.369071" elapsed="0.000947"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:33.371038" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:33.370362" elapsed="0.000731"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:18:33.371191" elapsed="0.000071"/>
</return>
<msg time="2026-10-16T01:18:33.371493" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:18:33.368205" elapsed="0.003338"/>
</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-10-16T01:18:33.377581" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:18:33.376967" elapsed="0.000692"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:18:33.377785" elapsed="0.000059"/>
</return>
<msg time="2026-10-16T01:18:33.378062" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:18:33.376203" elapsed="0.001911"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:33.380872" 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-10-16T01:18:33.380310" elapsed="0.000658"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:33.381921" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:18:33.381380" 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-10-16T01:18:33.389092" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:18:33.389207" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:18:33.389419" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:18:33.382684" elapsed="0.007624">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:18:33.382154" elapsed="0.008325">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:18:33.390988" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:33.390550" elapsed="0.000594"/>
</branch>
<status status="FAIL" start="2026-10-16T01:18:33.382115" elapsed="0.009086">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:18:33.392090" elapsed="0.000059"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:33.392363" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:33.392290" elapsed="0.000157"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:18:33.392255" 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-10-16T01:18:33.392865" elapsed="0.000045"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:18:33.393006" 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-10-16T01:18:33.378897" elapsed="0.014319">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:33.393333" elapsed="0.000031"/>
</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-10-16T01:18:33.375234" elapsed="0.018287">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:18:33.394056" elapsed="0.000055"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:18:33.372081" elapsed="0.022150">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:18:33.371817" elapsed="0.022533">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:18:33.366965" elapsed="0.027638">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:18:34.405505" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:18:34.404306" elapsed="0.001293"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:34.406973" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:34.406039" elapsed="0.000996"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:18:34.407140" elapsed="0.000076"/>
</return>
<msg time="2026-10-16T01:18:34.407464" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:18:34.403198" elapsed="0.004339"/>
</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-10-16T01:18:34.414518" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:18:34.413659" elapsed="0.000922"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:18:34.414737" elapsed="0.000066"/>
</return>
<msg time="2026-10-16T01:18:34.415035" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:18:34.412745" elapsed="0.002345"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:34.418455" 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-10-16T01:18:34.417737" elapsed="0.000841"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:34.419927" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:18:34.419121" elapsed="0.001067"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:18:34.428175" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:18:34.428330" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:18:34.428666" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:18:34.421057" elapsed="0.008706">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:18:34.420364" elapsed="0.009605">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:18:34.430396" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:34.430046" elapsed="0.000483"/>
</branch>
<status status="FAIL" start="2026-10-16T01:18:34.420319" elapsed="0.010260">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:18:34.431619" elapsed="0.000118"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:34.431972" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:34.431897" elapsed="0.000163"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:18:34.431860" elapsed="0.000248"/>
</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-10-16T01:18:34.432555" elapsed="0.000055"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:18:34.432797" elapsed="0.000038"/>
</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-10-16T01:18:34.416018" elapsed="0.017008">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:34.433254" elapsed="0.000036"/>
</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-10-16T01:18:34.411613" elapsed="0.021850">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:18:34.434189" elapsed="0.000068"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:18:34.408041" elapsed="0.026334">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:18:34.407759" elapsed="0.026738">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:18:34.401617" elapsed="0.033135">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:18:35.445342" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:18:35.444433" elapsed="0.000975"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:35.446472" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:35.445809" elapsed="0.000719"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:18:35.446625" elapsed="0.000114"/>
</return>
<msg time="2026-10-16T01:18:35.446979" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:18:35.443511" elapsed="0.003519"/>
</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-10-16T01:18:35.453002" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:18:35.452339" elapsed="0.000719"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:18:35.453152" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:18:35.453432" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:18:35.451579" elapsed="0.001904"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:35.456244" 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-10-16T01:18:35.455734" elapsed="0.000606"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:35.457301" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:18:35.456808" elapsed="0.000584"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:18:35.464552" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:18:35.464689" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:18:35.464970" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:18:35.458087" elapsed="0.007810">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:18:35.457530" elapsed="0.008563">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:18:35.466568" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:35.466174" elapsed="0.000719"/>
</branch>
<status status="FAIL" start="2026-10-16T01:18:35.457492" elapsed="0.009464">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:18:35.467872" elapsed="0.000060"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:35.468225" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:35.468140" elapsed="0.000177"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:18:35.468084" elapsed="0.000280"/>
</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-10-16T01:18:35.468774" elapsed="0.000061"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:18:35.468939" 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-10-16T01:18:35.454287" elapsed="0.014934">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:35.469360" 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-10-16T01:18:35.450585" elapsed="0.018973">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:18:35.470187" elapsed="0.000058"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:18:35.447391" elapsed="0.022969">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:18:35.447142" elapsed="0.023337">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:18:35.442208" elapsed="0.028551">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:18:36.481182" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:18:36.480224" elapsed="0.001028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:36.482341" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:36.481627" elapsed="0.000772"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:18:36.482502" elapsed="0.000076"/>
</return>
<msg time="2026-10-16T01:18:36.482889" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:18:36.479303" elapsed="0.003641"/>
</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-10-16T01:18:36.489265" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:18:36.488557" elapsed="0.000768"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:18:36.489424" elapsed="0.000060"/>
</return>
<msg time="2026-10-16T01:18:36.489766" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:18:36.487798" elapsed="0.002025"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:36.492696" 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-10-16T01:18:36.492132" elapsed="0.000696"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:36.493946" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:18:36.493278" elapsed="0.000757"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:18:36.501114" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:18:36.501225" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:18:36.501524" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:18:36.494732" elapsed="0.007592">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:18:36.494175" elapsed="0.008309">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:18:36.502962" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:36.502555" elapsed="0.000539"/>
</branch>
<status status="FAIL" start="2026-10-16T01:18:36.494136" elapsed="0.009007">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:18:36.503937" elapsed="0.000056"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:36.504207" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:36.504133" elapsed="0.000160"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:18:36.504099" 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-10-16T01:18:36.504668" elapsed="0.000070"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:18:36.504837" elapsed="0.000031"/>
</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-10-16T01:18:36.490535" elapsed="0.014516">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:36.505169" elapsed="0.000031"/>
</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-10-16T01:18:36.486768" elapsed="0.018586">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:18:36.505862" elapsed="0.000049"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:18:36.483333" elapsed="0.022681">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:18:36.483065" elapsed="0.023065">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:18:36.477912" elapsed="0.028401">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<msg time="2026-10-16T01:18:36.506505" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<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="FAIL" start="2026-10-16T01:18:31.301842" elapsed="5.204905">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${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="NOT RUN" start="2026-10-16T01:18:36.507249" elapsed="0.000043"/>
</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="FAIL" start="2026-10-16T01:18:30.844148" elapsed="5.663341">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<doc>Add port with OVS command and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-10-16T01:18:30.458696" elapsed="6.049119">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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-10-16T01:18:36.511133" elapsed="0.000469"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:18:36.510545" elapsed="0.001226"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:36.514035" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:36.513833" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:36.513794" elapsed="0.000382"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:36.518423" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:36.518241" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:36.518205" elapsed="0.000356"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:18:36.520593" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:18:36.519873" elapsed="0.000798"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:36.521632" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:36.521037" elapsed="0.000705"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:18:36.521836" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:18:36.522121" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:18:36.519050" elapsed="0.003121"/>
</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-10-16T01:18:36.530756" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:36.530561" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:36.530535" elapsed="0.000353"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:36.532762" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:36.532584" elapsed="0.000244"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:36.532558" elapsed="0.000301"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:36.533425" level="INFO">${karaf_connection_index} = 222</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:18:36.533077" elapsed="0.000386"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:36.534005" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:36.533739" elapsed="0.000301"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:36.568584" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:36.534931" elapsed="0.034048"/>
</kw>
<msg time="2026-10-16T01:18:36.569273" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:36.569336" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:36.534269" elapsed="0.035121"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:36.649370" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:36.570490" elapsed="0.079098"/>
</kw>
<msg time="2026-10-16T01:18:36.649800" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:36.649844" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:36.569752" elapsed="0.080128"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:36.650228" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:36.649972" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:36.649946" elapsed="0.000381"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:36.650918" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:36.650509" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:36.651267" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:36.651070" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:36.651054" elapsed="0.000368"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:36.651457" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:36.654124" elapsed="0.000487"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:18:36.655896" elapsed="0.000483"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:36.657600" elapsed="0.000572"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:18:36.652347" elapsed="0.005892"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:36.651819" elapsed="0.006540"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:36.532159" elapsed="0.126278"/>
</kw>
<msg time="2026-10-16T01:18:36.658522" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:36.658563" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:36.531137" elapsed="0.127462"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:36.658786" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:18:36.658685" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:36.658668" elapsed="0.000197"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:18:36.659198" 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-10-16T01:18:36.659501" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:36.659564" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:18:36.530108" elapsed="0.129553"/>
</kw>
<msg time="2026-10-16T01:18:36.659840" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:36.659881" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:36.522945" elapsed="0.136971"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:36.660205" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:36.659985" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:36.659970" elapsed="0.000306"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:18:36.522586" elapsed="0.137711"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:36.662988" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:36.662902" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:36.662885" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:36.664203" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:36.664070" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:36.664054" elapsed="0.000214"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:36.664692" 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-10-16T01:18:36.664445" elapsed="0.000287"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:36.665072" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:36.664893" elapsed="0.000203"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:36.701212" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:36.665676" elapsed="0.035707"/>
</kw>
<msg time="2026-10-16T01:18:36.701557" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:36.701599" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:36.665249" elapsed="0.036385"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:36.793573" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:36.702289" elapsed="0.091504"/>
</kw>
<msg time="2026-10-16T01:18:36.793952" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:36.793992" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:36.701866" elapsed="0.092162"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:36.794303" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:36.794099" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:36.794080" elapsed="0.000340"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:36.794972" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:36.794600" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:36.795318" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:36.795123" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:36.795107" elapsed="0.000303"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:36.795441" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:36.797907" elapsed="0.000471"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:18:36.799590" elapsed="0.000484"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:36.801418" 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-10-16T01:18:36.796233" elapsed="0.005602"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:36.795743" elapsed="0.006206"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:36.663813" elapsed="0.138212"/>
</kw>
<msg time="2026-10-16T01:18:36.802106" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:36.802145" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:36.663197" elapsed="0.138984"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:36.802335" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-10-16T01:18:36.802249" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:36.802232" 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-10-16T01:18:36.802858" 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-10-16T01:18:36.803302" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:36.803367" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:18:36.662573" elapsed="0.140878"/>
</kw>
<msg time="2026-10-16T01:18:36.803535" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:36.803574" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:36.660558" elapsed="0.143052"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:36.803923" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:36.803690" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:36.803674" elapsed="0.000357"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:18:36.660420" elapsed="0.143635"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:36.806592" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:36.806508" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:36.806490" elapsed="0.000178"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:36.807776" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:36.807666" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:36.807648" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:36.808201" 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-10-16T01:18:36.807979" elapsed="0.000247"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:36.808553" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:36.808383" elapsed="0.000194"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:36.843869" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:36.809171" elapsed="0.034889"/>
</kw>
<msg time="2026-10-16T01:18:36.844215" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:36.844256" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:36.808759" elapsed="0.035532"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:36.930952" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:36.844906" elapsed="0.086228"/>
</kw>
<msg time="2026-10-16T01:18:36.931287" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:36.931328" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:36.844450" elapsed="0.086913"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:36.931630" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:36.931431" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:36.931413" elapsed="0.000350"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:36.932275" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:36.931944" elapsed="0.000416"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:36.932615" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:36.932421" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:36.932404" elapsed="0.000343"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:36.932778" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:36.935239" 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-10-16T01:18:36.936961" elapsed="0.000444"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:36.938571" elapsed="0.000553"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:18:36.933531" elapsed="0.005660"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:36.933046" elapsed="0.006259"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:36.807399" elapsed="0.131982"/>
</kw>
<msg time="2026-10-16T01:18:36.939463" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:36.939534" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:36.806829" elapsed="0.132742"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:36.939761" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:18:36.939657" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:36.939624" 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 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-10-16T01:18:36.940145" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:36.940440" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:36.940504" 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-10-16T01:18:36.806217" elapsed="0.134372"/>
</kw>
<msg time="2026-10-16T01:18:36.940687" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:36.940817" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:36.804300" elapsed="0.136553"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:36.941144" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:36.940924" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:36.940907" elapsed="0.000309"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:18:36.804164" elapsed="0.137074"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:18:36.522278" elapsed="0.418987"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:18:36.517547" elapsed="0.423770"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:18:36.513117" elapsed="0.428251"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:36.512101" elapsed="0.429309"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:18:36.509791" elapsed="0.431668"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:36.945022" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:36.944792" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:36.944774" elapsed="0.000323"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:36.945410" 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-10-16T01:18:36.945502" 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-10-16T01:18:36.945284" elapsed="0.000242"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:36.946033" level="INFO">Attempting to execute command "sudo ovs-vsctl del-br br-s1" on remote system "10.30.171.104" 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-10-16T01:18:36.945742" elapsed="0.000334"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:36.946552" level="INFO">${conn_id} = 261</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-10-16T01:18:36.946251" elapsed="0.000326"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:18:36.947413" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:18:36.947482" 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-10-16T01:18:36.947152" elapsed="0.000351"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:36.947666" elapsed="0.000299"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:18:36.948750" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:18:37.318181" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:18:24 UTC 2026

  System load:  0.01               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:18:31 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:18:36.948489" elapsed="0.369771"/>
</kw>
<msg time="2026-10-16T01:18:37.318318" 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-10-16T01:18:36.948125" elapsed="0.370249"/>
</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-10-16T01:18:36.946798" elapsed="0.371656"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:18:37.318850" level="INFO">Executing command 'sudo ovs-vsctl del-br br-s1'.</msg>
<msg time="2026-10-16T01:18:37.402226" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:18:37.402341" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:18:37.402381" 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-10-16T01:18:37.318678" elapsed="0.083725"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:37.402559" elapsed="0.000274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:37.403287" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:18:37.403050" elapsed="0.000275"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:18:37.403486" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:37.403391" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:37.403371" elapsed="0.000179"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:18:37.403695" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-10-16T01:18:37.403597" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:37.403584" elapsed="0.000203"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:18:37.403818" elapsed="0.000012"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:37.404491" 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-10-16T01:18:37.404987" elapsed="0.000139"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:37.405264" elapsed="0.000089"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:18:37.404103" elapsed="0.001296"/>
</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-10-16T01:18:36.944351" elapsed="0.461130"/>
</kw>
<msg time="2026-10-16T01:18:37.405537" 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-10-16T01:18:36.943844" elapsed="0.461738"/>
</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-10-16T01:18:36.943394" elapsed="0.462274"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:18:37.406412" 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-10-16T01:18:37.405893" elapsed="0.000572"/>
</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-10-16T01:18:37.413842" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:18:37.413067" elapsed="0.000857"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:37.414942" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:37.414278" elapsed="0.000718"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:18:37.415086" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:18:37.415366" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:18:37.412240" elapsed="0.003177"/>
</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-10-16T01:18:37.421402" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:18:37.420800" elapsed="0.000657"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:18:37.421568" elapsed="0.000102"/>
</return>
<msg time="2026-10-16T01:18:37.421949" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:18:37.420049" elapsed="0.001951"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:37.424602" 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-10-16T01:18:37.424104" elapsed="0.000649"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:37.425683" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:18:37.425174" 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-10-16T01:18:37.432561" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:18:37.432744" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:18:37.432984" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:18:37.426433" elapsed="0.007371">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:18:37.425938" elapsed="0.008034">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:18:37.434791" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:37.434041" elapsed="0.000891"/>
</branch>
<status status="FAIL" start="2026-10-16T01:18:37.425902" elapsed="0.009082">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:18:37.435789" elapsed="0.000055"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:37.436065" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:37.435991" elapsed="0.000159"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:18:37.435955" 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-10-16T01:18:37.436501" elapsed="0.000045"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:18:37.436668" elapsed="0.000058"/>
</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-10-16T01:18:37.422676" elapsed="0.014241">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:37.437039" 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-10-16T01:18:37.419051" elapsed="0.018179">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:18:37.437746" elapsed="0.000052"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:18:37.415922" elapsed="0.021984">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:18:37.415600" elapsed="0.022419">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:18:37.411143" elapsed="0.027056">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:18:38.445155" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:18:38.444286" elapsed="0.000933"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:38.446239" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:38.445561" elapsed="0.000732"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:18:38.446390" elapsed="0.000071"/>
</return>
<msg time="2026-10-16T01:18:38.446739" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:18:38.443434" elapsed="0.003361"/>
</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-10-16T01:18:38.452736" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:18:38.452079" elapsed="0.000716"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:18:38.452890" elapsed="0.000057"/>
</return>
<msg time="2026-10-16T01:18:38.453161" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:18:38.451314" elapsed="0.001897"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:38.455882" 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-10-16T01:18:38.455311" elapsed="0.000700"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:38.457028" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:18:38.456445" elapsed="0.000675"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:18:38.463375" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:18:38.463488" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:18:38.463758" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:18:38.457815" elapsed="0.006707">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:18:38.457257" elapsed="0.007477">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:18:38.465144" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:38.464808" elapsed="0.000464"/>
</branch>
<status status="FAIL" start="2026-10-16T01:18:38.457219" elapsed="0.008102">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:18:38.466503" elapsed="0.000054"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:38.466827" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:38.466750" elapsed="0.000166"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:18:38.466686" elapsed="0.000276"/>
</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-10-16T01:18:38.467270" elapsed="0.000042"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:18:38.467408" elapsed="0.000030"/>
</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-10-16T01:18:38.453921" elapsed="0.013697">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:38.467885" elapsed="0.000036"/>
</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-10-16T01:18:38.450318" elapsed="0.017767">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:18:38.468559" elapsed="0.000049"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:18:38.447164" elapsed="0.021603">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:18:38.446910" elapsed="0.021975">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:18:38.442149" elapsed="0.026920">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:18:39.475521" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:18:39.474738" elapsed="0.000842"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:39.476644" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:39.476016" elapsed="0.000738"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:18:39.476850" elapsed="0.000063"/>
</return>
<msg time="2026-10-16T01:18:39.477139" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:18:39.473899" elapsed="0.003290"/>
</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-10-16T01:18:39.483096" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:18:39.482439" elapsed="0.000714"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:18:39.483247" elapsed="0.000057"/>
</return>
<msg time="2026-10-16T01:18:39.483517" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:18:39.481726" elapsed="0.001841"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:39.486280" 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-10-16T01:18:39.485779" elapsed="0.000593"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:39.487330" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:18:39.486840" elapsed="0.000578"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:18:39.494046" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:18:39.494157" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:18:39.494354" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:18:39.488111" elapsed="0.007003">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:18:39.487556" elapsed="0.007722">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:18:39.495739" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:39.495347" elapsed="0.000527"/>
</branch>
<status status="FAIL" start="2026-10-16T01:18:39.487520" elapsed="0.008403">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:18:39.496795" elapsed="0.000054"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:39.497068" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:39.496993" elapsed="0.000159"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:18:39.496958" 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-10-16T01:18:39.497500" elapsed="0.000056"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:18:39.497732" elapsed="0.000048"/>
</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-10-16T01:18:39.484265" elapsed="0.013720">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:39.498109" 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-10-16T01:18:39.480768" elapsed="0.017529">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:18:39.498810" elapsed="0.000051"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:18:39.477538" elapsed="0.021429">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:18:39.477294" elapsed="0.021787">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:18:39.472772" elapsed="0.026492">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:18:40.506833" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:18:40.505938" elapsed="0.000961"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:40.508017" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:40.507331" elapsed="0.000742"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:18:40.508172" elapsed="0.000070"/>
</return>
<msg time="2026-10-16T01:18:40.508475" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:18:40.505081" elapsed="0.003446"/>
</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-10-16T01:18:40.515795" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:18:40.515118" elapsed="0.000735"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:18:40.515951" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:18:40.516222" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:18:40.513209" elapsed="0.003064"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:40.520024" 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-10-16T01:18:40.519371" elapsed="0.000751"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:40.521171" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:18:40.520564" 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-10-16T01:18:40.528060" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:18:40.528173" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:18:40.528515" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:18:40.521979" elapsed="0.007343">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:18:40.521416" elapsed="0.008071">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:18:40.529955" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:40.529558" elapsed="0.000533"/>
</branch>
<status status="FAIL" start="2026-10-16T01:18:40.521376" elapsed="0.008765">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:18:40.530941" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:40.531212" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:40.531137" elapsed="0.000164"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:18:40.531102" 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-10-16T01:18:40.531652" elapsed="0.000144"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:18:40.531897" 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-10-16T01:18:40.517946" elapsed="0.014166">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:40.532233" 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-10-16T01:18:40.512180" elapsed="0.020245">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:18:40.532946" elapsed="0.000050"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:18:40.508944" elapsed="0.024158">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:18:40.508639" elapsed="0.024577">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:18:40.503856" elapsed="0.029542">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:18:41.540299" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:18:41.539467" elapsed="0.000891"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:41.541360" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:41.540746" elapsed="0.000668"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:18:41.541507" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:18:41.541849" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:18:41.538620" elapsed="0.003282"/>
</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-10-16T01:18:41.547744" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:18:41.547095" elapsed="0.000707"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:18:41.547897" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:18:41.548166" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:18:41.546339" elapsed="0.001877"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:41.550869" 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-10-16T01:18:41.550319" elapsed="0.000645"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:41.552030" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:18:41.551472" elapsed="0.000648"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:18:41.558852" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:18:41.558961" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:18:41.559179" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:18:41.552818" elapsed="0.007135">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:18:41.552258" elapsed="0.007858">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:18:41.560519" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:41.560184" elapsed="0.000465"/>
</branch>
<status status="FAIL" start="2026-10-16T01:18:41.552220" elapsed="0.008532">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:18:41.561491" elapsed="0.000052"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:41.561812" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:41.561735" elapsed="0.000161"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:18:41.561648" 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-10-16T01:18:41.562240" elapsed="0.000042"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:18:41.562376" elapsed="0.000030"/>
</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-10-16T01:18:41.548920" elapsed="0.013664">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:41.562750" 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-10-16T01:18:41.545381" elapsed="0.017563">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:18:41.563400" elapsed="0.000049"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:18:41.542255" elapsed="0.021298">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:18:41.542009" elapsed="0.021682">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:18:41.537478" elapsed="0.026435">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:18:42.570786" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:18:42.569969" elapsed="0.000879"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:42.571853" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:42.571189" elapsed="0.000719"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:18:42.572001" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:18:42.572289" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:18:42.569123" elapsed="0.003291"/>
</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-10-16T01:18:42.578311" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:18:42.577612" elapsed="0.000755"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:18:42.578461" elapsed="0.000057"/>
</return>
<msg time="2026-10-16T01:18:42.578781" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:18:42.576907" elapsed="0.001927"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:42.581552" 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-10-16T01:18:42.581052" elapsed="0.000593"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:42.582609" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:18:42.582125" elapsed="0.000632"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:18:42.589352" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:18:42.589460" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:18:42.589734" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:18:42.583396" elapsed="0.007041">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:18:42.582897" elapsed="0.007698">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:18:42.591064" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:42.590691" elapsed="0.000507"/>
</branch>
<status status="FAIL" start="2026-10-16T01:18:42.582859" elapsed="0.008388">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:18:42.592024" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:42.592290" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:42.592216" elapsed="0.000158"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:18:42.592181" 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-10-16T01:18:42.592770" elapsed="0.000046"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:18:42.592914" 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-10-16T01:18:42.579480" elapsed="0.013646">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:42.593245" elapsed="0.000031"/>
</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-10-16T01:18:42.575947" elapsed="0.017487">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:18:42.593944" elapsed="0.000051"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:18:42.572827" elapsed="0.021275">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:18:42.572524" elapsed="0.021690">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:18:42.567990" elapsed="0.026483">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<msg time="2026-10-16T01:18:42.594691" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</msg>
<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="FAIL" start="2026-10-16T01:18:37.406948" elapsed="5.187973">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<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-10-16T01:18:36.943024" elapsed="5.652117">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<doc>Delete bridge with OVS command and verify it gets deleted from all instances.</doc>
<status status="FAIL" start="2026-10-16T01:18:36.508428" elapsed="6.086994">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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-10-16T01:18:42.599147" elapsed="0.000459"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:18:42.598160" elapsed="0.001621"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:42.601862" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:42.601611" elapsed="0.000346"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:42.601573" elapsed="0.000431"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:42.606240" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:42.606056" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:42.606018" elapsed="0.000360"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:18:42.608439" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:18:42.607685" elapsed="0.000810"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:42.609483" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:42.608879" elapsed="0.000658"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:18:42.609628" elapsed="0.000109"/>
</return>
<msg time="2026-10-16T01:18:42.609965" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:18:42.606878" elapsed="0.003138"/>
</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-10-16T01:18:42.615446" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:42.615258" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:42.615219" elapsed="0.000367"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:42.617905" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:42.617788" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:42.617764" elapsed="0.000228"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:42.618512" level="INFO">${karaf_connection_index} = 222</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:18:42.618193" elapsed="0.000353"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:42.619082" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:42.618812" elapsed="0.000303"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:42.652946" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:42.619955" elapsed="0.033240"/>
</kw>
<msg time="2026-10-16T01:18:42.653458" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:42.653529" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:42.619329" elapsed="0.034310"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:42.739969" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:42.654273" elapsed="0.085887"/>
</kw>
<msg time="2026-10-16T01:18:42.740318" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:42.740359" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:42.653843" elapsed="0.086552"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:42.740685" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:42.740465" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:42.740447" elapsed="0.000357"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:42.741323" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:42.740985" elapsed="0.000424"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:42.741827" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:42.741470" elapsed="0.000432"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:42.741454" elapsed="0.000472"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:42.741957" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:42.744474" 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-10-16T01:18:42.746245" elapsed="0.000522"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:42.748175" 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-10-16T01:18:42.742773" elapsed="0.005781"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:42.742240" 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-10-16T01:18:42.617345" elapsed="0.131431"/>
</kw>
<msg time="2026-10-16T01:18:42.748857" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:42.748896" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:42.615970" elapsed="0.132961"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:42.749083" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:18:42.748999" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:42.748983" elapsed="0.000177"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:18:42.749479" 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-10-16T01:18:42.749882" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:42.749948" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:18:42.614574" elapsed="0.135457"/>
</kw>
<msg time="2026-10-16T01:18:42.750114" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:42.750153" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:42.610787" elapsed="0.139402"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:42.750472" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:42.750256" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:42.750240" elapsed="0.000347"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:18:42.610422" elapsed="0.140187"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:42.753010" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:42.752925" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:42.752907" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:42.754166" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:42.754082" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:42.754066" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:42.754592" 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-10-16T01:18:42.754369" elapsed="0.000248"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:42.754980" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:42.754808" elapsed="0.000196"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:42.792082" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:42.755566" elapsed="0.036685"/>
</kw>
<msg time="2026-10-16T01:18:42.792435" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:42.792476" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:42.755155" elapsed="0.037356"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:42.875099" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:42.793137" elapsed="0.082144"/>
</kw>
<msg time="2026-10-16T01:18:42.875437" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:42.875478" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:42.792693" elapsed="0.082820"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:42.875821" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:42.875582" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:42.875565" elapsed="0.000350"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:42.876426" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:42.876097" elapsed="0.000416"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:42.876802" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:42.876573" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:42.876557" elapsed="0.000339"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:42.876926" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:42.880931" 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-10-16T01:18:42.882617" elapsed="0.000495"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:42.884302" elapsed="0.000310"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:18:42.877694" elapsed="0.007236"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:42.877189" elapsed="0.007866"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:42.753829" elapsed="0.131304"/>
</kw>
<msg time="2026-10-16T01:18:42.885252" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:42.885292" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:42.753217" elapsed="0.132110"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:42.885484" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:18:42.885399" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:42.885382" elapsed="0.000185"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:18:42.885913" 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-10-16T01:18:42.886213" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:42.886280" 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-10-16T01:18:42.752605" elapsed="0.133760"/>
</kw>
<msg time="2026-10-16T01:18:42.886446" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:42.886485" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:42.750890" elapsed="0.135629"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:42.886866" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:42.886586" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:42.886570" elapsed="0.000369"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:18:42.750752" elapsed="0.136208"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:42.889331" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:42.889247" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:42.889229" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:42.890495" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:42.890411" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:42.890395" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:42.890960" 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-10-16T01:18:42.890735" elapsed="0.000249"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:42.891312" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:42.891142" elapsed="0.000195"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:42.929888" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:42.891941" elapsed="0.038120"/>
</kw>
<msg time="2026-10-16T01:18:42.930216" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:42.930257" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:42.891491" elapsed="0.038801"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:43.004870" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:42.930908" elapsed="0.074139"/>
</kw>
<msg time="2026-10-16T01:18:43.005201" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:43.005242" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:42.930453" elapsed="0.074824"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:43.005541" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:43.005344" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.005327" elapsed="0.000354"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:43.006219" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:43.005886" elapsed="0.000417"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:43.006562" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:43.006363" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.006347" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:43.006717" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:43.009148" elapsed="0.000465"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:18:43.010867" elapsed="0.000445"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:43.012478" elapsed="0.000483"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:18:43.007476" elapsed="0.005553"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:43.006990" elapsed="0.006157"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:42.890156" elapsed="0.123070"/>
</kw>
<msg time="2026-10-16T01:18:43.013308" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:43.013347" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:42.889542" elapsed="0.123841"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:43.013536" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:18:43.013451" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.013435" elapsed="0.000177"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:18:43.014231" 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-10-16T01:18:43.014530" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:43.014594" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:18:42.888957" elapsed="0.125736"/>
</kw>
<msg time="2026-10-16T01:18:43.014794" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:43.014832" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:42.887203" elapsed="0.127664"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:43.015148" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:43.014934" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.014918" elapsed="0.000300"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:18:42.887066" elapsed="0.128173"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:18:42.610118" elapsed="0.405147"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:18:42.605352" elapsed="0.409961"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:18:42.601050" elapsed="0.414311"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:42.600121" elapsed="0.415280"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:18:42.597346" elapsed="0.418100"/>
</kw>
<kw name="Create Sample Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:18:43.019301" 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-10-16T01:18:43.018077" elapsed="0.001259">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-10-16T01:18:42.596149" elapsed="0.423347">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-10-16T01:18:43.020928" elapsed="0.000198"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:18:43.020652" 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-10-16T01:18:43.022125" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:43.022039" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.022022" elapsed="0.000166"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:43.024060" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:43.023978" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.023961" elapsed="0.000162"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:18:43.025030" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:18:43.024688" elapsed="0.000367"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:43.025469" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:43.025203" elapsed="0.000289"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:18:43.025532" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:18:43.025656" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:18:43.024321" elapsed="0.001371"/>
</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-10-16T01:18:43.028464" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:43.028380" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.028362" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:43.029631" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:43.029547" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.029531" elapsed="0.000201"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:43.030099" level="INFO">${karaf_connection_index} = 222</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:18:43.029875" elapsed="0.000249"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:43.030456" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:43.030282" elapsed="0.000197"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:43.064557" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:43.031078" elapsed="0.033698"/>
</kw>
<msg time="2026-10-16T01:18:43.064936" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:43.064977" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:43.030633" elapsed="0.034380"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:43.142438" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:43.065601" elapsed="0.077029"/>
</kw>
<msg time="2026-10-16T01:18:43.142833" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:43.142874" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:43.065178" elapsed="0.077731"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:43.143183" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:43.142981" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.142962" elapsed="0.000315"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:43.143833" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:43.143453" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:43.144208" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:43.144011" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.143995" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:43.144337" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:43.146845" 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-10-16T01:18:43.148554" elapsed="0.000504"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:43.150428" 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-10-16T01:18:43.145144" elapsed="0.005693"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:43.144602" elapsed="0.006353"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:43.029291" elapsed="0.121742"/>
</kw>
<msg time="2026-10-16T01:18:43.151115" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:43.151154" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:43.028689" elapsed="0.122498"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:43.151338" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:18:43.151255" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.151238" elapsed="0.000177"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:18:43.151802" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:43.152101" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:43.152164" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:18:43.028089" elapsed="0.124159"/>
</kw>
<msg time="2026-10-16T01:18:43.152329" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:43.152369" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:43.026033" elapsed="0.126370"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:43.152815" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:43.152469" elapsed="0.000400"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.152454" elapsed="0.000437"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:18:43.025897" elapsed="0.127016"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:43.155390" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:43.155307" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.155289" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:43.156553" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:43.156470" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.156454" elapsed="0.000161"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:43.157018" 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-10-16T01:18:43.156794" elapsed="0.000249"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:43.157370" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:43.157199" elapsed="0.000195"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:43.197108" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:43.157995" elapsed="0.039280"/>
</kw>
<msg time="2026-10-16T01:18:43.197497" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:43.197539" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:43.157545" elapsed="0.040027"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:43.283785" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:43.198189" elapsed="0.085790"/>
</kw>
<msg time="2026-10-16T01:18:43.284142" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:43.284182" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:43.197768" elapsed="0.086449"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:43.284492" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:43.284288" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.284269" elapsed="0.000317"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:43.285146" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:43.284803" elapsed="0.000428"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:43.285486" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:43.285291" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.285275" elapsed="0.000304"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:43.285609" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:43.288119" 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-10-16T01:18:43.289879" elapsed="0.000455"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:43.291532" elapsed="0.000559"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:18:43.286395" elapsed="0.005763"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:43.285905" elapsed="0.006370"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:43.156209" elapsed="0.136144"/>
</kw>
<msg time="2026-10-16T01:18:43.292435" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:43.292476" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:43.155599" elapsed="0.136913"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:43.292678" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-10-16T01:18:43.292580" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.292563" 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-10-16T01:18:43.293094" 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-10-16T01:18:43.293393" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:43.293458" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:18:43.155017" elapsed="0.138526"/>
</kw>
<msg time="2026-10-16T01:18:43.293626" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:43.293684" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:43.153156" elapsed="0.140654"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:43.294136" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:43.293918" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.293900" elapsed="0.000308"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:18:43.153021" elapsed="0.141209"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:43.296761" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:43.296639" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.296622" 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-10-16T01:18:43.297935" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:43.297851" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.297834" elapsed="0.000164"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:43.298363" 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-10-16T01:18:43.298139" elapsed="0.000249"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:43.298753" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:43.298546" elapsed="0.000231"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:43.331951" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:43.299340" elapsed="0.032786"/>
</kw>
<msg time="2026-10-16T01:18:43.332300" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:43.332342" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:43.298930" elapsed="0.033448"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:43.412175" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:43.333003" elapsed="0.079364"/>
</kw>
<msg time="2026-10-16T01:18:43.412529" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:43.412570" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:43.332540" elapsed="0.080065"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:43.412920" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:43.412691" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.412659" elapsed="0.000355"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:43.413528" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:43.413194" elapsed="0.000417"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:43.413899" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:43.413687" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.413654" elapsed="0.000339"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:43.414024" elapsed="0.000024"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:43.416461" 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-10-16T01:18:43.418175" elapsed="0.000443"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:43.419825" elapsed="0.000306"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:18:43.414816" elapsed="0.005378"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:43.414288" elapsed="0.006026"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:43.297547" elapsed="0.122877"/>
</kw>
<msg time="2026-10-16T01:18:43.420506" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:43.420545" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:43.296971" elapsed="0.123610"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:43.421037" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:18:43.420649" elapsed="0.000445"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.420632" elapsed="0.000484"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:18:43.421431" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:43.421769" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:43.421834" 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-10-16T01:18:43.296350" elapsed="0.125570"/>
</kw>
<msg time="2026-10-16T01:18:43.422004" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:43.422043" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:43.294476" elapsed="0.127603"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:43.422360" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:43.422144" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.422129" elapsed="0.000301"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:18:43.294338" elapsed="0.128114"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:18:43.025759" elapsed="0.396719"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:18:43.023638" elapsed="0.398891"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:18:43.021770" elapsed="0.400810"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:43.021318" elapsed="0.401303"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:18:43.020320" elapsed="0.402363"/>
</kw>
<kw name="Create Sample Port And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:18:43.426764" 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-10-16T01:18:43.425502" elapsed="0.001297">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-10-16T01:18:43.019814" elapsed="0.407105">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-10-16T01:18:43.428326" elapsed="0.000198"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:18:43.428082" elapsed="0.000492"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:43.429528" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:43.429444" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.429427" elapsed="0.000165"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:43.431457" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:43.431376" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.431359" elapsed="0.000160"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:18:43.432429" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:18:43.432108" elapsed="0.000346"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:43.433069" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:43.432601" elapsed="0.000492"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:18:43.433135" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:18:43.433301" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:18:43.431756" 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-10-16T01:18:43.435857" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:43.435773" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.435756" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:43.437015" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:43.436933" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.436917" elapsed="0.000160"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:43.437450" level="INFO">${karaf_connection_index} = 222</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:18:43.437222" elapsed="0.000253"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:43.437837" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:43.437632" elapsed="0.000229"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:43.471259" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:43.438427" elapsed="0.033013"/>
</kw>
<msg time="2026-10-16T01:18:43.471600" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:43.471642" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:43.438015" elapsed="0.033678"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:43.557052" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:43.472298" elapsed="0.084951"/>
</kw>
<msg time="2026-10-16T01:18:43.557407" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:43.557448" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:43.471875" elapsed="0.085609"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:43.557806" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:43.557553" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.557535" elapsed="0.000368"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:43.558419" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:43.558083" elapsed="0.000426"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:43.558795" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:43.558569" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.558552" elapsed="0.000337"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:43.558919" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:43.561396" 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-10-16T01:18:43.563233" elapsed="0.000493"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:43.564914" elapsed="0.000303"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:18:43.559686" elapsed="0.005596"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:43.559184" elapsed="0.006213"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:43.436640" elapsed="0.128870"/>
</kw>
<msg time="2026-10-16T01:18:43.565593" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:43.565632" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:43.436065" elapsed="0.129624"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:43.566045" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:18:43.565960" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.565942" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:18:43.566434" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:43.566767" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:43.566832" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:18:43.435454" elapsed="0.131463"/>
</kw>
<msg time="2026-10-16T01:18:43.566999" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:43.567038" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:43.433646" elapsed="0.133428"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:43.567352" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:43.567140" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.567124" elapsed="0.000297"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:18:43.433509" elapsed="0.133934"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:43.570052" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:43.569969" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.569952" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:43.571215" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:43.571133" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.571117" elapsed="0.000160"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:43.571639" 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-10-16T01:18:43.571418" elapsed="0.000246"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:43.572031" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:43.571857" elapsed="0.000198"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:43.605414" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:43.572617" elapsed="0.032985"/>
</kw>
<msg time="2026-10-16T01:18:43.605797" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:43.605839" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:43.572208" elapsed="0.033666"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:43.710584" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:43.606465" elapsed="0.104352"/>
</kw>
<msg time="2026-10-16T01:18:43.710979" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:43.711019" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:43.606040" elapsed="0.105015"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:43.711332" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:43.711127" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.711108" elapsed="0.000355"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:43.712023" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:43.711645" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:43.712368" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:43.712173" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.712157" elapsed="0.000303"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:43.712491" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:43.714982" elapsed="0.000470"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:18:43.716757" elapsed="0.000460"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:43.718587" 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-10-16T01:18:43.713302" elapsed="0.005695"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:43.712808" elapsed="0.006307"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:43.570878" elapsed="0.148313"/>
</kw>
<msg time="2026-10-16T01:18:43.719273" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:43.719312" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:43.570262" elapsed="0.149085"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:43.719501" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:18:43.719416" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.719399" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:18:43.719987" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:43.720287" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:43.720351" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:18:43.569650" elapsed="0.150785"/>
</kw>
<msg time="2026-10-16T01:18:43.720517" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:43.720556" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:43.567817" elapsed="0.152774"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:43.720903" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:43.720657" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.720642" elapsed="0.000332"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:18:43.567550" elapsed="0.153445"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:43.723543" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:43.723459" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.723441" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:43.724736" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:43.724615" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.724598" elapsed="0.000202"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:43.725164" 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-10-16T01:18:43.724941" elapsed="0.000247"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:43.725556" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:43.725379" elapsed="0.000201"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:43.755809" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:43.726190" elapsed="0.029801"/>
</kw>
<msg time="2026-10-16T01:18:43.756150" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:43.756191" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:43.725768" elapsed="0.030459"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:43.827504" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:43.756848" elapsed="0.070887"/>
</kw>
<msg time="2026-10-16T01:18:43.827898" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:43.827939" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:43.756392" elapsed="0.071583"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:43.828247" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:43.828045" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.828027" elapsed="0.000318"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:43.828907" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:43.828530" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:43.829248" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:43.829054" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.829037" elapsed="0.000304"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:43.829372" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:43.831857" elapsed="0.000467"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:18:43.833583" elapsed="0.000630"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:43.835391" elapsed="0.000413"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:18:43.830173" elapsed="0.005701"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:43.829641" elapsed="0.006350"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:43.724355" elapsed="0.111713"/>
</kw>
<msg time="2026-10-16T01:18:43.836150" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:43.836189" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:43.723781" elapsed="0.112444"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:43.836376" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:18:43.836293" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.836276" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:18:43.836811" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:43.837132" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:43.837242" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:18:43.723168" elapsed="0.114163"/>
</kw>
<msg time="2026-10-16T01:18:43.837416" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:43.837455" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:43.721237" elapsed="0.116254"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:43.837927" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:43.837558" elapsed="0.000420"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.837542" elapsed="0.000459"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:18:43.721103" elapsed="0.116920"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:18:43.433372" elapsed="0.404678"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:18:43.431086" elapsed="0.407016"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:18:43.429191" elapsed="0.408964"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:43.428799" elapsed="0.409397"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:18:43.427744" elapsed="0.410502"/>
</kw>
<kw name="Modify the destination IP of Sample Port" owner="ClusterOvsdb">
<msg time="2026-10-16T01:18:43.841275" 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-10-16T01:18:43.840031" elapsed="0.001278">Variable '${original_owner}' not found.</status>
</kw>
<doc>Modify the dst ip of existing port in Owner.</doc>
<status status="FAIL" start="2026-10-16T01:18:43.427241" elapsed="0.414189">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-10-16T01:18:43.842820" elapsed="0.000203"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:18:43.842541" 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-10-16T01:18:43.843981" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:43.843895" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.843879" elapsed="0.000165"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:43.845900" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:43.845816" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.845799" elapsed="0.000162"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:18:43.846862" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:18:43.846511" elapsed="0.000376"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:43.847304" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:43.847035" elapsed="0.000292"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:18:43.847367" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:18:43.847492" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:18:43.846159" elapsed="0.001355"/>
</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-10-16T01:18:43.850032" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:43.849949" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.849932" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:43.851187" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:43.851105" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.851089" elapsed="0.000160"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:43.851612" level="INFO">${karaf_connection_index} = 222</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:18:43.851390" elapsed="0.000247"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:43.852059" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:43.851887" elapsed="0.000230"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:43.888945" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:43.852725" elapsed="0.036400"/>
</kw>
<msg time="2026-10-16T01:18:43.889308" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:43.889350" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:43.852273" elapsed="0.037113"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:43.979507" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:43.890027" elapsed="0.089722"/>
</kw>
<msg time="2026-10-16T01:18:43.979929" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:43.979974" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:43.889551" elapsed="0.090460"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:43.980321" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:43.980091" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.980070" elapsed="0.000350"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:43.981012" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:43.980603" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:43.981358" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:43.981158" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.981141" elapsed="0.000311"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:43.981484" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:43.984055" elapsed="0.000485"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:18:43.985831" elapsed="0.000467"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:43.987493" 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-10-16T01:18:43.982312" elapsed="0.005598"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:43.981811" elapsed="0.006218"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:43.850850" elapsed="0.137256"/>
</kw>
<msg time="2026-10-16T01:18:43.988190" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:43.988229" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:43.850241" elapsed="0.138023"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:43.988420" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-16T01:18:43.988333" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.988316" elapsed="0.000183"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:18:43.989285" 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-10-16T01:18:43.989588" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:43.989652" 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-10-16T01:18:43.849632" elapsed="0.140144"/>
</kw>
<msg time="2026-10-16T01:18:43.989908" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:43.989947" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:43.847871" elapsed="0.142112"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:43.990274" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:43.990054" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.990037" elapsed="0.000308"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:18:43.847728" elapsed="0.142639"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:43.992946" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:43.992862" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.992845" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:43.994113" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:43.994030" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:43.994014" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:43.994544" 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-10-16T01:18:43.994320" elapsed="0.000248"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:43.994936" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:43.994758" elapsed="0.000202"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:44.036174" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:43.995532" elapsed="0.040827"/>
</kw>
<msg time="2026-10-16T01:18:44.036523" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:44.036565" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:43.995113" elapsed="0.041487"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:44.116036" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:44.037236" elapsed="0.078993"/>
</kw>
<msg time="2026-10-16T01:18:44.116390" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:44.116431" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:44.036806" elapsed="0.079660"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:44.116788" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:44.116538" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:44.116520" elapsed="0.000365"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:44.117405" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:44.117067" elapsed="0.000420"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:44.117775" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:44.117546" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:44.117530" elapsed="0.000339"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:44.117900" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:44.120370" 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-10-16T01:18:44.122125" elapsed="0.000474"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:44.123865" 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-10-16T01:18:44.118659" elapsed="0.005584"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:44.118165" elapsed="0.006195"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:43.993773" elapsed="0.130664"/>
</kw>
<msg time="2026-10-16T01:18:44.124517" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:44.124556" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:43.993156" elapsed="0.131437"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:44.124792" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:18:44.124661" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:44.124644" 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-10-16T01:18:44.125182" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:44.125475" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:44.125539" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:18:43.992533" elapsed="0.133090"/>
</kw>
<msg time="2026-10-16T01:18:44.126048" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:44.126091" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:43.990622" elapsed="0.135504"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:44.126412" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:44.126195" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:44.126179" elapsed="0.000304"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:18:43.990485" elapsed="0.136020"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:44.130487" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:44.130402" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:44.130385" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:44.131638" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:44.131555" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:44.131538" elapsed="0.000201"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:44.132106" 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-10-16T01:18:44.131883" elapsed="0.000247"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:44.132564" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:44.132382" elapsed="0.000205"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:44.176306" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:44.133193" elapsed="0.043301"/>
</kw>
<msg time="2026-10-16T01:18:44.176657" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:44.176737" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:44.132779" elapsed="0.043996"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:44.247079" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:44.177377" elapsed="0.069896"/>
</kw>
<msg time="2026-10-16T01:18:44.247436" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:44.247525" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:44.176947" elapsed="0.070619"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:44.247889" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:44.247642" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:44.247619" elapsed="0.000368"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:44.248503" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:44.248164" elapsed="0.000423"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:44.248877" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:44.248647" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:44.248631" elapsed="0.000340"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:44.249002" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:44.251481" 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-10-16T01:18:44.253224" elapsed="0.000499"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:44.254935" elapsed="0.000310"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:18:44.249803" elapsed="0.005507"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:44.249268" elapsed="0.006161"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:44.131300" elapsed="0.124206"/>
</kw>
<msg time="2026-10-16T01:18:44.255588" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:44.255626" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:44.130723" elapsed="0.124940"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:44.256032" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:18:44.255947" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:44.255929" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:18:44.256421" 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-10-16T01:18:44.256776" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:44.256841" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:18:44.130111" elapsed="0.126816"/>
</kw>
<msg time="2026-10-16T01:18:44.257008" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:44.257047" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:44.126781" elapsed="0.130301"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:44.257363" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:44.257149" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:44.257133" elapsed="0.000301"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:18:44.126613" elapsed="0.130842"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:18:43.847563" elapsed="0.409918"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:18:43.845496" elapsed="0.412035"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:18:43.843600" elapsed="0.413981"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:43.843218" elapsed="0.414439"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:18:43.842209" elapsed="0.415630"/>
</kw>
<kw name="Verify Sample Port Is Modified" owner="ClusterOvsdb">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:18:44.260142" 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-10-16T01:18:44.259786" elapsed="0.000382"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:18:44.264688" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:18:44.263386" elapsed="0.001354">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:18:45.273883" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:18:45.270976" elapsed="0.002991">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:18:46.283202" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:18:46.280276" elapsed="0.003008">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:18:47.292674" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:18:47.289653" elapsed="0.003148">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:18:48.302467" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:18:48.299469" elapsed="0.003088">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:18:49.312723" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:18:49.309756" elapsed="0.003066">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<msg time="2026-10-16T01:18:49.313038" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: Variable '${ovsdb_uuid}' not found.</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-10-16T01:18:44.260368" elapsed="5.052949">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: Variable '${ovsdb_uuid}' not found.</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-10-16T01:18:44.259367" elapsed="5.054194">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: Variable '${ovsdb_uuid}' not found.</status>
</kw>
<doc>Verify port is modified in all instances.</doc>
<status status="FAIL" start="2026-10-16T01:18:43.841751" elapsed="5.472142">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: Variable '${ovsdb_uuid}' not found.</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-10-16T01:18:49.317234" elapsed="0.000593"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:18:49.316607" elapsed="0.001335"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:49.320093" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:49.319866" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:49.319821" elapsed="0.000423"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:49.324604" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:49.324416" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:49.324380" elapsed="0.000418"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:18:49.327048" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:18:49.326245" elapsed="0.000859"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:49.328094" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:49.327439" elapsed="0.000709"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:18:49.328239" elapsed="0.000060"/>
</return>
<msg time="2026-10-16T01:18:49.328527" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:18:49.325367" elapsed="0.003218"/>
</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-10-16T01:18:49.334582" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:49.334393" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:49.334355" elapsed="0.000415"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:49.337430" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:49.337244" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:49.337206" elapsed="0.000366"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:49.338459" level="INFO">${karaf_connection_index} = 222</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:18:49.337946" elapsed="0.000569"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:49.339333" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:49.338936" elapsed="0.000452"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:49.378417" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:49.340780" elapsed="0.037901"/>
</kw>
<msg time="2026-10-16T01:18:49.378987" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:49.379045" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:49.339792" elapsed="0.039304"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:49.448442" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:49.379960" elapsed="0.068671"/>
</kw>
<msg time="2026-10-16T01:18:49.448831" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:49.448872" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:49.379324" elapsed="0.069585"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:49.449186" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:49.448979" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:49.448961" elapsed="0.000320"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:49.449840" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:49.449465" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:49.450181" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:49.449985" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:49.449968" elapsed="0.000306"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:49.450304" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:49.452888" elapsed="0.000478"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:18:49.454619" elapsed="0.000513"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:49.456585" elapsed="0.000509"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:18:49.451135" elapsed="0.006028"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:49.450597" elapsed="0.006685"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:49.336604" elapsed="0.120755"/>
</kw>
<msg time="2026-10-16T01:18:49.457441" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:49.457481" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:49.335103" elapsed="0.122414"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:49.457669" elapsed="0.000116"/>
</return>
<status status="PASS" start="2026-10-16T01:18:49.457584" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:49.457567" 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 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-10-16T01:18:49.458169" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:49.458466" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:49.458530" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:18:49.333742" elapsed="0.124874"/>
</kw>
<msg time="2026-10-16T01:18:49.458725" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:49.458768" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:49.329510" elapsed="0.129294"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:49.459092" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:49.458872" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:49.458856" elapsed="0.000307"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:18:49.329199" elapsed="0.129985"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:49.461770" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:49.461659" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:49.461642" 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-10-16T01:18:49.462929" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:49.462844" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:49.462827" elapsed="0.000165"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:49.463359" 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-10-16T01:18:49.463134" elapsed="0.000249"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:49.463771" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:49.463540" elapsed="0.000257"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:49.498083" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:49.464364" elapsed="0.033900"/>
</kw>
<msg time="2026-10-16T01:18:49.498424" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:49.498465" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:49.463950" elapsed="0.034551"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:49.563528" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:49.499128" elapsed="0.064628"/>
</kw>
<msg time="2026-10-16T01:18:49.563955" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:49.563996" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:49.498662" elapsed="0.065371"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:49.564305" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:49.564103" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:49.564085" elapsed="0.000314"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:49.564952" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:49.564582" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:49.565289" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:49.565093" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:49.565076" elapsed="0.000305"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:49.565412" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:49.567904" 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-10-16T01:18:49.569581" elapsed="0.000482"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:49.571236" elapsed="0.000311"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:18:49.566213" elapsed="0.005398"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:49.565683" elapsed="0.006087"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:49.462549" elapsed="0.109298"/>
</kw>
<msg time="2026-10-16T01:18:49.571929" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:49.571969" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:49.461980" elapsed="0.110025"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:49.572157" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:18:49.572073" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:49.572056" elapsed="0.000177"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:18:49.572542" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:49.573166" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:49.573231" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:18:49.461365" elapsed="0.111951"/>
</kw>
<msg time="2026-10-16T01:18:49.573398" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:49.573437" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:49.459429" elapsed="0.114043"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:49.573790" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:49.573538" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:49.573523" elapsed="0.000339"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:18:49.459293" elapsed="0.114590"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:49.576421" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:49.576336" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:49.576318" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:49.577603" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:49.577489" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:49.577473" elapsed="0.000201"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:49.578074" 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-10-16T01:18:49.577850" elapsed="0.000249"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:49.578427" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:49.578257" elapsed="0.000194"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:49.611685" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:49.579076" elapsed="0.032841"/>
</kw>
<msg time="2026-10-16T01:18:49.612077" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:49.612119" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:49.578603" elapsed="0.033551"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:49.672474" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:49.612775" elapsed="0.059884"/>
</kw>
<msg time="2026-10-16T01:18:49.672855" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:49.672895" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:49.612317" elapsed="0.060614"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:49.673206" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:49.673002" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:49.672984" elapsed="0.000315"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:49.673856" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:49.673478" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:49.674199" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:49.674004" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:49.673988" elapsed="0.000304"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:49.674323" elapsed="0.000024"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:49.676840" 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-10-16T01:18:49.678550" elapsed="0.000486"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:49.680288" 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-10-16T01:18:49.675119" elapsed="0.005555"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:49.674586" elapsed="0.006266"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:49.577234" elapsed="0.103696"/>
</kw>
<msg time="2026-10-16T01:18:49.681012" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:49.681052" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:49.576629" elapsed="0.104459"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:49.681240" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:18:49.681156" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:49.681140" elapsed="0.000177"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:18:49.681634" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:49.682246" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:49.682313" 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-10-16T01:18:49.576041" elapsed="0.106358"/>
</kw>
<msg time="2026-10-16T01:18:49.682483" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:49.682522" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:49.574124" elapsed="0.108435"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:49.682881" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:49.682630" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:49.682614" elapsed="0.000340"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:18:49.573990" elapsed="0.108986"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:18:49.328861" elapsed="0.354141"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:18:49.323756" elapsed="0.359298"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:18:49.319235" elapsed="0.363872"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:49.318272" elapsed="0.364877"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:18:49.315816" elapsed="0.367383"/>
</kw>
<kw name="Delete Sample Port And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:18:49.687292" 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-10-16T01:18:49.686064" elapsed="0.001264">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-10-16T01:18:49.314592" elapsed="0.372873">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-10-16T01:18:49.689003" elapsed="0.000200"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:18:49.688754" elapsed="0.000499"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:49.690151" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:49.690065" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:49.690048" elapsed="0.000166"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:49.692107" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:49.692023" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:49.692007" elapsed="0.000162"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:18:49.693082" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:18:49.692753" elapsed="0.000355"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:49.693527" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:49.693258" elapsed="0.000293"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:18:49.693592" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:18:49.693748" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:18:49.692369" elapsed="0.001406"/>
</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-10-16T01:18:49.696280" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:49.696196" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:49.696178" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:49.697472" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:49.697388" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:49.697372" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:49.697942" level="INFO">${karaf_connection_index} = 222</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:18:49.697678" elapsed="0.000327"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:49.698358" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:49.698178" elapsed="0.000204"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:49.731162" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:49.698984" elapsed="0.032418"/>
</kw>
<msg time="2026-10-16T01:18:49.731592" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:49.731634" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:49.698536" elapsed="0.033134"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:49.809247" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:49.732441" elapsed="0.077001"/>
</kw>
<msg time="2026-10-16T01:18:49.809607" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:49.809648" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:49.731901" elapsed="0.077781"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:49.810033" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:49.809806" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:49.809779" elapsed="0.000352"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:49.810661" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:49.810317" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:49.811036" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:49.810840" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:49.810823" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:49.811163" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:49.813829" elapsed="0.000486"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:18:49.815569" elapsed="0.000511"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:49.817286" 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-10-16T01:18:49.812081" elapsed="0.005593"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:49.811494" elapsed="0.006569"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:49.697131" elapsed="0.121012"/>
</kw>
<msg time="2026-10-16T01:18:49.818231" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:49.818272" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:49.696488" elapsed="0.121821"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:49.818466" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:18:49.818382" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:49.818365" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:18:49.818944" 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-10-16T01:18:49.819254" elapsed="0.000075"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:49.819373" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:18:49.695903" elapsed="0.123561"/>
</kw>
<msg time="2026-10-16T01:18:49.819552" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:49.819594" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:49.694101" elapsed="0.125529"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:49.820023" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:49.819789" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:49.819684" elapsed="0.000412"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:18:49.693965" elapsed="0.126153"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:49.822801" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:49.822653" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:49.822635" 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-10-16T01:18:49.823976" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:49.823892" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:49.823875" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:49.824410" 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-10-16T01:18:49.824181" elapsed="0.000254"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:49.824802" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:49.824593" elapsed="0.000234"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:49.863201" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:49.825395" elapsed="0.037983"/>
</kw>
<msg time="2026-10-16T01:18:49.863537" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:49.863579" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:49.824981" elapsed="0.038634"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:49.959771" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:49.864238" elapsed="0.095721"/>
</kw>
<msg time="2026-10-16T01:18:49.960117" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:49.960158" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:49.863815" elapsed="0.096379"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:49.960474" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:49.960267" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:49.960248" elapsed="0.000320"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:49.961124" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:49.960782" elapsed="0.000427"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:49.961464" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:49.961269" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:49.961253" elapsed="0.000304"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:49.961588" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:49.964190" elapsed="0.000474"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:18:49.965977" elapsed="0.000457"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:49.967632" elapsed="0.000550"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:18:49.962431" elapsed="0.005817"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:49.961935" elapsed="0.006429"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:49.823593" elapsed="0.144849"/>
</kw>
<msg time="2026-10-16T01:18:49.968524" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:49.968564" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:49.823014" elapsed="0.145585"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:49.968782" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:18:49.968668" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:49.968651" 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-10-16T01:18:49.969180" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:49.969479" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:49.969542" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:18:49.822349" elapsed="0.147278"/>
</kw>
<msg time="2026-10-16T01:18:49.969769" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:49.969812" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:49.820381" elapsed="0.149464"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:49.970131" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:49.969913" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:49.969897" elapsed="0.000304"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:18:49.820244" elapsed="0.149979"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:49.972830" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:49.972744" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:49.972725" elapsed="0.000169"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:49.973999" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:49.973915" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:49.973898" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:49.974428" 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-10-16T01:18:49.974203" elapsed="0.000250"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:49.974813" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:49.974612" elapsed="0.000226"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:50.007801" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:49.975403" elapsed="0.032611"/>
</kw>
<msg time="2026-10-16T01:18:50.008184" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:50.008225" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:49.974990" elapsed="0.033270"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:50.087597" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:50.008918" elapsed="0.078937"/>
</kw>
<msg time="2026-10-16T01:18:50.088015" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:50.088056" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:50.008423" elapsed="0.079669"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:50.088361" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:50.088160" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.088143" elapsed="0.000312"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:50.089002" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:50.088640" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:50.089342" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:50.089146" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.089130" elapsed="0.000304"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:50.089465" elapsed="0.000024"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:50.091914" 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-10-16T01:18:50.093580" elapsed="0.000480"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:50.095400" 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-10-16T01:18:50.090252" elapsed="0.005550"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:50.089762" elapsed="0.006154"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:49.973620" elapsed="0.122372"/>
</kw>
<msg time="2026-10-16T01:18:50.096073" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:50.096113" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:49.973041" elapsed="0.123107"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:50.096301" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:18:50.096216" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.096200" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:18:50.096692" elapsed="0.000123"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:50.097098" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:50.097163" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:18:49.972418" elapsed="0.124830"/>
</kw>
<msg time="2026-10-16T01:18:50.097332" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:50.097372" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:49.970470" elapsed="0.126937"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:50.097692" elapsed="0.000131"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:50.097474" elapsed="0.000381"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.097459" elapsed="0.000419"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:18:49.970334" elapsed="0.127565"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:18:49.693824" elapsed="0.404103"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:18:49.691725" elapsed="0.406261"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:18:49.689813" elapsed="0.408267"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:49.689396" elapsed="0.408732"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:18:49.688384" elapsed="0.409801"/>
</kw>
<kw name="Delete Sample Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:18:50.102242" 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-10-16T01:18:50.101004" elapsed="0.001275">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-10-16T01:18:49.687845" elapsed="0.414573">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-10-16T01:18:50.103877" elapsed="0.000217"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:18:50.103600" 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-10-16T01:18:50.105067" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:50.104981" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.104964" elapsed="0.000168"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:50.107005" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:50.106922" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.106906" elapsed="0.000161"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:18:50.107994" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:18:50.107629" elapsed="0.000390"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:50.108441" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:50.108171" elapsed="0.000294"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:18:50.108505" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:18:50.108631" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:18:50.107270" elapsed="0.001384"/>
</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-10-16T01:18:50.111237" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:50.111152" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.111134" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:50.112388" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:50.112305" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.112288" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:50.112856" level="INFO">${karaf_connection_index} = 222</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:18:50.112592" elapsed="0.000289"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:50.113232" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:50.113048" elapsed="0.000208"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:50.147053" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:50.113862" elapsed="0.033369"/>
</kw>
<msg time="2026-10-16T01:18:50.147388" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:50.147429" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:50.113411" elapsed="0.034053"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:50.207446" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:50.148082" elapsed="0.059541"/>
</kw>
<msg time="2026-10-16T01:18:50.207839" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:50.207916" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:50.147626" elapsed="0.060327"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:50.208226" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:50.208022" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.208005" elapsed="0.000316"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:50.208877" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:50.208499" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:50.209218" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:50.209021" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.209005" elapsed="0.000306"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:50.209342" elapsed="0.000024"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:50.211915" 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-10-16T01:18:50.213636" elapsed="0.000507"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:50.215511" 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-10-16T01:18:50.210143" elapsed="0.005776"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:50.209616" elapsed="0.006421"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:50.112050" elapsed="0.104064"/>
</kw>
<msg time="2026-10-16T01:18:50.216196" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:50.216236" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:50.111447" elapsed="0.104825"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:50.216424" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:18:50.216341" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.216324" elapsed="0.000176"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:18:50.216910" 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-10-16T01:18:50.217211" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:50.217275" 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-10-16T01:18:50.110862" elapsed="0.106498"/>
</kw>
<msg time="2026-10-16T01:18:50.217442" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:50.217481" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:50.109048" elapsed="0.108470"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:50.217830" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:50.217586" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.217570" elapsed="0.000334"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:18:50.108909" elapsed="0.109016"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:50.221868" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:50.221782" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.221765" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:50.223033" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:50.222949" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.222932" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:50.223499" 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-10-16T01:18:50.223272" elapsed="0.000253"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:50.223890" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:50.223683" elapsed="0.000231"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:50.263113" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:50.224482" elapsed="0.038826"/>
</kw>
<msg time="2026-10-16T01:18:50.263480" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:50.263522" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:50.224069" elapsed="0.039489"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:50.327987" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:50.264225" elapsed="0.063948"/>
</kw>
<msg time="2026-10-16T01:18:50.328337" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:50.328378" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:50.263772" elapsed="0.064642"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:50.328793" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:50.328501" elapsed="0.000367"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.328475" elapsed="0.000422"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:50.329437" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:50.329081" elapsed="0.000435"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:50.329805" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:50.329577" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.329560" elapsed="0.000340"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:50.329935" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:50.332519" 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-10-16T01:18:50.334307" elapsed="0.000531"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:50.336053" 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-10-16T01:18:50.330805" elapsed="0.005638"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:50.330247" elapsed="0.006315"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:50.222653" elapsed="0.113988"/>
</kw>
<msg time="2026-10-16T01:18:50.336778" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:50.336821" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:50.222077" elapsed="0.114780"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:50.337015" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:18:50.336929" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.336913" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:18:50.337427" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:50.337850" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:50.337918" 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-10-16T01:18:50.221457" elapsed="0.116549"/>
</kw>
<msg time="2026-10-16T01:18:50.338095" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:50.338136" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:50.218173" elapsed="0.119999"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:50.338463" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:50.338242" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.338226" elapsed="0.000308"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:18:50.218033" elapsed="0.120523"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:50.341444" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:50.341361" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.341343" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:50.342601" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:50.342518" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.342501" elapsed="0.000164"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:50.343073" 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-10-16T01:18:50.342842" elapsed="0.000256"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:50.343438" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:50.343256" elapsed="0.000206"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:50.378944" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:50.344073" elapsed="0.035047"/>
</kw>
<msg time="2026-10-16T01:18:50.379278" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:50.379320" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:50.343615" elapsed="0.035740"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:50.452413" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:50.379973" elapsed="0.072613"/>
</kw>
<msg time="2026-10-16T01:18:50.452773" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:50.452815" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:50.379517" elapsed="0.073335"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:50.453122" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:50.452921" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.452903" elapsed="0.000312"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:50.453753" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:50.453394" elapsed="0.000436"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:50.454085" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:50.453891" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.453875" elapsed="0.000303"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:50.454209" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:50.456741" 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-10-16T01:18:50.458422" elapsed="0.000538"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:50.460313" elapsed="0.000306"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:18:50.455042" elapsed="0.005642"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:50.454476" elapsed="0.006445"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:50.342261" elapsed="0.118740"/>
</kw>
<msg time="2026-10-16T01:18:50.461083" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:50.461123" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:50.341655" elapsed="0.119504"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:50.461311" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:18:50.461227" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.461211" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:18:50.461728" 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-10-16T01:18:50.462031" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:50.462095" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:18:50.341062" elapsed="0.121118"/>
</kw>
<msg time="2026-10-16T01:18:50.462263" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:50.462303" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:50.339094" elapsed="0.123244"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:50.462620" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:50.462404" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.462389" elapsed="0.000388"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:18:50.338680" elapsed="0.124123"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:18:50.108756" elapsed="0.354075"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:18:50.106608" elapsed="0.356276"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:18:50.104682" elapsed="0.358257"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:50.104289" elapsed="0.358693"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:18:50.103258" elapsed="0.359774"/>
</kw>
<kw name="Kill_Single_Member" owner="ClusterManagement">
<msg time="2026-10-16T01:18:50.464922" 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-10-16T01:18:50.463264" elapsed="0.001696">Variable '${original_candidate}' not found.</status>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${new_cluster_list}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:50.465157" elapsed="0.000020"/>
</kw>
<doc>Kill Owner Instance and verify it is dead</doc>
<status status="FAIL" start="2026-10-16T01:18:50.102794" elapsed="0.362516">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-10-16T01:18:50.466805" elapsed="0.000201"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:18:50.466536" 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-10-16T01:18:50.467954" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:50.467869" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.467852" 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-10-16T01:18:50.469930" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:50.469847" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.469831" elapsed="0.000161"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:18:50.470896" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:18:50.470548" elapsed="0.000373"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:50.471386" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:50.471095" elapsed="0.000316"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:18:50.471452" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:18:50.471579" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:18:50.470194" elapsed="0.001408"/>
</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-10-16T01:18:50.474176" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:50.474093" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.474076" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:50.475320" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:50.475239" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.475223" elapsed="0.000160"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:50.475782" level="INFO">${karaf_connection_index} = 222</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:18:50.475522" elapsed="0.000285"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:50.476139" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:50.475965" elapsed="0.000198"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:50.509218" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:50.476748" elapsed="0.032646"/>
</kw>
<msg time="2026-10-16T01:18:50.509551" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:50.509591" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:50.476315" elapsed="0.033312"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:50.571937" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:50.510252" elapsed="0.061864"/>
</kw>
<msg time="2026-10-16T01:18:50.572272" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:50.572313" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:50.509826" elapsed="0.062523"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:50.572620" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:50.572418" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.572400" elapsed="0.000350"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:50.573267" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:50.572930" elapsed="0.000418"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:50.573603" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:50.573408" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.573392" elapsed="0.000304"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:50.573763" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:50.576250" 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-10-16T01:18:50.577999" elapsed="0.000454"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:50.579642" elapsed="0.000548"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:18:50.574554" elapsed="0.005701"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:50.574031" elapsed="0.006342"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:50.474984" elapsed="0.105465"/>
</kw>
<msg time="2026-10-16T01:18:50.580531" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:50.580570" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:50.474386" elapsed="0.106220"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:50.580794" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:18:50.580673" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.580657" 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 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-10-16T01:18:50.581178" 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-10-16T01:18:50.581472" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:50.581535" 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-10-16T01:18:50.473804" elapsed="0.107817"/>
</kw>
<msg time="2026-10-16T01:18:50.581826" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:50.581872" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:50.471994" elapsed="0.109916"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:50.582195" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:50.581979" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.581963" elapsed="0.000304"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:18:50.471854" elapsed="0.110434"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:50.584804" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:50.584692" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.584675" 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-10-16T01:18:50.585997" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:50.585913" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.585897" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:50.586424" 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-10-16T01:18:50.586200" elapsed="0.000248"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:50.586833" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:50.586606" elapsed="0.000252"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:50.626619" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:50.587468" elapsed="0.039378"/>
</kw>
<msg time="2026-10-16T01:18:50.627000" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:50.627041" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:50.587014" elapsed="0.040062"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:50.704912" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:50.627651" elapsed="0.077473"/>
</kw>
<msg time="2026-10-16T01:18:50.705282" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:50.705323" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:50.627237" elapsed="0.078123"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:50.705629" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:50.705430" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.705412" elapsed="0.000346"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:50.706275" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:50.705940" elapsed="0.000415"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:50.706612" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:50.706415" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.706399" elapsed="0.000343"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:50.706774" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:50.709378" 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-10-16T01:18:50.711125" elapsed="0.000462"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:50.713017" 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-10-16T01:18:50.707557" elapsed="0.005841"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:50.707039" elapsed="0.006476"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:50.585618" elapsed="0.127973"/>
</kw>
<msg time="2026-10-16T01:18:50.713673" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:50.713847" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:50.585015" elapsed="0.128870"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:50.714040" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:18:50.713955" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.713938" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:18:50.714426" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:50.714750" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:50.714816" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:18:50.584404" elapsed="0.130496"/>
</kw>
<msg time="2026-10-16T01:18:50.714981" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:50.715021" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:50.582530" elapsed="0.132526"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:50.715338" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:50.715122" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.715106" elapsed="0.000304"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:18:50.582395" elapsed="0.133036"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:50.717979" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:50.717895" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.717878" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:50.719174" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:50.719091" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.719074" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:50.719601" 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-10-16T01:18:50.719378" elapsed="0.000247"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:50.719986" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:50.719812" elapsed="0.000198"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:50.755359" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:50.720568" elapsed="0.034969"/>
</kw>
<msg time="2026-10-16T01:18:50.755695" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:50.755771" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:50.720164" elapsed="0.035643"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:50.823665" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:50.756434" elapsed="0.067465"/>
</kw>
<msg time="2026-10-16T01:18:50.824055" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:50.824096" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:50.756004" elapsed="0.068128"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:50.824402" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:50.824201" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.824183" elapsed="0.000312"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:50.825046" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:50.824677" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:50.825379" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:50.825184" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.825168" elapsed="0.000304"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:50.825503" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:50.827987" 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-10-16T01:18:50.829729" elapsed="0.000459"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:50.831546" 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-10-16T01:18:50.826292" elapsed="0.005660"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:50.825802" elapsed="0.006267"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:50.718836" elapsed="0.113309"/>
</kw>
<msg time="2026-10-16T01:18:50.832229" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:50.832268" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:50.718225" elapsed="0.114080"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:50.832458" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:18:50.832373" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.832356" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:18:50.832948" elapsed="0.000056"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:50.833288" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:50.833352" 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-10-16T01:18:50.717578" elapsed="0.115859"/>
</kw>
<msg time="2026-10-16T01:18:50.833519" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:50.833559" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:50.715675" elapsed="0.117920"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:50.833920" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:50.833661" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.833645" elapsed="0.000349"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:18:50.715537" elapsed="0.118479"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:18:50.471653" elapsed="0.362390"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:18:50.469523" elapsed="0.364570"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:18:50.467586" elapsed="0.366558"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:50.467201" elapsed="0.366984"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:18:50.466200" elapsed="0.368034"/>
</kw>
<kw name="Check Ovsdb Shards Status After Cluster Event" owner="ClusterOvsdb">
<msg time="2026-10-16T01:18:50.836041" 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-10-16T01:18:50.834416" elapsed="0.001662">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-10-16T01:18:50.465645" elapsed="0.370563">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-10-16T01:18:50.837645" elapsed="0.000239"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:18:50.837403" 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-10-16T01:18:50.838888" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:50.838802" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.838785" elapsed="0.000167"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:50.840808" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:50.840722" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.840681" elapsed="0.000189"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:18:50.841776" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:18:50.841424" elapsed="0.000378"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:50.842220" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:50.841951" elapsed="0.000293"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:18:50.842285" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:18:50.842409" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:18:50.841070" elapsed="0.001362"/>
</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-10-16T01:18:50.844967" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:50.844878" elapsed="0.000132"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.844861" elapsed="0.000170"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:50.846152" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:50.846068" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.846052" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:50.846618" level="INFO">${karaf_connection_index} = 222</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:18:50.846392" elapsed="0.000250"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:50.847009" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:50.846832" elapsed="0.000201"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:50.882853" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:50.847622" elapsed="0.035406"/>
</kw>
<msg time="2026-10-16T01:18:50.883187" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:50.883228" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:50.847187" elapsed="0.036077"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:50.981547" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:50.883883" elapsed="0.097882"/>
</kw>
<msg time="2026-10-16T01:18:50.981925" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:50.981967" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:50.883428" elapsed="0.098575"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:50.982274" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:50.982072" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.982054" elapsed="0.000314"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:50.982937" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:50.982566" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:50.983286" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:50.983092" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.983076" elapsed="0.000302"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:50.983408" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:50.985951" 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-10-16T01:18:50.987661" elapsed="0.000497"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:50.989389" 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-10-16T01:18:50.984243" elapsed="0.005558"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:50.983678" elapsed="0.006242"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:50.845814" elapsed="0.144182"/>
</kw>
<msg time="2026-10-16T01:18:50.990077" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:50.990117" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:50.845178" elapsed="0.144975"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:50.990304" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:18:50.990220" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.990204" elapsed="0.000177"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:18:50.990692" elapsed="0.000342"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:50.991353" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:50.991417" 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-10-16T01:18:50.844564" elapsed="0.146940"/>
</kw>
<msg time="2026-10-16T01:18:50.991587" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:50.991625" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:50.842785" elapsed="0.148876"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:50.991977" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:50.991756" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.991740" elapsed="0.000308"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:18:50.842620" elapsed="0.149449"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:50.994568" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:50.994484" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.994467" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:50.995777" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:50.995649" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:50.995632" elapsed="0.000209"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:50.996212" 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-10-16T01:18:50.995988" elapsed="0.000249"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:50.996565" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:50.996394" elapsed="0.000195"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:51.036461" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:50.997184" elapsed="0.039469"/>
</kw>
<msg time="2026-10-16T01:18:51.036856" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:51.036898" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:50.996772" elapsed="0.040162"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:51.160094" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:51.037565" elapsed="0.122719"/>
</kw>
<msg time="2026-10-16T01:18:51.160443" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:51.160484" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:51.037115" elapsed="0.123405"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:51.160852" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:51.160595" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:51.160575" elapsed="0.000375"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:51.161470" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:51.161132" elapsed="0.000428"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:51.161850" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:51.161620" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:51.161604" elapsed="0.000381"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:51.162020" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:51.164592" 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-10-16T01:18:51.166410" elapsed="0.000505"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:51.168137" 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-10-16T01:18:51.162859" elapsed="0.005662"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:51.162315" elapsed="0.006328"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:50.995394" elapsed="0.173529"/>
</kw>
<msg time="2026-10-16T01:18:51.169011" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:51.169051" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:50.994808" elapsed="0.174279"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:51.169243" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:18:51.169158" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:51.169141" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:18:51.169644" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:51.169980" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:51.170044" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:18:50.994194" elapsed="0.175936"/>
</kw>
<msg time="2026-10-16T01:18:51.170337" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:51.170379" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:50.992313" elapsed="0.178101"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:51.170837" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:51.170482" elapsed="0.000407"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:51.170466" elapsed="0.000446"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:18:50.992177" elapsed="0.178756"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:51.173484" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:51.173402" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:51.173385" elapsed="0.000161"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:51.174637" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:51.174554" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:51.174537" elapsed="0.000198"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:51.175112" 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-10-16T01:18:51.174883" elapsed="0.000253"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:51.175472" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:51.175296" elapsed="0.000200"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:51.210673" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:51.176118" elapsed="0.034770"/>
</kw>
<msg time="2026-10-16T01:18:51.211055" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:51.211097" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:51.175648" elapsed="0.035484"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:51.307315" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:51.211802" elapsed="0.095736"/>
</kw>
<msg time="2026-10-16T01:18:51.307775" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:51.307820" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:51.211296" elapsed="0.096562"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:51.308213" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:51.307972" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:51.307942" elapsed="0.000372"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:51.308936" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:51.308520" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:51.309284" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:51.309087" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:51.309070" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:51.309415" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:51.312008" elapsed="0.000479"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:18:51.313779" elapsed="0.000469"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:51.315461" elapsed="0.000583"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:18:51.310259" elapsed="0.005854"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:51.309747" elapsed="0.006483"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:51.174301" elapsed="0.142008"/>
</kw>
<msg time="2026-10-16T01:18:51.316394" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:51.316433" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:51.173694" elapsed="0.142773"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:51.316620" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:18:51.316536" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:51.316520" 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-10-16T01:18:51.317057" 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-10-16T01:18:51.317362" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:51.317427" 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-10-16T01:18:51.173109" elapsed="0.144405"/>
</kw>
<msg time="2026-10-16T01:18:51.317600" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:51.317640" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:51.171189" elapsed="0.146487"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:51.318066" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:51.317848" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:51.317830" elapsed="0.000349"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:18:51.171051" elapsed="0.147153"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:18:50.842480" elapsed="0.475758"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:18:50.840409" elapsed="0.477888"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:18:50.838502" elapsed="0.479852"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:50.838101" elapsed="0.480298"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:18:50.837066" elapsed="0.481387"/>
</kw>
<kw name="Get Ovsdb Entity Owner Status For One Device" owner="ClusterOvsdb">
<msg time="2026-10-16T01:18:51.322464" level="FAIL">Variable '${ovsdb_uuid}' 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-10-16T01:18:51.321244" elapsed="0.001256">Variable '${ovsdb_uuid}' 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-10-16T01:18:51.322677" elapsed="0.000046"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${new_owner}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:51.322908" elapsed="0.000019"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${new_candidate}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:51.323095" elapsed="0.000018"/>
</kw>
<doc>Check Entity Owner Status and identify owner and candidate.</doc>
<status status="FAIL" start="2026-10-16T01:18:50.836494" elapsed="0.486754">Variable '${ovsdb_uuid}' 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-10-16T01:18:51.324771" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:18:51.324495" 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-10-16T01:18:51.325936" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:51.325850" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:51.325833" elapsed="0.000167"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:51.327895" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:51.327812" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:51.327796" elapsed="0.000163"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:18:51.328866" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:18:51.328512" elapsed="0.000380"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:51.329317" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:51.329043" elapsed="0.000298"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:18:51.329382" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:18:51.329507" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:18:51.328159" elapsed="0.001371"/>
</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-10-16T01:18:51.332119" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:51.332036" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:51.332019" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:51.333277" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:51.333195" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:51.333179" elapsed="0.000161"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:51.333735" level="INFO">${karaf_connection_index} = 222</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:18:51.333481" elapsed="0.000281"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:51.334102" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:51.333923" elapsed="0.000203"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:51.367194" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:51.334733" elapsed="0.032690"/>
</kw>
<msg time="2026-10-16T01:18:51.367606" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:51.367647" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:51.334280" elapsed="0.033402"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:51.446489" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:51.368319" elapsed="0.078353"/>
</kw>
<msg time="2026-10-16T01:18:51.446868" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:51.446909" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:51.367882" elapsed="0.079064"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:51.447227" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:51.447020" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:51.447000" elapsed="0.000320"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:51.447868" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:51.447496" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:51.448208" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:51.448012" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:51.447996" elapsed="0.000304"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:51.448333" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:51.450891" elapsed="0.000478"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:18:51.452608" elapsed="0.000502"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:51.454324" 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-10-16T01:18:51.449148" elapsed="0.005817"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:51.448612" elapsed="0.006478"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:51.332940" elapsed="0.122229"/>
</kw>
<msg time="2026-10-16T01:18:51.455250" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:51.455289" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:51.332328" elapsed="0.122998"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:51.455480" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:18:51.455395" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:51.455378" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:18:51.455906" 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-10-16T01:18:51.456207" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:51.456270" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:18:51.331739" elapsed="0.124615"/>
</kw>
<msg time="2026-10-16T01:18:51.456438" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:51.456477" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:51.329926" elapsed="0.126587"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:51.456902" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:51.456617" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:51.456600" elapsed="0.000375"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:18:51.329785" elapsed="0.127212"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:51.461006" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:51.460922" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:51.460904" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:51.462206" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:51.462123" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:51.462107" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:51.462635" 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-10-16T01:18:51.462411" elapsed="0.000248"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:51.463028" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:51.462850" elapsed="0.000202"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:51.499501" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:51.463615" elapsed="0.036066"/>
</kw>
<msg time="2026-10-16T01:18:51.499874" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:51.499915" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:51.463205" elapsed="0.036746"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:51.585958" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:51.500533" elapsed="0.085607"/>
</kw>
<msg time="2026-10-16T01:18:51.586301" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:51.586344" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:51.500113" elapsed="0.086266"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:51.586648" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:51.586447" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:51.586430" elapsed="0.000350"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:51.587296" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:51.586959" elapsed="0.000420"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:51.587634" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:51.587439" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:51.587422" elapsed="0.000340"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:51.587793" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:51.590266" 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-10-16T01:18:51.592024" elapsed="0.000454"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:51.593687" elapsed="0.000570"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:18:51.588561" elapsed="0.005763"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:51.588075" elapsed="0.006398"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:51.461867" elapsed="0.132683"/>
</kw>
<msg time="2026-10-16T01:18:51.594631" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:51.594670" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:51.461221" elapsed="0.133513"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:51.594892" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:18:51.594806" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:51.594789" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:18:51.595276" elapsed="0.000022"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:51.595565" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:51.595628" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:18:51.460600" elapsed="0.135218"/>
</kw>
<msg time="2026-10-16T01:18:51.595906" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:51.595945" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:51.457248" elapsed="0.138731"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:51.596259" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:51.596046" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:51.596030" elapsed="0.000300"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:18:51.457111" elapsed="0.139240"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:51.659090" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:51.658932" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:51.658895" elapsed="0.000311"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:51.661054" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:51.660934" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:51.660909" elapsed="0.000235"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:51.661697" 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-10-16T01:18:51.661348" elapsed="0.000440"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:51.662302" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:51.662049" elapsed="0.000286"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:51.696188" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:51.663183" elapsed="0.033185"/>
</kw>
<msg time="2026-10-16T01:18:51.696545" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:51.696587" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:51.662551" elapsed="0.034070"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:51.774226" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:51.697249" elapsed="0.077176"/>
</kw>
<msg time="2026-10-16T01:18:51.774587" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:51.774628" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:51.696824" elapsed="0.077840"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:51.775068" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:51.774844" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:51.774821" elapsed="0.000347"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:51.775740" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:51.775352" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:51.776084" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:51.775888" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:51.775871" elapsed="0.000306"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:51.776208" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:51.778827" 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-10-16T01:18:51.780564" elapsed="0.000526"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:51.782337" 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-10-16T01:18:51.777087" elapsed="0.005840"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:51.776523" elapsed="0.006524"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:51.660494" elapsed="0.122631"/>
</kw>
<msg time="2026-10-16T01:18:51.783209" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:51.783250" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:51.659472" elapsed="0.123813"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:51.783439" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:18:51.783354" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:51.783337" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:18:51.783876" 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-10-16T01:18:51.784179" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:51.784243" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:18:51.658292" elapsed="0.126036"/>
</kw>
<msg time="2026-10-16T01:18:51.784416" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:51.784456" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:51.596592" elapsed="0.187899"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:51.784923" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:51.784560" elapsed="0.000416"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:51.784544" elapsed="0.000455"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:18:51.596457" elapsed="0.188576"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:18:51.329582" elapsed="0.455486"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:18:51.327496" elapsed="0.457632"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:18:51.325561" elapsed="0.459623"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:51.325171" elapsed="0.460056"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:18:51.324161" elapsed="0.461119"/>
</kw>
<kw name="Create Sample Bridge Manually And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:18:51.788243" 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-10-16T01:18:51.786948" elapsed="0.001332">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-10-16T01:18:51.323581" elapsed="0.464844">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-10-16T01:18:51.790214" elapsed="0.000378"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:18:51.789970" elapsed="0.000675"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:51.791676" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:51.791588" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:51.791571" 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-10-16T01:18:51.793755" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:51.793644" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:51.793627" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:18:51.794730" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:18:51.794379" elapsed="0.000379"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:51.795178" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:51.794910" elapsed="0.000292"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:18:51.795243" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:18:51.795369" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:18:51.794024" elapsed="0.001367"/>
</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-10-16T01:18:51.797934" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:51.797850" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:51.797832" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:51.799107" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:51.799024" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:51.799007" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:51.799538" level="INFO">${karaf_connection_index} = 222</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:18:51.799312" elapsed="0.000250"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:51.799932" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:51.799750" elapsed="0.000206"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:51.832227" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:51.800518" elapsed="0.031880"/>
</kw>
<msg time="2026-10-16T01:18:51.832573" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:51.832614" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:51.800108" elapsed="0.032541"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:51.902415" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:51.833262" elapsed="0.069814"/>
</kw>
<msg time="2026-10-16T01:18:51.903499" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:51.903593" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:51.832843" elapsed="0.070827"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:51.904541" elapsed="0.000151"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:51.903967" elapsed="0.000897"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:51.903901" elapsed="0.001027"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:51.906289" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:51.905342" elapsed="0.001135"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:51.907114" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:51.906615" elapsed="0.000657"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:51.906578" elapsed="0.000747"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:51.907399" elapsed="0.000072"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:51.913226" elapsed="0.000759"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:18:51.915776" elapsed="0.000692"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:51.918269" 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-10-16T01:18:51.909552" elapsed="0.009286"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:51.908271" elapsed="0.010736"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:51.798767" elapsed="0.120349"/>
</kw>
<msg time="2026-10-16T01:18:51.919236" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:51.919293" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:51.798152" elapsed="0.121190"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:51.919558" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-10-16T01:18:51.919439" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:51.919416" 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 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-10-16T01:18:51.920211" elapsed="0.000035"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:51.920642" elapsed="0.000032"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:51.920957" 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-10-16T01:18:51.797530" elapsed="0.123556"/>
</kw>
<msg time="2026-10-16T01:18:51.921206" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:51.921262" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:51.795758" elapsed="0.125557"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:51.921754" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:51.921413" elapsed="0.000413"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:51.921391" elapsed="0.000467"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:18:51.795591" elapsed="0.126299"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:51.925758" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:51.925606" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:51.925581" elapsed="0.000267"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:51.927386" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:51.927270" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:51.927246" elapsed="0.000228"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:51.928039" 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-10-16T01:18:51.927673" elapsed="0.000400"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:51.928597" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:51.928344" elapsed="0.000286"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:51.968099" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:51.929456" elapsed="0.038836"/>
</kw>
<msg time="2026-10-16T01:18:51.968447" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:51.968488" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:51.928881" elapsed="0.039642"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:52.054692" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:51.969169" elapsed="0.085729"/>
</kw>
<msg time="2026-10-16T01:18:52.055058" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:52.055099" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:51.968687" elapsed="0.086447"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:52.055407" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:52.055204" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:52.055186" elapsed="0.000315"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:52.056078" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:52.055733" elapsed="0.000429"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:52.056417" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:52.056223" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:52.056207" elapsed="0.000302"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:52.056539" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:52.059070" 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-10-16T01:18:52.060824" elapsed="0.000454"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:52.062472" elapsed="0.000552"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:18:52.057359" elapsed="0.005731"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:52.056866" elapsed="0.006340"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:51.926910" elapsed="0.136373"/>
</kw>
<msg time="2026-10-16T01:18:52.063364" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:52.063404" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:51.926054" elapsed="0.137384"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:52.063590" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:18:52.063506" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:52.063489" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:18:52.064013" 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-10-16T01:18:52.064309" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:52.064405" 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-10-16T01:18:51.925184" elapsed="0.139310"/>
</kw>
<msg time="2026-10-16T01:18:52.064578" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:52.064617" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:51.922259" elapsed="0.142391"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:52.064999" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:52.064781" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:52.064762" elapsed="0.000308"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:18:51.922060" elapsed="0.143031"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:52.067621" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:52.067537" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:52.067520" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:52.069172" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:52.069079" elapsed="0.000135"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:52.069063" elapsed="0.000172"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:52.069595" 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-10-16T01:18:52.069374" elapsed="0.000245"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:52.069986" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:52.069811" elapsed="0.000199"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:52.103432" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:52.070564" elapsed="0.033066"/>
</kw>
<msg time="2026-10-16T01:18:52.103829" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:52.103870" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:52.070161" elapsed="0.033743"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:52.175678" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:52.104486" elapsed="0.071610"/>
</kw>
<msg time="2026-10-16T01:18:52.176395" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:52.176454" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:52.104066" elapsed="0.072436"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:52.177111" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:52.176651" elapsed="0.000566"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:52.176609" elapsed="0.000648"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:52.178157" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:52.177512" elapsed="0.000764"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:52.178636" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:52.178361" elapsed="0.000419"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:52.178338" elapsed="0.000476"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:52.178863" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:52.182776" 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-10-16T01:18:52.185336" elapsed="0.000717"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:52.187835" 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-10-16T01:18:52.180254" elapsed="0.008124"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:52.179353" elapsed="0.009190"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:52.068823" elapsed="0.119828"/>
</kw>
<msg time="2026-10-16T01:18:52.188811" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:52.188867" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:52.068156" elapsed="0.120760"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:52.189136" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-10-16T01:18:52.189016" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:52.188992" 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 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-10-16T01:18:52.189763" elapsed="0.000037"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:52.190205" elapsed="0.000032"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:52.190294" 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-10-16T01:18:52.067246" elapsed="0.123172"/>
</kw>
<msg time="2026-10-16T01:18:52.190539" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:52.190595" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:52.065334" elapsed="0.125310"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:52.191282" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:52.190974" elapsed="0.000376"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:52.190949" elapsed="0.000432"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:18:52.065200" elapsed="0.126212"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:18:51.795444" elapsed="0.396012"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:18:51.793348" elapsed="0.398189"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:18:51.791294" elapsed="0.400316"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:51.790821" elapsed="0.400847"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:18:51.789573" elapsed="0.402211"/>
</kw>
<kw name="Add Sample Port To The Manual Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:18:52.196006" 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-10-16T01:18:52.194033" elapsed="0.002023">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-10-16T01:18:51.788992" elapsed="0.407249">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-10-16T01:18:52.198290" elapsed="0.000282"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:18:52.197943" elapsed="0.000698"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:52.199927" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:52.199807" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:52.199783" elapsed="0.000234"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:52.202124" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:52.202041" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:52.202025" elapsed="0.000162"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:18:52.203168" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:18:52.202836" elapsed="0.000358"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:52.203615" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:52.203344" elapsed="0.000295"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:18:52.203680" elapsed="0.000055"/>
</return>
<msg time="2026-10-16T01:18:52.203839" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:18:52.202390" elapsed="0.001472"/>
</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-10-16T01:18:52.206370" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:52.206285" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:52.206267" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:52.207524" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:52.207441" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:52.207425" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:52.207999" level="INFO">${karaf_connection_index} = 222</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:18:52.207767" elapsed="0.000256"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:52.208360" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:52.208183" elapsed="0.000202"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:52.243054" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:52.208999" elapsed="0.034226"/>
</kw>
<msg time="2026-10-16T01:18:52.243378" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:52.243439" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:52.208537" elapsed="0.034938"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:52.325579" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:52.244124" elapsed="0.081676"/>
</kw>
<msg time="2026-10-16T01:18:52.325958" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:52.325999" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:52.243636" elapsed="0.082398"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:52.326303" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:52.326102" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:52.326085" elapsed="0.000312"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:52.326947" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:52.326577" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:52.327290" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:52.327096" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:52.327080" elapsed="0.000303"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:52.327413" elapsed="0.000024"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:52.329898" elapsed="0.000474"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:18:52.331598" elapsed="0.000536"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:52.333411" 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-10-16T01:18:52.328205" elapsed="0.005641"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:52.327678" elapsed="0.006285"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:52.207186" elapsed="0.126854"/>
</kw>
<msg time="2026-10-16T01:18:52.334121" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:52.334160" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:52.206580" elapsed="0.127615"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:52.334346" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:18:52.334262" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:52.334246" elapsed="0.000177"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:18:52.334898" 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-10-16T01:18:52.335194" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:52.335258" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:18:52.205991" elapsed="0.129352"/>
</kw>
<msg time="2026-10-16T01:18:52.335425" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:52.335464" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:52.204198" elapsed="0.131300"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:52.335818" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:52.335565" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:52.335549" elapsed="0.000344"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:18:52.204060" elapsed="0.131854"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:52.338468" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:52.338384" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:52.338366" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:52.339616" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:52.339533" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:52.339516" elapsed="0.000164"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:52.340081" 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-10-16T01:18:52.339857" elapsed="0.000249"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:52.340435" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:52.340263" elapsed="0.000196"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:52.375902" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:52.341061" elapsed="0.035033"/>
</kw>
<msg time="2026-10-16T01:18:52.376250" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:52.376291" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:52.340612" elapsed="0.035714"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:52.482018" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:52.376944" elapsed="0.105260"/>
</kw>
<msg time="2026-10-16T01:18:52.482402" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:52.482444" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:52.376490" elapsed="0.105989"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:52.482789" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:52.482550" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:52.482531" elapsed="0.000355"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:52.483399" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:52.483063" elapsed="0.000421"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:52.483769" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:52.483544" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:52.483528" elapsed="0.000336"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:52.483894" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:52.486477" 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-10-16T01:18:52.488281" elapsed="0.000509"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:52.490171" elapsed="0.000308"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:18:52.484810" elapsed="0.005735"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:52.484160" elapsed="0.006502"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:52.339281" elapsed="0.151490"/>
</kw>
<msg time="2026-10-16T01:18:52.490855" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:52.490894" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:52.338676" elapsed="0.152253"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:52.491082" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:18:52.490997" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:52.490981" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:18:52.491472" 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-10-16T01:18:52.491874" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:52.491940" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:18:52.338094" elapsed="0.153930"/>
</kw>
<msg time="2026-10-16T01:18:52.492108" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:52.492147" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:52.336169" elapsed="0.156012"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:52.492463" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:52.492250" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:52.492234" elapsed="0.000301"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:18:52.336030" elapsed="0.156525"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:52.495106" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:52.495022" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:52.495005" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:52.496292" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:52.496210" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:52.496193" elapsed="0.000161"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:52.496748" 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-10-16T01:18:52.496493" elapsed="0.000282"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:52.497105" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:52.496933" elapsed="0.000196"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:52.530305" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:52.497688" elapsed="0.032794"/>
</kw>
<msg time="2026-10-16T01:18:52.530639" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:52.530680" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:52.497281" elapsed="0.033468"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:52.607491" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:52.531337" elapsed="0.076347"/>
</kw>
<msg time="2026-10-16T01:18:52.607897" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:52.607942" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:52.530914" elapsed="0.077063"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:52.608272" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:52.608062" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:52.608038" elapsed="0.000339"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:52.608952" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:52.608558" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:52.609297" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:52.609098" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:52.609082" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:52.609421" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:52.611931" elapsed="0.000479"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:18:52.613645" elapsed="0.000490"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:52.615502" 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-10-16T01:18:52.610217" elapsed="0.005693"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:52.609686" elapsed="0.006344"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:52.495953" elapsed="0.120154"/>
</kw>
<msg time="2026-10-16T01:18:52.616191" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:52.616232" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:52.495314" elapsed="0.120953"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:52.616421" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:18:52.616336" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:52.616319" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:18:52.616942" 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-10-16T01:18:52.617243" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:52.617307" 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-10-16T01:18:52.494733" elapsed="0.122660"/>
</kw>
<msg time="2026-10-16T01:18:52.617477" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:52.617516" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:52.492833" elapsed="0.124718"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:52.617862" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:52.617617" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:52.617601" elapsed="0.000333"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:18:52.492663" elapsed="0.125293"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:18:52.203914" elapsed="0.414069"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:18:52.201750" elapsed="0.416284"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:18:52.199417" elapsed="0.418669"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:52.198879" elapsed="0.419249"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:18:52.197373" elapsed="0.420803"/>
</kw>
<kw name="Delete Sample Bridge Manually And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:18:52.621048" 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-10-16T01:18:52.619778" elapsed="0.001304">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-10-16T01:18:52.196638" elapsed="0.424570">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-10-16T01:18:52.622661" elapsed="0.000230"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:18:52.622420" 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-10-16T01:18:52.623826" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:52.623738" elapsed="0.000131"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:52.623694" 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-10-16T01:18:52.625756" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:52.625645" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:52.625628" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:18:52.626688" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:18:52.626366" elapsed="0.000384"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:52.627197" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:52.626923" elapsed="0.000299"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:18:52.627263" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:18:52.627388" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:18:52.626019" elapsed="0.001392"/>
</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-10-16T01:18:52.629927" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:52.629843" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:52.629826" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:52.631173" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:52.631090" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:52.631073" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:52.631601" level="INFO">${karaf_connection_index} = 222</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:18:52.631377" elapsed="0.000249"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:52.631989" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:52.631814" elapsed="0.000200"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:52.665121" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:52.632576" elapsed="0.032725"/>
</kw>
<msg time="2026-10-16T01:18:52.665478" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:52.665520" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:52.632166" elapsed="0.033388"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:52.754199" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:52.666173" elapsed="0.088215"/>
</kw>
<msg time="2026-10-16T01:18:52.754545" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:52.754587" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:52.665753" elapsed="0.088869"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:52.754929" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:52.754690" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:52.754672" elapsed="0.000352"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:52.755535" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:52.755202" elapsed="0.000416"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:52.755911" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:52.755678" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:52.755662" elapsed="0.000342"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:52.756034" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:52.758503" 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-10-16T01:18:52.760244" elapsed="0.000490"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:52.761948" elapsed="0.000309"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:18:52.756837" elapsed="0.005486"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:52.756297" elapsed="0.006145"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:52.630801" elapsed="0.131718"/>
</kw>
<msg time="2026-10-16T01:18:52.762601" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:52.762640" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:52.630136" elapsed="0.132538"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:52.763042" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:18:52.762956" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:52.762938" elapsed="0.000181"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:18:52.763432" 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-10-16T01:18:52.763835" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:52.763900" 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-10-16T01:18:52.629529" elapsed="0.134458"/>
</kw>
<msg time="2026-10-16T01:18:52.764070" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:52.764109" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:52.627765" elapsed="0.136379"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:52.764428" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:52.764211" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:52.764195" elapsed="0.000304"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:18:52.627595" elapsed="0.136926"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:52.767101" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:52.767017" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:52.767000" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:52.768260" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:52.768177" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:52.768161" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:52.768689" 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-10-16T01:18:52.768466" elapsed="0.000279"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:52.769081" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:52.768906" elapsed="0.000198"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:52.806930" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:52.769668" elapsed="0.037438"/>
</kw>
<msg time="2026-10-16T01:18:52.807280" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:52.807321" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:52.769255" elapsed="0.038101"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:52.889372" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:52.807979" elapsed="0.081591"/>
</kw>
<msg time="2026-10-16T01:18:52.889773" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:52.889817" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:52.807519" elapsed="0.082334"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:52.890128" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:52.889924" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:52.889906" elapsed="0.000317"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:52.890768" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:52.890401" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:52.891110" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:52.890915" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:52.890899" elapsed="0.000339"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:52.891270" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:52.893761" elapsed="0.000477"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:18:52.895462" elapsed="0.000484"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:52.897135" elapsed="0.000306"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:18:52.892065" elapsed="0.005443"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:52.891536" elapsed="0.006090"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:52.767921" elapsed="0.130059"/>
</kw>
<msg time="2026-10-16T01:18:52.898068" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:52.898107" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:52.767308" elapsed="0.130835"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:52.898296" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:18:52.898212" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:52.898195" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:18:52.898683" elapsed="0.000051"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:52.899009" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:52.899073" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:18:52.766727" elapsed="0.132430"/>
</kw>
<msg time="2026-10-16T01:18:52.899240" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:52.899280" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:52.764893" elapsed="0.134422"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:52.899598" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:52.899383" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:52.899367" elapsed="0.000302"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:18:52.764631" elapsed="0.135059"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:52.903268" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:52.903184" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:52.903167" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:52.904417" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:52.904335" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:52.904318" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:52.904884" 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-10-16T01:18:52.904621" elapsed="0.000287"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:52.905239" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:52.905067" elapsed="0.000196"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:52.938670" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:52.905857" elapsed="0.033016"/>
</kw>
<msg time="2026-10-16T01:18:52.939030" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:52.939071" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:52.905414" elapsed="0.033692"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:53.022444" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:52.939776" elapsed="0.082852"/>
</kw>
<msg time="2026-10-16T01:18:53.022822" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:53.022863" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:52.939309" elapsed="0.083588"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:53.023165" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:53.022965" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.022947" elapsed="0.000312"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:53.023802" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:53.023436" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:53.024140" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:53.023945" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.023929" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:53.024273" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:53.026744" elapsed="0.000473"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:18:53.028445" elapsed="0.000523"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:53.030359" elapsed="0.000309"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:18:53.025059" elapsed="0.005706"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:53.024537" elapsed="0.006348"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:52.904079" elapsed="0.126883"/>
</kw>
<msg time="2026-10-16T01:18:53.031044" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:53.031083" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:52.903478" elapsed="0.127639"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:53.031268" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:18:53.031185" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.031169" elapsed="0.000175"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:18:53.031649" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:53.032005" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:53.032069" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:18:52.902892" elapsed="0.129260"/>
</kw>
<msg time="2026-10-16T01:18:53.032234" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:53.032273" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:52.900021" elapsed="0.132287"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:53.032587" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:53.032374" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.032358" elapsed="0.000333"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:18:52.899884" elapsed="0.132884"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:18:52.627458" elapsed="0.405338"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:18:52.625355" elapsed="0.407490"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:18:52.623464" elapsed="0.409430"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:52.623084" elapsed="0.409850"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:18:52.622084" elapsed="0.410896"/>
</kw>
<kw name="Create Sample Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:18:53.036963" 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-10-16T01:18:53.035819" elapsed="0.001178">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-10-16T01:18:52.621534" elapsed="0.415593">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-10-16T01:18:53.038555" elapsed="0.000227"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:18:53.038311" 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-10-16T01:18:53.039687" elapsed="0.000071"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:53.039604" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.039586" elapsed="0.000226"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:53.041630" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:53.041549" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.041532" elapsed="0.000161"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:18:53.042599" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:18:53.042280" elapsed="0.000344"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:53.043075" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:53.042803" elapsed="0.000295"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:18:53.043139" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:18:53.043263" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:18:53.041932" elapsed="0.001353"/>
</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-10-16T01:18:53.045778" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:53.045664" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.045647" 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-10-16T01:18:53.046931" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:53.046849" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.046832" elapsed="0.000161"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:53.047357" level="INFO">${karaf_connection_index} = 222</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:18:53.047135" elapsed="0.000246"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:53.047745" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:53.047541" elapsed="0.000231"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:53.084218" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:53.048332" elapsed="0.036064"/>
</kw>
<msg time="2026-10-16T01:18:53.084554" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:53.084595" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:53.047924" elapsed="0.036705"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:53.162135" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:53.085297" elapsed="0.077020"/>
</kw>
<msg time="2026-10-16T01:18:53.162475" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:53.162516" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:53.084873" elapsed="0.077677"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:53.162869" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:53.162618" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.162601" elapsed="0.000363"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:53.163475" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:53.163142" elapsed="0.000414"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:53.163852" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:53.163616" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.163600" elapsed="0.000347"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:53.163977" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:53.166428" 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-10-16T01:18:53.168151" elapsed="0.000453"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:53.169820" elapsed="0.000309"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:18:53.164762" elapsed="0.005432"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:53.164242" elapsed="0.006071"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:53.046556" elapsed="0.123833"/>
</kw>
<msg time="2026-10-16T01:18:53.170470" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:53.170509" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:53.045988" elapsed="0.124555"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:53.170726" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-10-16T01:18:53.170611" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.170594" 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 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-10-16T01:18:53.171116" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:53.171422" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:53.171487" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:18:53.045378" elapsed="0.126192"/>
</kw>
<msg time="2026-10-16T01:18:53.171652" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:53.171691" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:53.043606" elapsed="0.128480"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:53.172376" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:53.172157" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.172141" elapsed="0.000307"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:18:53.043471" elapsed="0.129031"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:53.175033" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:53.174948" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.174931" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:53.176187" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:53.176104" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.176088" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:53.176616" 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-10-16T01:18:53.176392" elapsed="0.000249"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:53.177008" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:53.176831" elapsed="0.000201"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:53.212503" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:53.177593" elapsed="0.035085"/>
</kw>
<msg time="2026-10-16T01:18:53.212870" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:53.212910" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:53.177184" elapsed="0.035761"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:53.288225" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:53.213526" elapsed="0.074886"/>
</kw>
<msg time="2026-10-16T01:18:53.288582" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:53.288625" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:53.213106" elapsed="0.075555"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:53.288980" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:53.288768" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.288749" elapsed="0.000329"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:53.289614" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:53.289264" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:53.289997" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:53.289797" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.289780" elapsed="0.000319"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:53.290130" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:53.292597" 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-10-16T01:18:53.294375" elapsed="0.000497"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:53.296253" elapsed="0.000306"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:18:53.290929" elapsed="0.005695"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:53.290396" elapsed="0.006379"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:53.175851" elapsed="0.121001"/>
</kw>
<msg time="2026-10-16T01:18:53.296934" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:53.296974" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:53.175242" elapsed="0.121768"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:53.297199" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:18:53.297114" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.297096" elapsed="0.000182"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:18:53.297588" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:53.297986" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:53.298053" 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-10-16T01:18:53.174609" elapsed="0.123531"/>
</kw>
<msg time="2026-10-16T01:18:53.298225" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:53.298265" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:53.172782" elapsed="0.125518"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:53.298585" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:53.298369" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.298352" elapsed="0.000305"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:18:53.172616" elapsed="0.126063"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:53.301231" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:53.301146" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.301128" elapsed="0.000169"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:53.302393" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:53.302308" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.302291" elapsed="0.000165"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:53.302869" 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-10-16T01:18:53.302600" elapsed="0.000295"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:53.303229" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:53.303055" elapsed="0.000198"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:53.336590" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:53.303874" elapsed="0.032946"/>
</kw>
<msg time="2026-10-16T01:18:53.336988" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:53.337030" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:53.303406" elapsed="0.033660"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:53.411120" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:53.337656" elapsed="0.073644"/>
</kw>
<msg time="2026-10-16T01:18:53.411458" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:53.411500" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:53.337229" elapsed="0.074306"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:53.411842" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:53.411603" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.411585" elapsed="0.000353"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:53.412456" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:53.412117" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:53.412869" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:53.412634" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.412618" elapsed="0.000347"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:53.412996" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:53.415483" 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-10-16T01:18:53.417231" elapsed="0.000457"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:53.419113" 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-10-16T01:18:53.413807" elapsed="0.005686"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:53.413261" elapsed="0.006350"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:53.302052" elapsed="0.117635"/>
</kw>
<msg time="2026-10-16T01:18:53.419800" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:53.419841" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:53.301446" elapsed="0.118431"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:53.420031" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:18:53.419946" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.419929" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:18:53.420420" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:53.420818" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:53.420885" 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-10-16T01:18:53.300854" elapsed="0.120117"/>
</kw>
<msg time="2026-10-16T01:18:53.421055" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:53.421096" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:53.298955" elapsed="0.122176"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:53.421415" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:53.421198" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.421182" elapsed="0.000305"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:18:53.298818" elapsed="0.122691"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:18:53.043333" elapsed="0.378202"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:18:53.041259" elapsed="0.380327"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:18:53.039354" elapsed="0.382284"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:53.038978" elapsed="0.382701"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:18:53.037960" elapsed="0.383798"/>
</kw>
<kw name="Create Sample Port And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:18:53.425770" 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-10-16T01:18:53.424524" elapsed="0.001287">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-10-16T01:18:53.037426" elapsed="0.388513">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-10-16T01:18:53.427375" elapsed="0.000201"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:18:53.427130" 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-10-16T01:18:53.428562" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:53.428475" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.428458" elapsed="0.000168"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:53.430486" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:53.430404" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.430388" elapsed="0.000160"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:18:53.431460" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:18:53.431135" elapsed="0.000350"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:53.431938" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:53.431635" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:18:53.432003" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:18:53.432127" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:18:53.430784" elapsed="0.001365"/>
</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-10-16T01:18:53.434618" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:53.434535" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.434518" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:53.435833" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:53.435685" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.435668" elapsed="0.000229"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:53.436266" level="INFO">${karaf_connection_index} = 222</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:18:53.436039" elapsed="0.000251"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:53.436623" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:53.436450" elapsed="0.000197"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:53.469128" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:53.437246" elapsed="0.032056"/>
</kw>
<msg time="2026-10-16T01:18:53.469475" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:53.469515" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:53.436835" elapsed="0.032713"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:53.558689" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:53.470159" elapsed="0.088748"/>
</kw>
<msg time="2026-10-16T01:18:53.559064" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:53.559104" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:53.469740" elapsed="0.089398"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:53.559406" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:53.559207" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.559189" elapsed="0.000310"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:53.560049" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:53.559677" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:53.560427" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:53.560231" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.560214" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:53.560552" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:53.563051" elapsed="0.000474"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:18:53.564784" elapsed="0.000458"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:53.566443" 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-10-16T01:18:53.561342" elapsed="0.005517"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:53.560854" elapsed="0.006124"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:53.435432" elapsed="0.131623"/>
</kw>
<msg time="2026-10-16T01:18:53.567136" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:53.567175" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:53.434859" elapsed="0.132351"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:53.567363" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:18:53.567278" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.567261" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:18:53.568073" 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-10-16T01:18:53.568375" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:53.568439" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:18:53.434248" elapsed="0.134275"/>
</kw>
<msg time="2026-10-16T01:18:53.568605" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:53.568644" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:53.432469" elapsed="0.136209"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:53.568992" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:53.568775" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.568758" elapsed="0.000305"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:18:53.432332" elapsed="0.136752"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:53.571556" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:53.571472" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.571455" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:53.572735" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:53.572620" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.572603" elapsed="0.000199"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:53.573176" 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-10-16T01:18:53.572952" elapsed="0.000249"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:53.573538" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:53.573361" elapsed="0.000201"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:53.612072" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:53.574165" elapsed="0.038101"/>
</kw>
<msg time="2026-10-16T01:18:53.612422" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:53.612504" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:53.573746" elapsed="0.038794"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:53.702050" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:53.613162" elapsed="0.089078"/>
</kw>
<msg time="2026-10-16T01:18:53.702398" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:53.702439" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:53.612738" elapsed="0.089736"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:53.702789" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:53.702544" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.702526" elapsed="0.000365"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:53.703411" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:53.703074" elapsed="0.000423"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:53.703784" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:53.703557" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.703540" elapsed="0.000339"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:53.703911" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:53.706371" 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-10-16T01:18:53.708155" elapsed="0.000454"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:53.709830" elapsed="0.000311"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:18:53.704670" elapsed="0.005536"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:53.704182" elapsed="0.006143"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:53.572366" elapsed="0.138036"/>
</kw>
<msg time="2026-10-16T01:18:53.710483" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:53.710523" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:53.571797" elapsed="0.138761"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:53.710791" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-16T01:18:53.710626" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.710609" 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 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-10-16T01:18:53.711188" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:53.711483" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:53.711547" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:18:53.571180" elapsed="0.140451"/>
</kw>
<msg time="2026-10-16T01:18:53.711771" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:53.711814" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:53.569327" elapsed="0.142522"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:53.712179" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:53.711960" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.711942" elapsed="0.000308"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:18:53.569192" elapsed="0.143080"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:53.715020" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:53.714937" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.714919" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:53.716184" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:53.716101" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.716085" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:53.716610" 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-10-16T01:18:53.716387" elapsed="0.000248"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:53.717001" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:53.716825" elapsed="0.000296"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:53.750492" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:53.717691" elapsed="0.032976"/>
</kw>
<msg time="2026-10-16T01:18:53.750868" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:53.750910" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:53.717279" elapsed="0.033665"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:53.835513" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:53.751525" elapsed="0.084206"/>
</kw>
<msg time="2026-10-16T01:18:53.835893" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:53.835934" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:53.751106" elapsed="0.084863"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:53.836243" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:53.836040" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.836021" elapsed="0.000315"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:53.836893" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:53.836520" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:53.837234" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:53.837040" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.837024" elapsed="0.000302"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:53.837358" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:53.839842" elapsed="0.000471"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:18:53.841540" elapsed="0.000485"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:53.843238" 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-10-16T01:18:53.838154" elapsed="0.005464"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:53.837623" elapsed="0.006383"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:53.715848" elapsed="0.128274"/>
</kw>
<msg time="2026-10-16T01:18:53.844204" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:53.844244" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:53.715230" elapsed="0.129048"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:53.844432" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:18:53.844346" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.844330" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:18:53.844855" 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-10-16T01:18:53.845155" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:53.845219" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:18:53.714614" elapsed="0.130689"/>
</kw>
<msg time="2026-10-16T01:18:53.845386" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:53.845426" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:53.712518" elapsed="0.132942"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:53.845832" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:53.845527" elapsed="0.000357"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.845511" elapsed="0.000396"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:18:53.712381" elapsed="0.133548"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:18:53.432195" elapsed="0.413762"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:18:53.430116" elapsed="0.415894"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:18:53.428222" elapsed="0.417840"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:53.427834" elapsed="0.418269"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:18:53.426793" elapsed="0.419358"/>
</kw>
<kw name="Modify the destination IP of Sample Port" owner="ClusterOvsdb">
<msg time="2026-10-16T01:18:53.848954" 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-10-16T01:18:53.847790" elapsed="0.001199">Variable '${new_owner}' not found.</status>
</kw>
<doc>Modify the dst ip of existing port in Owner.</doc>
<status status="FAIL" start="2026-10-16T01:18:53.426274" elapsed="0.422847">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-10-16T01:18:53.851203" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:18:53.850960" elapsed="0.000499"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:53.852361" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:53.852277" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.852259" elapsed="0.000167"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:53.854309" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:53.854227" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.854211" elapsed="0.000160"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:18:53.855273" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:18:53.854952" elapsed="0.000346"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:53.855745" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:53.855447" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:18:53.855810" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:18:53.855935" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:18:53.854571" elapsed="0.001421"/>
</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-10-16T01:18:53.858484" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:53.858402" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.858386" elapsed="0.000162"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:53.859640" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:53.859558" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.859541" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:53.860110" level="INFO">${karaf_connection_index} = 222</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:18:53.859882" elapsed="0.000252"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:53.860468" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:53.860293" elapsed="0.000199"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:53.892043" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:53.861094" elapsed="0.031129"/>
</kw>
<msg time="2026-10-16T01:18:53.892401" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:53.892442" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:53.860645" elapsed="0.031831"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:53.960957" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:53.893108" elapsed="0.068026"/>
</kw>
<msg time="2026-10-16T01:18:53.961288" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:53.961328" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:53.892639" elapsed="0.068723"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:53.961631" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:53.961431" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.961413" elapsed="0.000381"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:53.962315" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:53.961981" elapsed="0.000414"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:53.962648" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:53.962455" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.962439" elapsed="0.000330"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:53.962800" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:53.965342" 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-10-16T01:18:53.967095" elapsed="0.000460"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:53.968777" 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-10-16T01:18:53.963598" elapsed="0.005566"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:53.963067" elapsed="0.006215"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:53.859305" elapsed="0.110051"/>
</kw>
<msg time="2026-10-16T01:18:53.969474" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:53.969514" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:53.858691" elapsed="0.110858"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:53.969993" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-10-16T01:18:53.969616" elapsed="0.000438"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.969600" elapsed="0.000477"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:18:53.970392" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:53.970687" elapsed="0.000052"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:53.970782" 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-10-16T01:18:53.858117" elapsed="0.112751"/>
</kw>
<msg time="2026-10-16T01:18:53.970951" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:53.970990" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:53.856328" elapsed="0.114697"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:53.971306" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:53.971091" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.971076" elapsed="0.000300"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:18:53.856191" elapsed="0.115206"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:53.973893" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:53.973804" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.973786" elapsed="0.000168"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:53.975065" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:53.974983" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:53.974966" elapsed="0.000161"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:53.975489" 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-10-16T01:18:53.975267" elapsed="0.000246"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:53.975877" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:53.975670" elapsed="0.000231"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:54.011342" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:53.976461" elapsed="0.035059"/>
</kw>
<msg time="2026-10-16T01:18:54.011734" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:54.011780" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:53.976053" elapsed="0.035761"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:54.084560" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:54.012401" elapsed="0.072397"/>
</kw>
<msg time="2026-10-16T01:18:54.084956" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:54.084996" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:54.011976" elapsed="0.073055"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:54.085301" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:54.085100" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.085081" elapsed="0.000314"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:54.085977" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:54.085606" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:54.086314" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:54.086118" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.086102" elapsed="0.000304"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:54.086437" elapsed="0.000024"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:54.088980" 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-10-16T01:18:54.090890" elapsed="0.000454"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:54.092517" elapsed="0.000410"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:18:54.087226" elapsed="0.005768"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:54.086734" elapsed="0.006377"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:53.974669" elapsed="0.118519"/>
</kw>
<msg time="2026-10-16T01:18:54.093269" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:54.093308" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:53.974098" elapsed="0.119246"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:54.093496" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:18:54.093412" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.093395" elapsed="0.000177"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:18:54.093914" 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-10-16T01:18:54.094210" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:54.094274" 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-10-16T01:18:53.973489" elapsed="0.120869"/>
</kw>
<msg time="2026-10-16T01:18:54.094441" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:54.094481" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:53.971640" elapsed="0.122876"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:54.094936" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:54.094584" elapsed="0.000404"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.094568" elapsed="0.000442"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:18:53.971506" elapsed="0.123525"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:54.098659" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:54.098573" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.098556" 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-10-16T01:18:54.100065" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:54.099976" elapsed="0.000131"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.099956" elapsed="0.000171"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:54.100493" 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-10-16T01:18:54.100268" elapsed="0.000250"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:54.100881" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:54.100677" elapsed="0.000228"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:54.133775" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:54.101502" elapsed="0.032448"/>
</kw>
<msg time="2026-10-16T01:18:54.134120" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:54.134161" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:54.101089" elapsed="0.033106"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:54.208112" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:54.134811" elapsed="0.073478"/>
</kw>
<msg time="2026-10-16T01:18:54.208446" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:54.208488" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:54.134357" elapsed="0.074165"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:54.208831" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:54.208591" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.208573" elapsed="0.000353"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:54.209435" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:54.209103" elapsed="0.000411"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:54.209800" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:54.209574" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.209558" elapsed="0.000337"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:54.209925" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:54.212378" 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-10-16T01:18:54.214100" elapsed="0.000455"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:54.215775" elapsed="0.000307"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:18:54.210676" elapsed="0.005472"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:54.210188" elapsed="0.006080"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:54.099468" elapsed="0.116878"/>
</kw>
<msg time="2026-10-16T01:18:54.216427" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:54.216467" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:54.098900" elapsed="0.117602"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:54.216653" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:18:54.216570" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.216553" 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 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-10-16T01:18:54.217115" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:54.217407" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:54.217470" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:18:54.098286" elapsed="0.119268"/>
</kw>
<msg time="2026-10-16T01:18:54.217636" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:54.218028" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:54.095274" elapsed="0.122794"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:54.218356" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:54.218138" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.218122" elapsed="0.000305"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:18:54.095139" elapsed="0.123310"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:18:53.856044" elapsed="0.362432"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:18:53.853939" elapsed="0.364586"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:18:53.852023" elapsed="0.366551"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:53.851603" elapsed="0.367012"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:18:53.850583" elapsed="0.368079"/>
</kw>
<kw name="Verify Sample Port Is Modified" owner="ClusterOvsdb">
<msg time="2026-10-16T01:18:54.221425" 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-10-16T01:18:54.220184" elapsed="0.001275">Variable '${new_cluster_list}' not found.</status>
</kw>
<doc>Verify port is modified in all instances.</doc>
<status status="FAIL" start="2026-10-16T01:18:53.850094" elapsed="0.371507">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-10-16T01:18:54.222999" elapsed="0.000200"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:18:54.222683" elapsed="0.000566"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:54.224150" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:54.224065" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.224048" elapsed="0.000165"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:54.226066" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:54.225985" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.225968" elapsed="0.000162"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:18:54.227031" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:18:54.226678" elapsed="0.000379"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:54.227473" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:54.227204" elapsed="0.000292"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:18:54.227536" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:18:54.227660" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:18:54.226329" elapsed="0.001353"/>
</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-10-16T01:18:54.230221" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:54.230137" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.230120" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:54.231364" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:54.231281" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.231265" elapsed="0.000161"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:54.231825" level="INFO">${karaf_connection_index} = 222</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:18:54.231567" elapsed="0.000282"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:54.232178" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:54.232007" elapsed="0.000194"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:54.263801" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:54.232790" elapsed="0.031219"/>
</kw>
<msg time="2026-10-16T01:18:54.264168" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:54.264209" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:54.232352" elapsed="0.031892"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:54.320549" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:54.264861" elapsed="0.055981"/>
</kw>
<msg time="2026-10-16T01:18:54.321050" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:54.321101" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:54.264404" elapsed="0.056733"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:54.321465" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:54.321222" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.321201" elapsed="0.000362"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:54.322155" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:54.321772" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:54.322494" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:54.322297" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.322281" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:54.322619" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:54.325166" 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-10-16T01:18:54.326925" elapsed="0.000468"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:54.328614" elapsed="0.000401"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:18:54.323436" elapsed="0.005647"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:54.322933" elapsed="0.006269"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:54.231028" elapsed="0.098252"/>
</kw>
<msg time="2026-10-16T01:18:54.329364" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:54.329404" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:54.230429" elapsed="0.099010"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:54.329592" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:18:54.329508" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.329491" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:18:54.330255" 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-10-16T01:18:54.330557" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:54.330622" 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-10-16T01:18:54.229849" elapsed="0.100887"/>
</kw>
<msg time="2026-10-16T01:18:54.330824" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:54.330864" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:54.228059" elapsed="0.102843"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:54.331235" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:54.331018" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.331001" elapsed="0.000307"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:18:54.227923" elapsed="0.103407"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:54.333879" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:54.333792" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.333775" elapsed="0.000168"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:54.335050" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:54.334965" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.334948" elapsed="0.000166"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:54.335483" 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-10-16T01:18:54.335256" elapsed="0.000251"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:54.335875" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:54.335667" elapsed="0.000232"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:54.369779" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:54.336470" elapsed="0.033498"/>
</kw>
<msg time="2026-10-16T01:18:54.370126" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:54.370169" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:54.336053" elapsed="0.034151"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:54.431116" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:54.370825" elapsed="0.060470"/>
</kw>
<msg time="2026-10-16T01:18:54.431452" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:54.431494" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:54.370368" elapsed="0.061160"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:54.431838" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:54.431598" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.431580" elapsed="0.000355"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:54.432447" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:54.432114" elapsed="0.000411"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:54.432809" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:54.432585" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.432569" elapsed="0.000335"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:54.432935" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:54.435383" 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-10-16T01:18:54.437114" elapsed="0.000458"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:54.438823" 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-10-16T01:18:54.433683" elapsed="0.005521"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:54.433199" elapsed="0.006123"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:54.334670" elapsed="0.104769"/>
</kw>
<msg time="2026-10-16T01:18:54.439522" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:54.439561" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:54.334091" elapsed="0.105504"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:54.439788" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:18:54.439663" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.439647" 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-10-16T01:18:54.440179" elapsed="0.000022"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:54.440475" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:54.440539" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:18:54.333465" elapsed="0.107158"/>
</kw>
<msg time="2026-10-16T01:18:54.440740" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:54.440783" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:54.331579" elapsed="0.109239"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:54.441106" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:54.440891" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.440876" elapsed="0.000301"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:18:54.331443" elapsed="0.109755"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:54.444022" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:54.443939" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.443922" elapsed="0.000162"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:54.445179" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:54.445097" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.445081" elapsed="0.000161"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:54.445604" 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-10-16T01:18:54.445382" elapsed="0.000247"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:54.445994" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:54.445817" elapsed="0.000201"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:54.481075" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:54.446580" elapsed="0.034983"/>
</kw>
<msg time="2026-10-16T01:18:54.482064" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:54.482158" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:54.446171" elapsed="0.036065"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:54.540741" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:54.484007" elapsed="0.057022"/>
</kw>
<msg time="2026-10-16T01:18:54.541276" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:54.541334" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:54.482818" elapsed="0.058566"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:54.541859" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:54.541491" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.541463" elapsed="0.000598"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:54.542916" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:54.542321" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:54.543415" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:54.543141" elapsed="0.000370"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.543119" elapsed="0.000425"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:54.543587" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:54.547095" 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-10-16T01:18:54.549180" elapsed="0.000451"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:54.550948" elapsed="0.000303"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:18:54.544729" elapsed="0.006588"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:54.544008" elapsed="0.007424"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:54.444844" elapsed="0.106665"/>
</kw>
<msg time="2026-10-16T01:18:54.551591" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:54.551631" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:54.444229" elapsed="0.107437"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:54.551851" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:18:54.551765" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.551748" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:18:54.552244" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:54.552546" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:54.552610" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:18:54.443611" elapsed="0.109084"/>
</kw>
<msg time="2026-10-16T01:18:54.552982" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:54.553023" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:54.441445" elapsed="0.111614"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:54.553343" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:54.553128" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.553113" elapsed="0.000301"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:18:54.441310" elapsed="0.112125"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:18:54.227782" elapsed="0.325682"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:18:54.225662" elapsed="0.327855"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:18:54.223808" elapsed="0.329763"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:54.223392" elapsed="0.330224"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:18:54.222353" elapsed="0.331315"/>
</kw>
<kw name="Start_Single_Member" owner="ClusterManagement">
<msg time="2026-10-16T01:18:54.555427" 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-10-16T01:18:54.553912" elapsed="0.001582">Variable '${original_candidate}' not found.</status>
</kw>
<doc>Start Owner Instance and verify it is active</doc>
<status status="FAIL" start="2026-10-16T01:18:54.221944" elapsed="0.333689">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-10-16T01:18:54.557112" elapsed="0.000200"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:18:54.556870" elapsed="0.000492"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:54.558253" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:54.558168" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.558152" elapsed="0.000164"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:54.560182" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:54.560100" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.560084" elapsed="0.000161"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:18:54.561161" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:18:54.560829" elapsed="0.000357"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:54.561605" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:54.561337" elapsed="0.000293"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:18:54.561671" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:18:54.561861" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:18:54.560445" elapsed="0.001439"/>
</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-10-16T01:18:54.564365" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:54.564282" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.564266" elapsed="0.000162"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:54.565516" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:54.565434" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.565417" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:54.565980" level="INFO">${karaf_connection_index} = 222</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:18:54.565754" elapsed="0.000251"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:54.566336" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:54.566163" elapsed="0.000197"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:54.598391" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:54.566959" elapsed="0.031622"/>
</kw>
<msg time="2026-10-16T01:18:54.598770" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:54.598814" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:54.566512" elapsed="0.032336"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:54.661211" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:54.599436" elapsed="0.062007"/>
</kw>
<msg time="2026-10-16T01:18:54.661619" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:54.661660" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:54.599010" elapsed="0.062685"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:54.662031" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:54.661815" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.661791" elapsed="0.000337"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:54.662745" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:54.662355" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:54.663085" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:54.662888" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.662871" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:54.663209" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:54.665660" 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-10-16T01:18:54.667400" elapsed="0.000495"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:54.669268" elapsed="0.000306"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:18:54.663996" elapsed="0.005644"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:54.663472" elapsed="0.006317"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:54.565180" elapsed="0.104687"/>
</kw>
<msg time="2026-10-16T01:18:54.669949" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:54.669988" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:54.564573" elapsed="0.105449"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:54.670173" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-10-16T01:18:54.670090" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.670073" elapsed="0.000194"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:18:54.670578" 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-10-16T01:18:54.671003" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:54.671069" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:18:54.563996" elapsed="0.107157"/>
</kw>
<msg time="2026-10-16T01:18:54.671235" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:54.671274" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:54.562217" elapsed="0.109092"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:54.671593" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:54.671376" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.671361" elapsed="0.000303"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:18:54.562077" elapsed="0.109609"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:54.674232" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:54.674149" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.674132" elapsed="0.000161"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:54.675368" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:54.675286" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.675270" elapsed="0.000160"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:54.676038" 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-10-16T01:18:54.675572" elapsed="0.000492"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:54.676395" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:54.676223" elapsed="0.000196"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:54.719928" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:54.677065" elapsed="0.043054"/>
</kw>
<msg time="2026-10-16T01:18:54.720276" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:54.720318" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:54.676604" elapsed="0.043748"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:54.786932" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:54.720969" elapsed="0.066142"/>
</kw>
<msg time="2026-10-16T01:18:54.787267" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:54.787308" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:54.720516" elapsed="0.066827"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:54.787613" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:54.787413" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.787395" elapsed="0.000349"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:54.788264" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:54.787928" elapsed="0.000414"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:54.788596" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:54.788402" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.788386" elapsed="0.000303"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:54.788763" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:54.791402" elapsed="0.000607"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:18:54.793249" elapsed="0.000486"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:54.794933" 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-10-16T01:18:54.789534" elapsed="0.005783"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:54.789028" elapsed="0.006407"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:54.675031" elapsed="0.120481"/>
</kw>
<msg time="2026-10-16T01:18:54.795593" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:54.795633" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:54.674439" elapsed="0.121229"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:54.796115" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:18:54.796029" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.796011" elapsed="0.000181"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:18:54.796504" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:54.796831" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:54.796897" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:18:54.673858" elapsed="0.123124"/>
</kw>
<msg time="2026-10-16T01:18:54.797065" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:54.797142" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:54.671962" elapsed="0.125217"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:54.797464" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:54.797247" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.797231" elapsed="0.000303"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:18:54.671826" elapsed="0.125729"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:54.800102" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:54.800019" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.800001" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:18:54.801257" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:54.801174" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.801158" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:18:54.801686" 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-10-16T01:18:54.801464" elapsed="0.000277"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:18:54.802080" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:18:54.801906" elapsed="0.000198"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:18:54.834546" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:18:54.802666" elapsed="0.032090"/>
</kw>
<msg time="2026-10-16T01:18:54.834914" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:18:54.834955" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:54.802255" elapsed="0.032735"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:18:54.896933" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:54.835574" elapsed="0.061534"/>
</kw>
<msg time="2026-10-16T01:18:54.897263" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:18:54.897304" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:54.835152" elapsed="0.062186"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:54.897607" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:54.897406" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.897389" elapsed="0.000520"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:54.898576" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:18:54.898215" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:54.898952" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:54.898754" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.898736" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:18:54.899077" elapsed="0.000024"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:54.901504" 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-10-16T01:18:54.903244" elapsed="0.000445"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:18:54.905141" elapsed="0.000309"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:18:54.899876" elapsed="0.005700"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:18:54.899342" elapsed="0.006368"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:18:54.800919" elapsed="0.104884"/>
</kw>
<msg time="2026-10-16T01:18:54.905884" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:54.905923" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:54.800310" elapsed="0.105648"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:18:54.906115" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:18:54.906028" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.906011" elapsed="0.000181"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:18:54.906502" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:54.906909" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:18:54.906975" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:18:54.799690" elapsed="0.107370"/>
</kw>
<msg time="2026-10-16T01:18:54.907143" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:18:54.907183" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:54.797873" elapsed="0.109344"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:54.907500" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:54.907284" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.907268" elapsed="0.000303"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:18:54.797665" elapsed="0.109928"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:18:54.561933" elapsed="0.345686"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:18:54.559810" elapsed="0.347860"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:18:54.557918" elapsed="0.349834"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:18:54.557504" elapsed="0.350291"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:18:54.556505" elapsed="0.351337"/>
</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-10-16T01:18:54.916656" elapsed="0.000220"/>
</kw>
<msg time="2026-10-16T01:18:54.916919" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:54.916133" elapsed="0.000832"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:18:54.915741" elapsed="0.001292"/>
</kw>
<msg time="2026-10-16T01:18:54.917073" 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-10-16T01:18:54.912908" elapsed="0.004204"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:18:54.912498" elapsed="0.004679"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:54.917605" 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-10-16T01:18:54.917382" elapsed="0.000264"/>
</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-10-16T01:18:54.920534" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:18:54.920210" elapsed="0.000353"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:54.921018" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:54.920745" elapsed="0.000296"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:18:54.921082" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:18:54.921208" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:18:54.919864" elapsed="0.001367"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:18:54.921379" elapsed="0.000125"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:18:54.921995" 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-10-16T01:18:54.921667" elapsed="0.000353"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:54.922392" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:54.922167" elapsed="0.000248"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:54.922805" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:54.922553" 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-10-16T01:18:54.926546" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:18:54.925977" elapsed="0.000616"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:18:54.926649" elapsed="0.000096"/>
</return>
<msg time="2026-10-16T01:18:54.926940" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:18:54.924565" elapsed="0.002430"/>
</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-10-16T01:18:54.943131" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:18:54.942826" elapsed="0.000331"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:18:54.943907" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:18:54.943626" elapsed="0.000363">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:18:54.944073" 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-10-16T01:18:54.943311" elapsed="0.000784"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:18:54.944570" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:18:54.944263" elapsed="0.000332"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:18:54.944909" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:18:54.945075" 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-10-16T01:18:54.944787" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:54.945512" 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-10-16T01:18:54.945293" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:54.946608" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:18:54.946377" elapsed="0.000277"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:18:54.947120" 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-10-16T01:18:54.946861" 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-10-16T01:18:54.947425" 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-10-16T01:18:54.947609" elapsed="0.000022"/>
</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-10-16T01:18:54.947854" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:18:54.947296" elapsed="0.000612"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:18:54.947187" elapsed="0.000747"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:18:54.947974" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:18:54.948102" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:18:54.946039" elapsed="0.002086"/>
</kw>
<status status="PASS" start="2026-10-16T01:18:54.945615" elapsed="0.002539"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:54.948318" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:54.948176" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.945598" elapsed="0.002790"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:18:54.948955" 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-10-16T01:18:54.948542" elapsed="0.000439"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:18:54.949025" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:18:54.942302" elapsed="0.006823"/>
</kw>
<msg time="2026-10-16T01:18:54.949173" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:54.938266" elapsed="0.010953"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:54.953058" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:54.956833" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:54.960558" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:54.960758" 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-10-16T01:18:54.960934" elapsed="0.000019"/>
</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-10-16T01:18:54.961271" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:54.961132" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:18:54.961118" elapsed="0.000226"/>
</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-10-16T01:18:54.961494" elapsed="0.000018"/>
</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-10-16T01:18:54.961665" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:54.961856" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:18:54.961093" elapsed="0.000811"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:18:54.961004" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:54.962122" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:54.962190" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:18:54.962291" 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-10-16T01:18:54.937537" elapsed="0.024778"/>
</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-10-16T01:18:54.963418" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:18:54.963219" elapsed="0.000257">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:18:54.963557" 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-10-16T01:18:54.962901" elapsed="0.000679"/>
</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-10-16T01:18:54.963892" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:54.963642" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:18:54.964384" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:18:54.964123" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-16T01:18:54.963967" elapsed="0.000472"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.963626" elapsed="0.000833"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:18:54.964980" 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-10-16T01:18:54.964612" elapsed="0.000392"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:18:54.965049" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:18:54.965169" 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-manganese/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-10-16T01:18:54.962576" elapsed="0.002616"/>
</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-10-16T01:18:54.966282" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:18:54.966074" elapsed="0.000268">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:18:54.967471" 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-10-16T01:18:54.965760" elapsed="0.001739"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:18:54.967667" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:18:54.967566" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:54.967549" 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-10-16T01:18:54.967952" 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-10-16T01:18:54.968126" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:18:54.968185" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:18:54.968309" 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-manganese/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-10-16T01:18:54.965434" elapsed="0.002898"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:54.969545" 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-10-16T01:18:54.969320" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:54.970022" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:18:54.969802" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:18:54.976891" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:18:54.976977" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:18:54.977099" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:18:54.970346" elapsed="0.007139">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:18:54.970122" elapsed="0.007442">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:18:54.977774" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:54.977595" elapsed="0.000239"/>
</branch>
<status status="FAIL" start="2026-10-16T01:18:54.970105" elapsed="0.007751">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:18:54.978194" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:54.978312" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:54.978280" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:18:54.978264" elapsed="0.000107"/>
</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-10-16T01:18:54.978507" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:18:54.978570" elapsed="0.000013"/>
</return>
<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="FAIL" start="2026-10-16T01:18:54.968605" elapsed="0.010068">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:54.978766" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:18:54.930495" elapsed="0.048403">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:18:54.979281" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:54.979065" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:18:54.979017" elapsed="0.000388"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:54.979489" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:18:54.928889" elapsed="0.050766">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:18:54.927194" elapsed="0.052635">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:18:54.927176" elapsed="0.052735">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:54.980173" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:18:54.980520" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:54.980886" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:18:54.981236" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:18:54.981780" elapsed="0.000024"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:18:54.982098" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:18:54.982445" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:18:54.982685" elapsed="0.000067"/>
</return>
<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="FAIL" start="2026-10-16T01:18:54.924009" elapsed="0.058830">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:18:54.982900" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:18:54.923189" elapsed="0.059800">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:54.983208" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:54.983069" elapsed="0.000188"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:54.983415" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:54.983279" elapsed="0.000184"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:54.983624" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:54.983485" elapsed="0.000184"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:18:54.983053" elapsed="0.000637"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:18:54.923038" elapsed="0.060724">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:18:54.922872" elapsed="0.060944">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:18:54.983865" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:18:54.919217" elapsed="0.064738">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:54.984129" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:54.984343" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:54.984206" elapsed="0.000183"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:18:54.984192" elapsed="0.000218"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:54.984535" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:54.984787" elapsed="0.000022"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:18:54.984850" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:18:54.918505" elapsed="0.066438">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:18:54.918305" elapsed="0.066698">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:18:54.918199" elapsed="0.066851">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:18:54.917874" elapsed="0.067255">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:54.985370" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:18:54.908945" elapsed="0.076529">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:18:56.004821" elapsed="0.000411"/>
</kw>
<msg time="2026-10-16T01:18:56.005349" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:56.003456" elapsed="0.002014"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:18:56.002453" elapsed="0.003174"/>
</kw>
<msg time="2026-10-16T01:18:56.005772" 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-10-16T01:18:55.995886" elapsed="0.009982"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:18:55.995014" elapsed="0.011031"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:56.007094" 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-10-16T01:18:56.006528" elapsed="0.000657"/>
</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-10-16T01:18:56.013770" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:18:56.012990" elapsed="0.000841"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:56.014811" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:56.014163" elapsed="0.000706"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:18:56.014963" elapsed="0.000063"/>
</return>
<msg time="2026-10-16T01:18:56.015252" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:18:56.012169" elapsed="0.003136"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:18:56.015630" elapsed="0.000336"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:18:56.017042" 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-10-16T01:18:56.016329" elapsed="0.000769"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:56.017983" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:56.017425" elapsed="0.000611"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:56.018886" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:56.018341" elapsed="0.000600"/>
</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-10-16T01:18:56.027840" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:18:56.026397" elapsed="0.001555"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:18:56.028076" elapsed="0.000136"/>
</return>
<msg time="2026-10-16T01:18:56.028637" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:18:56.023158" elapsed="0.005867"/>
</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-10-16T01:18:56.052458" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:18:56.052035" elapsed="0.000460"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:18:56.053555" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:18:56.053262" elapsed="0.000387">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:18:56.053808" 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-10-16T01:18:56.052815" elapsed="0.001026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:18:56.054511" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:18:56.054077" elapsed="0.000470"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:18:56.054974" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:18:56.055171" 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-10-16T01:18:56.054808" elapsed="0.000397"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:56.055823" 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-10-16T01:18:56.055474" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:56.057352" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:18:56.056820" elapsed="0.000574"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:18:56.057857" 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-10-16T01:18:56.057568" 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-10-16T01:18:56.058161" 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-10-16T01:18:56.058345" 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-10-16T01:18:56.058524" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:18:56.058034" elapsed="0.000541"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:18:56.057925" elapsed="0.000680"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:18:56.058645" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:18:56.058804" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:18:56.056313" elapsed="0.002515"/>
</kw>
<status status="PASS" start="2026-10-16T01:18:56.055967" elapsed="0.002890"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:56.059027" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:56.058883" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:56.055944" elapsed="0.003153"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:18:56.059644" 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-10-16T01:18:56.059253" elapsed="0.000416"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:18:56.059741" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:18:56.051291" elapsed="0.008552"/>
</kw>
<msg time="2026-10-16T01:18:56.059891" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:56.045622" elapsed="0.014315"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:56.063684" elapsed="0.000036"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:56.067450" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:56.071252" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:56.071429" elapsed="0.000020"/>
</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-10-16T01:18:56.071608" elapsed="0.000019"/>
</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-10-16T01:18:56.072049" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:56.071904" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:18:56.071890" 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-10-16T01:18:56.072289" elapsed="0.000019"/>
</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-10-16T01:18:56.072464" elapsed="0.000018"/>
</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-10-16T01:18:56.072621" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:18:56.071860" elapsed="0.000809"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:18:56.071676" elapsed="0.001016"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:56.072894" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:56.072961" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:18:56.073065" 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-10-16T01:18:56.044795" elapsed="0.028294"/>
</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-10-16T01:18:56.074207" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:18:56.074006" elapsed="0.000260">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:18:56.074349" 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-10-16T01:18:56.073646" elapsed="0.000726"/>
</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-10-16T01:18:56.074647" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:56.074434" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:18:56.075176" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:18:56.074915" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-16T01:18:56.074755" elapsed="0.000477"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:56.074417" elapsed="0.000834"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:18:56.075770" 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-10-16T01:18:56.075407" elapsed="0.000389"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:18:56.075840" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:18:56.075963" 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-manganese/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-10-16T01:18:56.073351" elapsed="0.002635"/>
</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-10-16T01:18:56.077110" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:18:56.076913" elapsed="0.000255">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:18:56.077252" 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-10-16T01:18:56.076566" elapsed="0.000708"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:18:56.077435" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:18:56.077337" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:56.077320" elapsed="0.000192"/>
</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-10-16T01:18:56.077662" elapsed="0.000020"/>
</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-10-16T01:18:56.077867" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:18:56.077928" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:18:56.078050" 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-manganese/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-10-16T01:18:56.076271" elapsed="0.001803"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:56.079464" 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-10-16T01:18:56.079239" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:56.079942" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:18:56.079690" 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-10-16T01:18:56.084446" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:18:56.084500" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:18:56.084595" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:18:56.080265" elapsed="0.004718">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:18:56.080043" elapsed="0.005017">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:18:56.085243" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:56.085092" elapsed="0.000210"/>
</branch>
<status status="FAIL" start="2026-10-16T01:18:56.080026" elapsed="0.005299">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:18:56.085661" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:56.085812" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:56.085778" elapsed="0.000073"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:18:56.085761" elapsed="0.000112"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:56.086010" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:18:56.086073" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:18:56.078514" elapsed="0.007709">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:56.086365" elapsed="0.000022"/>
</return>
<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="FAIL" start="2026-10-16T01:18:56.035001" elapsed="0.051544">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:18:56.087143" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:56.086834" elapsed="0.000426"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:18:56.086763" elapsed="0.000556"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:56.087437" elapsed="0.000051"/>
</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="FAIL" start="2026-10-16T01:18:56.032877" elapsed="0.054789">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:18:56.029479" elapsed="0.058368">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:18:56.029436" elapsed="0.058518">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:56.088299" elapsed="0.000033"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:18:56.088827" elapsed="0.000029"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:56.089271" elapsed="0.000027"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:18:56.089802" elapsed="0.000032"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:18:56.090421" elapsed="0.000031"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:18:56.090900" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:18:56.091389" elapsed="0.000028"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:18:56.091813" elapsed="0.000027"/>
</return>
<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="FAIL" start="2026-10-16T01:18:56.021856" elapsed="0.070104">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:18:56.092045" elapsed="0.000021"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:18:56.019788" elapsed="0.072380">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:56.092475" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:56.092278" 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="NOT RUN" start="2026-10-16T01:18:56.092841" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:56.092576" elapsed="0.000336"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:56.093136" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:56.092942" elapsed="0.000259"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:18:56.092256" elapsed="0.000975"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:18:56.019403" elapsed="0.073881">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:18:56.019035" elapsed="0.074321">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:18:56.093422" elapsed="0.000020"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:18:56.010791" elapsed="0.082811">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:56.094004" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:56.094310" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:56.094116" elapsed="0.000259"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:18:56.094095" elapsed="0.000311"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:56.094580" elapsed="0.000026"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:56.094851" elapsed="0.000027"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:18:56.094935" elapsed="0.000020"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:18:56.009157" elapsed="0.085906">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:18:56.008657" elapsed="0.086493">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:18:56.008416" elapsed="0.086802">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:18:56.007623" elapsed="0.087708">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:56.095618" elapsed="0.000030"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:18:55.986312" elapsed="0.109487">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:18:57.115157" elapsed="0.000407"/>
</kw>
<msg time="2026-10-16T01:18:57.115683" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:57.113903" elapsed="0.001956"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:18:57.112961" elapsed="0.003060"/>
</kw>
<msg time="2026-10-16T01:18:57.116111" 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-10-16T01:18:57.106214" elapsed="0.009986"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:18:57.105330" elapsed="0.011019"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:57.117402" 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-10-16T01:18:57.116889" elapsed="0.000604"/>
</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-10-16T01:18:57.124180" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:18:57.123391" elapsed="0.000847"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:57.125232" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:57.124571" elapsed="0.000717"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:18:57.125497" elapsed="0.000067"/>
</return>
<msg time="2026-10-16T01:18:57.125857" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:18:57.122566" elapsed="0.003344"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:18:57.126243" elapsed="0.000286"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:18:57.127653" 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-10-16T01:18:57.126954" elapsed="0.000803"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:57.128599" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:57.128095" elapsed="0.000557"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:57.129549" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:57.129037" elapsed="0.000565"/>
</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-10-16T01:18:57.138512" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:18:57.137090" elapsed="0.001533"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:18:57.138816" elapsed="0.000139"/>
</return>
<msg time="2026-10-16T01:18:57.139394" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:18:57.133753" elapsed="0.005768"/>
</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-10-16T01:18:57.163120" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:18:57.162657" elapsed="0.000500"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:18:57.164186" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:18:57.163887" elapsed="0.000399">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:18:57.164406" 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-10-16T01:18:57.163375" elapsed="0.001063"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:18:57.165150" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:18:57.164673" elapsed="0.000513"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:18:57.165571" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:18:57.165812" 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-10-16T01:18:57.165415" elapsed="0.000431"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:57.166434" 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-10-16T01:18:57.166162" elapsed="0.000313"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:57.167503" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:18:57.167274" elapsed="0.000270"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:18:57.168014" 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-10-16T01:18:57.167749" 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-10-16T01:18:57.168319" elapsed="0.000020"/>
</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-10-16T01:18:57.168503" elapsed="0.000022"/>
</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-10-16T01:18:57.168684" elapsed="0.000035"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:18:57.168191" elapsed="0.000573"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:18:57.168082" elapsed="0.000713"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:18:57.168837" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:18:57.169005" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:18:57.166938" elapsed="0.002091"/>
</kw>
<status status="PASS" start="2026-10-16T01:18:57.166652" 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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:57.169228" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:57.169084" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:57.166518" elapsed="0.002780"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:18:57.169873" 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-10-16T01:18:57.169452" elapsed="0.000446"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:18:57.169943" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:18:57.161960" elapsed="0.008083"/>
</kw>
<msg time="2026-10-16T01:18:57.170093" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:57.156275" elapsed="0.013864"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:57.174030" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:57.177854" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:57.181597" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:57.181799" 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-10-16T01:18:57.181978" 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-10-16T01:18:57.182315" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:57.182174" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:18:57.182160" elapsed="0.000227"/>
</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-10-16T01:18:57.182539" elapsed="0.000019"/>
</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-10-16T01:18:57.182728" elapsed="0.000032"/>
</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-10-16T01:18:57.182902" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:18:57.182135" elapsed="0.000815"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:18:57.182047" elapsed="0.000927"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:57.183122" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:57.183189" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:18:57.183292" 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-10-16T01:18:57.155386" elapsed="0.027929"/>
</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-10-16T01:18:57.184470" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:18:57.184270" elapsed="0.000259">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:18:57.184611" 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-10-16T01:18:57.183949" elapsed="0.000684"/>
</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-10-16T01:18:57.184943" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:57.184713" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:18:57.185436" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:18:57.185176" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-16T01:18:57.185019" elapsed="0.000473"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:57.184680" elapsed="0.000833"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:18:57.186084" 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-10-16T01:18:57.185689" elapsed="0.000419"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:18:57.186154" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:18:57.186278" 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-manganese/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-10-16T01:18:57.183618" elapsed="0.002683"/>
</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-10-16T01:18:57.187539" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:18:57.187186" elapsed="0.000411">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:18:57.187680" 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-10-16T01:18:57.186869" elapsed="0.000879"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:18:57.187917" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:18:57.187818" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:57.187800" elapsed="0.000194"/>
</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-10-16T01:18:57.188144" elapsed="0.000020"/>
</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-10-16T01:18:57.188316" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:18:57.188375" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:18:57.188498" 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-manganese/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-10-16T01:18:57.186543" elapsed="0.001978"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:57.189772" 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-10-16T01:18:57.189521" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:57.190226" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:18:57.190008" elapsed="0.000258"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:18:57.194640" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:18:57.194694" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:18:57.194854" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:18:57.190547" elapsed="0.004681">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:18:57.190325" elapsed="0.004983">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:18:57.195487" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:57.195338" elapsed="0.000207"/>
</branch>
<status status="FAIL" start="2026-10-16T01:18:57.190309" elapsed="0.005258">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:18:57.195927" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:57.196053" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:57.196020" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:18:57.196004" elapsed="0.000107"/>
</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-10-16T01:18:57.196247" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:18:57.196309" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:18:57.188826" elapsed="0.007586">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:57.196480" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:18:57.145601" elapsed="0.051006">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:18:57.197032" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:57.196814" elapsed="0.000300"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:18:57.196764" elapsed="0.000392"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:57.197241" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:18:57.143320" elapsed="0.054088">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:18:57.140177" elapsed="0.057330">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:18:57.140148" elapsed="0.057432">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:57.197881" elapsed="0.000025"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:18:57.198232" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:57.198550" elapsed="0.000019"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:18:57.198961" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:18:57.199389" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:18:57.199722" elapsed="0.000035"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:18:57.200090" elapsed="0.000019"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:18:57.200362" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:18:57.132389" elapsed="0.068076">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:18:57.200527" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:18:57.130485" elapsed="0.070130">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:57.200875" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:57.200696" elapsed="0.000230"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:57.201083" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:57.200948" elapsed="0.000184"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:57.201296" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:57.201154" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:18:57.200680" elapsed="0.000685"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:18:57.130156" elapsed="0.071247">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:18:57.129697" elapsed="0.071758">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:18:57.201504" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:18:57.121217" elapsed="0.080378">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:57.201904" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:57.202128" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:57.201986" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:18:57.201970" elapsed="0.000226"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:57.202319" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:57.202485" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:18:57.202543" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:18:57.119532" elapsed="0.083103">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:18:57.119079" elapsed="0.083617">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:18:57.118820" elapsed="0.083959">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:18:57.118000" elapsed="0.084861">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:57.203067" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:18:57.096617" elapsed="0.106552">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:18:58.222553" elapsed="0.000463"/>
</kw>
<msg time="2026-10-16T01:18:58.223134" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:58.221292" elapsed="0.001961"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:18:58.220361" elapsed="0.003049"/>
</kw>
<msg time="2026-10-16T01:18:58.223503" 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-10-16T01:18:58.213789" elapsed="0.009803"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:18:58.212911" elapsed="0.010886"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:58.224844" 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-10-16T01:18:58.224279" elapsed="0.000659"/>
</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-10-16T01:18:58.231434" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:18:58.230659" elapsed="0.000832"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:58.232486" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:58.231890" elapsed="0.000651"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:18:58.232636" elapsed="0.000120"/>
</return>
<msg time="2026-10-16T01:18:58.232994" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:18:58.229888" elapsed="0.003156"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:18:58.233371" elapsed="0.000281"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:18:58.234817" 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-10-16T01:18:58.234102" elapsed="0.000773"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:58.235784" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:58.235227" elapsed="0.000614"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:58.236641" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:58.236148" elapsed="0.000545"/>
</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-10-16T01:18:58.245463" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:18:58.244068" elapsed="0.001505"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:18:58.245763" elapsed="0.000147"/>
</return>
<msg time="2026-10-16T01:18:58.246346" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:18:58.240762" elapsed="0.005712"/>
</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-10-16T01:18:58.270268" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:18:58.269845" elapsed="0.000460"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:18:58.271292" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:18:58.270997" elapsed="0.000395">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:18:58.271508" 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-10-16T01:18:58.270519" elapsed="0.001021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:18:58.272321" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:18:58.271883" elapsed="0.000474"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:18:58.272779" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:18:58.272973" 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-10-16T01:18:58.272582" elapsed="0.000424"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:58.273574" 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-10-16T01:18:58.273269" elapsed="0.000362"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:58.275113" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:18:58.274779" elapsed="0.000394"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:18:58.275635" 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-10-16T01:18:58.275381" elapsed="0.000278"/>
</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-10-16T01:18:58.275969" elapsed="0.000020"/>
</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-10-16T01:18:58.276151" 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-10-16T01:18:58.276330" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:18:58.275841" elapsed="0.000540"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:18:58.275717" elapsed="0.000693"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:18:58.276451" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:18:58.276578" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:18:58.274273" elapsed="0.002328"/>
</kw>
<status status="PASS" start="2026-10-16T01:18:58.273754" elapsed="0.002876"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:58.276839" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:58.276657" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:58.273692" elapsed="0.003220"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:18:58.277454" 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-10-16T01:18:58.277070" elapsed="0.000410"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:18:58.277523" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:18:58.269117" elapsed="0.008505"/>
</kw>
<msg time="2026-10-16T01:18:58.277669" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:58.263378" elapsed="0.014353"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:58.281517" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:58.285295" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:58.289053" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:58.289263" elapsed="0.000020"/>
</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-10-16T01:18:58.289442" elapsed="0.000019"/>
</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-10-16T01:18:58.289812" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:58.289642" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:18:58.289628" 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-10-16T01:18:58.290044" elapsed="0.000019"/>
</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-10-16T01:18:58.290220" elapsed="0.000018"/>
</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-10-16T01:18:58.290381" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:18:58.289601" elapsed="0.000828"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:18:58.289510" elapsed="0.000943"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:58.290602" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:58.290670" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:18:58.290805" 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-10-16T01:18:58.262523" elapsed="0.028307"/>
</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-10-16T01:18:58.291927" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:18:58.291720" elapsed="0.000267">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:18:58.292070" 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-10-16T01:18:58.291388" elapsed="0.000705"/>
</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-10-16T01:18:58.292366" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:58.292154" elapsed="0.000263"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:18:58.292889" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:18:58.292596" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-10-16T01:18:58.292440" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:58.292138" elapsed="0.000827"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:18:58.293455" 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-10-16T01:18:58.293122" elapsed="0.000357"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:18:58.293525" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:18:58.293647" 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-manganese/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-10-16T01:18:58.291092" elapsed="0.002578"/>
</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-10-16T01:18:58.294852" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:18:58.294624" elapsed="0.000288">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:18:58.294995" 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-10-16T01:18:58.294307" elapsed="0.000710"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:18:58.296787" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:18:58.296649" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:58.295103" elapsed="0.001766"/>
</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-10-16T01:18:58.297021" 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-10-16T01:18:58.297195" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:18:58.297256" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:18:58.297407" 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-manganese/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-10-16T01:18:58.293947" elapsed="0.003484"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:58.298658" 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-10-16T01:18:58.298432" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:58.299136" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:18:58.298915" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:18:58.303810" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:18:58.303864" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:18:58.303971" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:18:58.299461" elapsed="0.004870">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:18:58.299237" elapsed="0.005173">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:18:58.304589" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:58.304440" elapsed="0.000208"/>
</branch>
<status status="FAIL" start="2026-10-16T01:18:58.299220" elapsed="0.005450">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:18:58.305030" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:58.305150" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:58.305117" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:18:58.305101" elapsed="0.000106"/>
</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-10-16T01:18:58.305341" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:18:58.305403" elapsed="0.000013"/>
</return>
<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="FAIL" start="2026-10-16T01:18:58.297723" elapsed="0.007780">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:58.305570" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:18:58.252917" elapsed="0.052779">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:18:58.306124" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:58.305904" elapsed="0.000334"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:18:58.305856" elapsed="0.000425"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:58.306366" elapsed="0.000037"/>
</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="FAIL" start="2026-10-16T01:18:58.250697" elapsed="0.055835">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:18:58.247139" elapsed="0.059494">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:18:58.247093" elapsed="0.059659">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:58.307007" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:18:58.307360" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:58.307671" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:18:58.308101" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:18:58.308535" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:18:58.308882" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:18:58.309228" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:18:58.309466" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:18:58.239381" elapsed="0.070186">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:18:58.309627" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:18:58.237547" elapsed="0.072202">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:58.309972" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:58.309832" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:58.310179" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:58.310044" elapsed="0.000183"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:58.310387" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:58.310248" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:18:58.309816" elapsed="0.000638"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:18:58.237214" elapsed="0.073278">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:18:58.236840" elapsed="0.073703">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:18:58.310591" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:18:58.228491" elapsed="0.082189">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:58.310990" elapsed="0.000056"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:58.311255" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:58.311113" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:18:58.311097" elapsed="0.000227"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:58.311449" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:58.311616" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:18:58.311674" elapsed="0.000015"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:18:58.226934" elapsed="0.084956">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:18:58.226419" elapsed="0.085537">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:18:58.226174" elapsed="0.085831">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:18:58.225381" elapsed="0.086706">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:58.312295" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:18:58.204103" elapsed="0.108295">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:18:59.338503" elapsed="0.000457"/>
</kw>
<msg time="2026-10-16T01:18:59.339078" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:59.337239" elapsed="0.001959"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:18:59.336281" elapsed="0.003075"/>
</kw>
<msg time="2026-10-16T01:18:59.339447" 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-10-16T01:18:59.328020" elapsed="0.011517"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:18:59.326665" elapsed="0.013022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:59.340780" 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-10-16T01:18:59.340219" elapsed="0.000658"/>
</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-10-16T01:18:59.347410" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:18:59.346621" elapsed="0.000846"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:59.348463" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:59.347853" elapsed="0.000666"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:18:59.348615" elapsed="0.000063"/>
</return>
<msg time="2026-10-16T01:18:59.348963" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:18:59.345837" elapsed="0.003178"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:18:59.349344" elapsed="0.000283"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:18:59.350900" 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-10-16T01:18:59.350048" elapsed="0.000908"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:59.351851" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:59.351286" elapsed="0.000619"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:18:59.352766" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:18:59.352215" elapsed="0.000608"/>
</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-10-16T01:18:59.358783" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:18:59.357923" elapsed="0.000931"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:18:59.358937" elapsed="0.000086"/>
</return>
<msg time="2026-10-16T01:18:59.359295" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:18:59.355881" elapsed="0.003496"/>
</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-10-16T01:18:59.381411" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:18:59.381105" elapsed="0.000332"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:18:59.382162" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:18:59.381942" elapsed="0.000293">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:18:59.382320" 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-10-16T01:18:59.381593" elapsed="0.000750"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:18:59.382857" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:18:59.382512" elapsed="0.000370"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:18:59.383155" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:18:59.383305" 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-10-16T01:18:59.383044" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:59.383764" 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-10-16T01:18:59.383519" 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-10-16T01:18:59.384684" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:18:59.384457" elapsed="0.000294"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:18:59.385319" 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-10-16T01:18:59.384925" elapsed="0.000420"/>
</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-10-16T01:18:59.385628" elapsed="0.000020"/>
</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-10-16T01:18:59.385836" 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-10-16T01:18:59.386015" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:18:59.385500" elapsed="0.000566"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:18:59.385388" elapsed="0.000707"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:18:59.386137" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:18:59.386267" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:18:59.384122" elapsed="0.002168"/>
</kw>
<status status="PASS" start="2026-10-16T01:18:59.383866" 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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:59.386486" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:59.386343" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:59.383850" elapsed="0.002706"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:18:59.387131" 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-10-16T01:18:59.386724" elapsed="0.000463"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:18:59.387233" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:18:59.380518" elapsed="0.006816"/>
</kw>
<msg time="2026-10-16T01:18:59.387381" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:18:59.374837" elapsed="0.012590"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:59.391331" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:59.395104" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:59.398859" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:59.399043" elapsed="0.000020"/>
</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-10-16T01:18:59.399220" elapsed="0.000019"/>
</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-10-16T01:18:59.399566" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:59.399425" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:18:59.399412" elapsed="0.000226"/>
</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-10-16T01:18:59.399820" 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-10-16T01:18:59.399997" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:59.400155" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:18:59.399386" elapsed="0.000816"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:18:59.399295" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:59.400373" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:59.400440" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:18:59.400544" 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-10-16T01:18:59.373987" elapsed="0.026580"/>
</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-10-16T01:18:59.401721" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:18:59.401502" elapsed="0.000292">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:18:59.401878" 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-10-16T01:18:59.401183" elapsed="0.000718"/>
</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-10-16T01:18:59.402218" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:59.401964" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:18:59.402735" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:18:59.402455" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-10-16T01:18:59.402295" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:59.401947" elapsed="0.000878"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:18:59.403348" 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-10-16T01:18:59.403006" elapsed="0.000367"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:18:59.403418" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:18:59.403542" 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-manganese/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-10-16T01:18:59.400853" elapsed="0.002713"/>
</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-10-16T01:18:59.404649" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:18:59.404454" elapsed="0.000275">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:18:59.404826" 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-10-16T01:18:59.404141" elapsed="0.000707"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:18:59.405011" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:18:59.404912" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-16T01:18:59.404895" elapsed="0.000193"/>
</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-10-16T01:18:59.405237" elapsed="0.000019"/>
</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-10-16T01:18:59.405406" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:18:59.405466" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:18:59.405590" 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-manganese/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-10-16T01:18:59.403845" elapsed="0.001768"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:59.407053" 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-10-16T01:18:59.406817" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:18:59.407501" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:18:59.407282" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:18:59.412198" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:18:59.412253" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:18:59.412350" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:18:59.407926" elapsed="0.004805">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:18:59.407674" elapsed="0.005182">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:18:59.413039" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:59.412889" elapsed="0.000213"/>
</branch>
<status status="FAIL" start="2026-10-16T01:18:59.407655" elapsed="0.005469">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:18:59.413465" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:59.413584" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:18:59.413551" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:18:59.413535" elapsed="0.000108"/>
</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-10-16T01:18:59.413808" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:18:59.413874" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:18:59.406100" elapsed="0.007877">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:59.414046" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:18:59.364400" elapsed="0.049773">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:18:59.414560" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:59.414341" elapsed="0.000300"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:18:59.414294" elapsed="0.000389"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:18:59.414805" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:18:59.362264" elapsed="0.052706">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:18:59.359672" elapsed="0.055400">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:18:59.359643" elapsed="0.055505">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:59.415396" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:18:59.415763" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:59.416074" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:18:59.416418" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:18:59.416874" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:18:59.417188" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:18:59.417535" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:18:59.417819" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:18:59.355056" elapsed="0.062866">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:18:59.418016" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:18:59.353622" elapsed="0.064488">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:59.418333" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:59.418191" elapsed="0.000192"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:59.418542" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:59.418406" elapsed="0.000185"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:59.418788" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:59.418613" elapsed="0.000225"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:18:59.418175" elapsed="0.000685"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:18:59.353292" elapsed="0.065606">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:18:59.352919" elapsed="0.066032">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:18:59.418999" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:18:59.344437" elapsed="0.074654">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:59.419263" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:59.419481" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:18:59.419341" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:18:59.419326" elapsed="0.000222"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:59.419673" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:59.419973" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:18:59.420032" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:18:59.342867" elapsed="0.077257">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:18:59.342361" elapsed="0.077826">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:18:59.342115" elapsed="0.078120">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:18:59.341322" elapsed="0.078995">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:18:59.420525" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:18:59.313265" elapsed="0.107364">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:00.439797" elapsed="0.000408"/>
</kw>
<msg time="2026-10-16T01:19:00.440322" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:00.438486" elapsed="0.002069"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:00.437553" elapsed="0.003228"/>
</kw>
<msg time="2026-10-16T01:19:00.440881" 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-10-16T01:19:00.430989" elapsed="0.009986"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:00.430101" elapsed="0.011025"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:00.442183" 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-10-16T01:19:00.441605" elapsed="0.000672"/>
</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-10-16T01:19:00.448844" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:00.448054" elapsed="0.000851"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:00.449892" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:00.449237" elapsed="0.000711"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:00.450044" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:19:00.450332" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:00.447225" elapsed="0.003157"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:00.450741" elapsed="0.000307"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:00.452135" 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-10-16T01:19:00.451412" elapsed="0.000781"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:00.453185" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:00.452521" elapsed="0.000720"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:00.454124" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:00.453555" elapsed="0.000622"/>
</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-10-16T01:19:00.462920" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:00.461465" elapsed="0.001566"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:00.463159" elapsed="0.000135"/>
</return>
<msg time="2026-10-16T01:19:00.463924" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:00.458185" elapsed="0.005875"/>
</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-10-16T01:19:00.487342" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:00.486920" elapsed="0.000458"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:00.488366" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:00.488074" elapsed="0.000390">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:00.488581" 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-10-16T01:19:00.487592" elapsed="0.001020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:00.489313" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:00.488882" elapsed="0.000466"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:00.489768" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:00.490012" 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-10-16T01:19:00.489574" elapsed="0.000471"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:00.490619" 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-10-16T01:19:00.490311" elapsed="0.000364"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:00.492016" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:00.491627" elapsed="0.000430"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:00.492486" 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-10-16T01:19:00.492230" elapsed="0.000280"/>
</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-10-16T01:19:00.492819" 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-10-16T01:19:00.493008" elapsed="0.000022"/>
</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-10-16T01:19:00.493194" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:00.492662" elapsed="0.000584"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:00.492554" elapsed="0.000721"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:00.493315" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:00.493444" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:00.491170" elapsed="0.002297"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:00.490802" elapsed="0.002693"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:00.493667" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:00.493522" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:00.490776" elapsed="0.002993"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:00.494325" 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-10-16T01:19:00.493926" elapsed="0.000425"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:00.494395" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:00.486187" elapsed="0.008306"/>
</kw>
<msg time="2026-10-16T01:19:00.494541" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:00.480531" elapsed="0.014057"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:00.498388" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:00.502508" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:00.506290" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:00.506500" 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-10-16T01:19:00.506682" 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-10-16T01:19:00.507053" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:00.506910" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:00.506896" 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-10-16T01:19:00.507278" elapsed="0.000019"/>
</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-10-16T01:19:00.507454" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:00.507614" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:00.506869" elapsed="0.000794"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:00.506778" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:00.507868" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:00.507938" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:00.508042" 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-10-16T01:19:00.479681" elapsed="0.028385"/>
</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-10-16T01:19:00.509167" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:00.508975" elapsed="0.000251">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:00.509309" 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-10-16T01:19:00.508623" elapsed="0.000709"/>
</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-10-16T01:19:00.509609" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:00.509394" elapsed="0.000268"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:00.510141" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:00.509878" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:00.509685" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:00.509378" elapsed="0.000840"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:00.510728" 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-10-16T01:19:00.510374" elapsed="0.000390"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:00.510810" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:00.510933" 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-manganese/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-10-16T01:19:00.508327" elapsed="0.002628"/>
</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-10-16T01:19:00.512086" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:00.511854" elapsed="0.000295">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:00.512235" 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-10-16T01:19:00.511495" elapsed="0.000762"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:00.512419" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:19:00.512320" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:00.512303" elapsed="0.000192"/>
</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-10-16T01:19:00.512646" elapsed="0.000020"/>
</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-10-16T01:19:00.512894" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:00.512957" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:00.513082" 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-manganese/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-10-16T01:19:00.511199" elapsed="0.001907"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:00.514523" 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-10-16T01:19:00.514299" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:00.515007" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:00.514784" elapsed="0.000263"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:19:00.519687" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:00.519772" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:00.519875" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:00.515329" elapsed="0.004909">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:00.515107" elapsed="0.005211">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:00.520497" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:00.520348" elapsed="0.000208"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:00.515090" elapsed="0.005488">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:00.520939" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:00.521059" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:00.521027" elapsed="0.000069"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:00.521011" elapsed="0.000105"/>
</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-10-16T01:19:00.521251" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:00.521312" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:19:00.513543" elapsed="0.007871">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:00.521481" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:19:00.470131" elapsed="0.051474">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:00.522036" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:00.521813" elapsed="0.000307"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:00.521762" elapsed="0.000399"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:00.522245" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:19:00.468012" elapsed="0.054432">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:00.464528" elapsed="0.058016">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:00.464484" elapsed="0.058135">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:00.522900" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:00.523255" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:00.523567" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:00.523960" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:00.524393" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:00.524727" elapsed="0.000036"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:00.525095" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:00.525339" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:19:00.456871" elapsed="0.068569">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:00.525502" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:00.455015" elapsed="0.070574">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:00.525843" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:00.525669" elapsed="0.000225"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:00.526052" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:00.525917" elapsed="0.000184"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:00.526263" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:00.526122" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:00.525653" elapsed="0.000677"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:00.454633" elapsed="0.071735">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:00.454270" elapsed="0.072150">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:00.526468" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:00.445884" elapsed="0.080673">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:00.526862" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:00.527082" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:00.526942" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:00.526927" elapsed="0.000223"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:00.527310" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:00.527479" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:00.527537" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:00.444261" elapsed="0.083369">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:00.443815" elapsed="0.083877">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:00.443518" elapsed="0.084251">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:00.442773" elapsed="0.085080">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:00.528060" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:00.421418" elapsed="0.106750">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:01.547227" elapsed="0.000398"/>
</kw>
<msg time="2026-10-16T01:19:01.547792" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:01.545986" elapsed="0.001928"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:01.545063" elapsed="0.003007"/>
</kw>
<msg time="2026-10-16T01:19:01.548162" 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-10-16T01:19:01.538520" elapsed="0.009730"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:01.537574" elapsed="0.010823"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:01.549423" 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-10-16T01:19:01.548918" elapsed="0.000597"/>
</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-10-16T01:19:01.556036" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:01.555231" elapsed="0.000862"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:01.557073" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:01.556425" elapsed="0.000702"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:01.557222" elapsed="0.000060"/>
</return>
<msg time="2026-10-16T01:19:01.557505" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:01.554406" elapsed="0.003150"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:01.557928" elapsed="0.000284"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:01.559286" 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-10-16T01:19:01.558573" elapsed="0.000768"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:01.560224" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:01.559670" elapsed="0.000606"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:01.561288" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:01.560581" elapsed="0.000761"/>
</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-10-16T01:19:01.569917" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:01.568507" elapsed="0.001520"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:01.570154" elapsed="0.000132"/>
</return>
<msg time="2026-10-16T01:19:01.570901" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:01.565289" elapsed="0.005746"/>
</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-10-16T01:19:01.593679" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:01.593258" elapsed="0.000512"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:01.594805" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:01.594442" elapsed="0.000467">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:01.595028" 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-10-16T01:19:01.593994" elapsed="0.001065"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:01.595743" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:01.595294" elapsed="0.000500"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:01.596179" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:01.596375" 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-10-16T01:19:01.596023" elapsed="0.000386"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:01.597019" 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-10-16T01:19:01.596674" elapsed="0.000402"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:01.598546" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:01.598190" elapsed="0.000399"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:01.599047" 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-10-16T01:19:01.598790" elapsed="0.000281"/>
</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-10-16T01:19:01.599351" elapsed="0.000020"/>
</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-10-16T01:19:01.599531" 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-10-16T01:19:01.599728" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:01.599223" elapsed="0.000572"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:01.599115" elapsed="0.000709"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:01.599864" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:01.599993" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:01.597666" elapsed="0.002350"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:01.597320" elapsed="0.002724"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:01.600219" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:01.600069" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:01.597137" elapsed="0.003152"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:01.600863" 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-10-16T01:19:01.600443" elapsed="0.000446"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:01.600932" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:01.592497" elapsed="0.008534"/>
</kw>
<msg time="2026-10-16T01:19:01.601111" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:01.586869" elapsed="0.014290"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:01.604933" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:01.608689" elapsed="0.000036"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:01.612469" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:01.612646" elapsed="0.000019"/>
</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-10-16T01:19:01.612850" 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-10-16T01:19:01.613190" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:01.613049" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:01.613035" elapsed="0.000228"/>
</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-10-16T01:19:01.613415" elapsed="0.000019"/>
</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-10-16T01:19:01.613591" elapsed="0.000018"/>
</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-10-16T01:19:01.613777" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:01.613008" elapsed="0.000821"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:01.612920" elapsed="0.000932"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:01.614015" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:01.614083" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:19:01.614187" 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-10-16T01:19:01.586011" elapsed="0.028199"/>
</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-10-16T01:19:01.615325" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:01.615125" elapsed="0.000260">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:01.615508" 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-10-16T01:19:01.614800" elapsed="0.000732"/>
</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-10-16T01:19:01.615847" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:01.615596" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:01.616347" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:01.616080" elapsed="0.000291"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:01.615924" elapsed="0.000479"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:01.615579" elapsed="0.000844"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:01.616946" 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-10-16T01:19:01.616581" elapsed="0.000389"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:01.617016" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:01.617138" 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-manganese/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-10-16T01:19:01.614469" elapsed="0.002692"/>
</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-10-16T01:19:01.619673" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:01.618044" elapsed="0.001722">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:01.619855" 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-10-16T01:19:01.617712" elapsed="0.002167"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:01.620043" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:19:01.619943" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:01.619926" elapsed="0.000194"/>
</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-10-16T01:19:01.620272" 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-10-16T01:19:01.620445" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:01.620505" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:01.620631" 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-manganese/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-10-16T01:19:01.617403" elapsed="0.003252"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:01.621921" 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-10-16T01:19:01.621657" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:01.622376" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:01.622151" elapsed="0.000266"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:19:01.627132" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:01.627186" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:01.627292" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:01.622713" elapsed="0.004941">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:01.622477" elapsed="0.005290">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:01.627951" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:01.627800" elapsed="0.000240"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:01.622461" elapsed="0.005603">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:01.628399" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:01.628518" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:01.628485" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:01.628469" elapsed="0.000106"/>
</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-10-16T01:19:01.628728" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:01.628805" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:19:01.620962" elapsed="0.007951">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:01.628979" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:19:01.576370" elapsed="0.052737">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:01.629494" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:01.629277" elapsed="0.000298"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:01.629228" elapsed="0.000390"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:01.629724" elapsed="0.000050"/>
</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="FAIL" start="2026-10-16T01:19:01.574228" elapsed="0.055683">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:01.571488" elapsed="0.058524">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:01.571445" elapsed="0.058642">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:01.630333" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:01.630679" elapsed="0.000035"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:01.631028" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:01.631383" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:01.631849" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:01.632164" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:01.632511" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:01.632796" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:19:01.564004" elapsed="0.068893">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:01.632958" elapsed="0.000014"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:01.562201" elapsed="0.070844">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:01.633295" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:01.633156" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:01.633504" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:01.633367" elapsed="0.000186"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:01.633737" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:01.633575" elapsed="0.000240"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:01.633139" elapsed="0.000698"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:01.561870" elapsed="0.072005">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:01.561437" elapsed="0.072490">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:01.633974" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:01.553069" elapsed="0.080995">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:01.634238" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:01.634455" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:01.634316" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:01.634301" elapsed="0.000223"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:01.634649" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:01.634944" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:01.635005" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:01.551467" elapsed="0.083630">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:01.551023" elapsed="0.084136">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:01.550778" elapsed="0.084434">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:01.550007" elapsed="0.085286">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:01.635499" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:01.529024" elapsed="0.106580">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:02.654928" elapsed="0.000410"/>
</kw>
<msg time="2026-10-16T01:19:02.655459" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:02.653588" elapsed="0.001990"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:02.652657" elapsed="0.003132"/>
</kw>
<msg time="2026-10-16T01:19:02.655990" 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-10-16T01:19:02.646143" elapsed="0.009944"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:02.645261" elapsed="0.010977"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:02.657434" 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-10-16T01:19:02.656751" elapsed="0.000779"/>
</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-10-16T01:19:02.664231" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:02.663443" elapsed="0.000845"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:02.665288" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:02.664619" elapsed="0.000724"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:02.665440" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:19:02.665778" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:02.662612" elapsed="0.003222"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:02.666166" elapsed="0.000284"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:02.667533" 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-10-16T01:19:02.666869" elapsed="0.000719"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:02.668474" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:02.667967" elapsed="0.000561"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:02.669394" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:02.668889" elapsed="0.000558"/>
</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-10-16T01:19:02.678330" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:02.676958" elapsed="0.001482"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:02.678568" elapsed="0.000307"/>
</return>
<msg time="2026-10-16T01:19:02.679317" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:02.673544" elapsed="0.005897"/>
</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-10-16T01:19:02.702256" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:02.701830" elapsed="0.000462"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:02.703284" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:02.702988" elapsed="0.000396">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:02.703502" 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-10-16T01:19:02.702508" elapsed="0.001025"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:02.704240" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:02.703807" elapsed="0.000469"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:02.704659" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:02.704895" 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-10-16T01:19:02.704504" elapsed="0.000425"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:02.705608" 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-10-16T01:19:02.705204" elapsed="0.000447"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:02.706570" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:02.706338" elapsed="0.000273"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:02.707212" 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-10-16T01:19:02.706815" elapsed="0.000422"/>
</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-10-16T01:19:02.707522" 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-10-16T01:19:02.707721" 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-10-16T01:19:02.707919" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:02.707392" elapsed="0.000580"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:02.707281" elapsed="0.000720"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:02.708042" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:19:02.708173" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:02.706003" elapsed="0.002193"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:02.705732" elapsed="0.002494"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:02.708396" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:02.708252" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:02.705695" elapsed="0.002771"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:02.709056" 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-10-16T01:19:02.708621" elapsed="0.000461"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:02.709126" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:02.701096" elapsed="0.008129"/>
</kw>
<msg time="2026-10-16T01:19:02.709271" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:02.695397" elapsed="0.013921"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:02.713108" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:02.716896" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:02.720673" elapsed="0.000037"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:02.720877" elapsed="0.000020"/>
</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-10-16T01:19:02.721055" elapsed="0.000019"/>
</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-10-16T01:19:02.721436" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:02.721254" elapsed="0.000235"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:02.721240" 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-10-16T01:19:02.721663" elapsed="0.000019"/>
</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-10-16T01:19:02.721871" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:02.722034" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:02.721214" elapsed="0.000869"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:02.721124" elapsed="0.000983"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:02.722262" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:02.722330" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:19:02.722436" 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-10-16T01:19:02.694534" elapsed="0.027926"/>
</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-10-16T01:19:02.723602" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:02.723410" elapsed="0.000252">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:02.723776" 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-10-16T01:19:02.723090" elapsed="0.000710"/>
</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-10-16T01:19:02.724081" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:02.723865" elapsed="0.000267"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:02.724574" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:02.724313" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:02.724156" elapsed="0.000474"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:02.723848" elapsed="0.000802"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:02.725171" 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-10-16T01:19:02.724834" elapsed="0.000362"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:02.725241" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:02.725365" 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-manganese/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-10-16T01:19:02.722743" elapsed="0.002645"/>
</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-10-16T01:19:02.726467" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:02.726272" elapsed="0.000254">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:02.726609" 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-10-16T01:19:02.725957" elapsed="0.000675"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:02.726826" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:19:02.726711" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:02.726679" elapsed="0.000226"/>
</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-10-16T01:19:02.727054" elapsed="0.000020"/>
</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-10-16T01:19:02.727225" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:02.727286" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:02.727410" 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-manganese/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-10-16T01:19:02.725633" elapsed="0.001838"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:02.728955" 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-10-16T01:19:02.728654" elapsed="0.000344"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:02.729406" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:02.729186" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:19:02.733902" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:02.733957" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:02.734056" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:02.729747" elapsed="0.004668">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:02.729507" elapsed="0.004985">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:02.734671" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:02.734522" elapsed="0.000226"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:02.729491" elapsed="0.005292">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:02.735119" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:02.735243" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:02.735205" elapsed="0.000076"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:02.735189" 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-10-16T01:19:02.735435" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:02.735498" elapsed="0.000013"/>
</return>
<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="FAIL" start="2026-10-16T01:19:02.727956" elapsed="0.007644">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:02.735667" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:19:02.684906" elapsed="0.050923">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:02.736219" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:02.735999" elapsed="0.000302"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:02.735952" elapsed="0.000390"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:02.736425" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:19:02.682642" elapsed="0.053946">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:02.680063" elapsed="0.056678">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:02.680018" elapsed="0.056815">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:02.737084" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:02.737432" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:02.737777" elapsed="0.000022"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:02.738128" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:02.738560" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:02.738915" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:02.739262" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:02.739502" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:19:02.672181" elapsed="0.067421">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:02.739663" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:02.670286" elapsed="0.069651">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:02.740160" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:02.740020" elapsed="0.000190"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:02.740369" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:02.740232" elapsed="0.000186"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:02.740581" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:02.740439" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:02.740004" elapsed="0.000645"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:02.669958" elapsed="0.070729">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:02.669541" elapsed="0.071236">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:02.740828" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:02.661153" elapsed="0.079768">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:02.741095" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:02.741313" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:02.741173" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:02.741159" elapsed="0.000222"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:02.741506" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:02.741674" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:02.741851" elapsed="0.000016"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:02.659540" elapsed="0.082439">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:02.659088" elapsed="0.082953">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:02.658840" elapsed="0.083251">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:02.658042" elapsed="0.084132">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:02.742383" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:02.636470" elapsed="0.106018">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:03.761660" elapsed="0.000460"/>
</kw>
<msg time="2026-10-16T01:19:03.762239" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:03.760319" elapsed="0.002039"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:03.759373" elapsed="0.003142"/>
</kw>
<msg time="2026-10-16T01:19:03.762605" 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-10-16T01:19:03.752839" elapsed="0.009856"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:03.751953" elapsed="0.010948"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:03.764007" 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-10-16T01:19:03.763376" elapsed="0.000724"/>
</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-10-16T01:19:03.770642" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:03.769902" elapsed="0.000828"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:03.771880" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:03.771093" elapsed="0.000844"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:03.772033" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:19:03.772317" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:03.769068" elapsed="0.003300"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:03.772695" elapsed="0.000335"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:03.774109" 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-10-16T01:19:03.773394" elapsed="0.000770"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:03.775050" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:03.774488" elapsed="0.000616"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:03.776002" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:03.775439" elapsed="0.000616"/>
</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-10-16T01:19:03.784689" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:03.783325" elapsed="0.001649"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:03.785109" elapsed="0.000135"/>
</return>
<msg time="2026-10-16T01:19:03.785669" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:03.780109" elapsed="0.005761"/>
</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-10-16T01:19:03.808446" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:03.808025" elapsed="0.000457"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:03.809474" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:03.809182" elapsed="0.000392">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:03.809690" 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-10-16T01:19:03.808722" elapsed="0.001023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:03.810424" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:03.809996" elapsed="0.000463"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:03.810877" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:03.811071" 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-10-16T01:19:03.810683" elapsed="0.000421"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:03.811677" 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-10-16T01:19:03.811370" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:03.813120" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:03.812642" elapsed="0.000521"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:03.813592" 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-10-16T01:19:03.813336" elapsed="0.000281"/>
</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-10-16T01:19:03.813928" elapsed="0.000020"/>
</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-10-16T01:19:03.814112" elapsed="0.000022"/>
</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-10-16T01:19:03.814293" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:03.813799" elapsed="0.000545"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:03.813659" elapsed="0.000713"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:03.814412" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:03.814540" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:03.812209" elapsed="0.002354"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:03.811860" elapsed="0.002731"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:03.814791" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:03.814618" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:03.811836" elapsed="0.003027"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:03.815401" 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-10-16T01:19:03.815016" elapsed="0.000410"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:03.815469" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:03.807295" elapsed="0.008271"/>
</kw>
<msg time="2026-10-16T01:19:03.815650" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:03.801655" elapsed="0.014057"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:03.819468" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:03.823226" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:03.826973" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:03.827147" elapsed="0.000020"/>
</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-10-16T01:19:03.827324" elapsed="0.000018"/>
</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-10-16T01:19:03.827661" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:03.827518" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:03.827504" 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-10-16T01:19:03.827948" 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-10-16T01:19:03.828123" elapsed="0.000018"/>
</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-10-16T01:19:03.828280" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:03.827479" elapsed="0.000849"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:03.827391" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:03.828501" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:03.828567" elapsed="0.000044"/>
</return>
<msg time="2026-10-16T01:19:03.828717" 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-10-16T01:19:03.800832" elapsed="0.027909"/>
</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-10-16T01:19:03.829857" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:03.829633" elapsed="0.000284">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:03.829999" 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-10-16T01:19:03.829315" elapsed="0.000706"/>
</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-10-16T01:19:03.830300" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:03.830084" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:03.830876" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:03.830575" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:03.830407" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:03.830068" elapsed="0.000886"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:03.831447" 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-10-16T01:19:03.831112" elapsed="0.000359"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:03.831517" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:03.831640" 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-manganese/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-10-16T01:19:03.829017" elapsed="0.002645"/>
</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-10-16T01:19:03.832754" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:03.832551" elapsed="0.000276">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:03.832911" 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-10-16T01:19:03.832231" elapsed="0.000703"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:03.833094" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:19:03.832997" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:03.832980" elapsed="0.000190"/>
</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-10-16T01:19:03.833320" elapsed="0.000020"/>
</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-10-16T01:19:03.833491" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:03.833550" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:03.833673" 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-manganese/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-10-16T01:19:03.831934" elapsed="0.001762"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:03.835111" 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-10-16T01:19:03.834886" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:03.835559" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:03.835344" elapsed="0.000255"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:19:03.840022" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:03.840076" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:03.840174" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:03.835912" elapsed="0.004623">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:03.835658" elapsed="0.004955">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:03.840821" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:03.840643" elapsed="0.000239"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:03.835642" elapsed="0.005262">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:03.841240" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:03.841391" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:03.841358" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:03.841341" elapsed="0.000108"/>
</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-10-16T01:19:03.841585" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:03.841647" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:19:03.834163" elapsed="0.007627">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:03.841860" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:19:03.791172" elapsed="0.050816">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:03.842382" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:03.842159" elapsed="0.000305"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:03.842111" elapsed="0.000394"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:03.842589" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:19:03.788836" elapsed="0.053953">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:03.786303" elapsed="0.056591">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:03.786274" elapsed="0.056694">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:03.843216" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:03.843565" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:03.843911" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:03.844263" elapsed="0.000027"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:03.844725" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:03.845056" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:03.845402" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:03.845642" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:19:03.778815" elapsed="0.066976">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:03.845853" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:03.776959" elapsed="0.068984">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:03.846161" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:03.846022" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:03.846403" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:03.846233" elapsed="0.000221"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:03.846647" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:03.846476" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:03.846006" elapsed="0.000732"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:03.776544" elapsed="0.070246">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:03.776148" elapsed="0.070695">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:03.846892" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:03.767654" elapsed="0.079328">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:03.847158" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:03.847377" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:03.847237" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:03.847222" elapsed="0.000223"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:03.847569" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:03.847790" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:03.847851" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:03.766078" elapsed="0.081864">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:03.765580" elapsed="0.082423">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:03.765339" elapsed="0.082714">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:03.764544" elapsed="0.083588">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:03.848338" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:03.743331" elapsed="0.105111">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:04.867949" elapsed="0.000403"/>
</kw>
<msg time="2026-10-16T01:19:04.868467" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:04.866646" elapsed="0.001940"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:04.865738" elapsed="0.003056"/>
</kw>
<msg time="2026-10-16T01:19:04.868891" 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-10-16T01:19:04.859181" elapsed="0.009800"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:04.858292" elapsed="0.010838"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:04.870289" 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-10-16T01:19:04.869747" elapsed="0.000635"/>
</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-10-16T01:19:04.876956" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:04.876164" elapsed="0.000850"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:04.878002" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:04.877347" elapsed="0.000709"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:04.878151" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:19:04.878438" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:04.875337" elapsed="0.003151"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:04.878871" elapsed="0.000288"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:04.880257" 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-10-16T01:19:04.879526" elapsed="0.000786"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:04.881203" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:04.880637" elapsed="0.000618"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:04.882127" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:04.881563" elapsed="0.000616"/>
</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-10-16T01:19:04.890885" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:04.889418" elapsed="0.001580"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:04.891126" elapsed="0.000132"/>
</return>
<msg time="2026-10-16T01:19:04.891905" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:04.886175" elapsed="0.005866"/>
</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-10-16T01:19:04.914609" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:04.914189" elapsed="0.000456"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:04.915640" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:04.915344" elapsed="0.000417">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:04.916071" 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-10-16T01:19:04.914902" elapsed="0.001201"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:04.916803" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:04.916337" elapsed="0.000502"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:04.917223" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:04.917426" 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-10-16T01:19:04.917065" elapsed="0.000394"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:04.917947" 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-10-16T01:19:04.917693" elapsed="0.000295"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:04.919015" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:04.918782" elapsed="0.000273"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:04.919532" 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-10-16T01:19:04.919229" 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-10-16T01:19:04.919871" 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-10-16T01:19:04.920054" elapsed="0.000022"/>
</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-10-16T01:19:04.920232" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:04.919727" elapsed="0.000556"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:04.919600" elapsed="0.000711"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:04.920352" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:04.920480" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:04.918421" elapsed="0.002082"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:04.918164" 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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:04.920738" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:04.920573" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:04.918032" elapsed="0.002793"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:04.921369" 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-10-16T01:19:04.920980" elapsed="0.000414"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:04.921438" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:04.913456" elapsed="0.008080"/>
</kw>
<msg time="2026-10-16T01:19:04.921583" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:04.907652" elapsed="0.013977"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:04.925432" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:04.929204" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:04.932975" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:04.933150" elapsed="0.000020"/>
</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-10-16T01:19:04.933328" 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-10-16T01:19:04.933666" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:04.933527" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:04.933514" elapsed="0.000242"/>
</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-10-16T01:19:04.933926" 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-10-16T01:19:04.934101" elapsed="0.000018"/>
</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-10-16T01:19:04.934301" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:04.933488" elapsed="0.000863"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:04.933399" elapsed="0.000975"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:04.934523" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:04.934590" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:19:04.934694" 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-10-16T01:19:04.906829" elapsed="0.027905"/>
</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-10-16T01:19:04.935846" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:04.935626" elapsed="0.000281">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:04.935991" 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-10-16T01:19:04.935307" elapsed="0.000707"/>
</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-10-16T01:19:04.936295" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:04.936078" elapsed="0.000270"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:04.936826" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:04.936531" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:04.936371" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:04.936061" elapsed="0.000842"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:04.937398" 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-10-16T01:19:04.937062" elapsed="0.000360"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:04.937467" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:04.937591" 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-manganese/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-10-16T01:19:04.935010" elapsed="0.002604"/>
</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-10-16T01:19:04.940218" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:04.938511" elapsed="0.001769">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:04.940367" 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-10-16T01:19:04.938190" elapsed="0.002200"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:04.940556" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:19:04.940455" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:04.940438" elapsed="0.000195"/>
</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-10-16T01:19:04.940815" 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-10-16T01:19:04.940990" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:04.941052" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:19:04.941179" 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-manganese/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-10-16T01:19:04.937891" elapsed="0.003311"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:04.942421" 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-10-16T01:19:04.942195" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:04.942945" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:04.942691" elapsed="0.000295"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:19:04.947481" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:04.947534" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:04.947637" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:04.943272" elapsed="0.004759">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:04.943047" elapsed="0.005064">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:04.948291" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:04.948142" elapsed="0.000209"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:04.943030" elapsed="0.005343">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:04.948725" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:04.948864" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:04.948830" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:04.948814" elapsed="0.000109"/>
</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-10-16T01:19:04.949059" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:04.949121" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:19:04.941471" elapsed="0.007752">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:04.949290" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:19:04.897148" elapsed="0.052276">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:04.949853" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:04.949595" elapsed="0.000343"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:04.949546" elapsed="0.000435"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:04.950067" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:19:04.895031" elapsed="0.055204">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:04.892493" elapsed="0.057845">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:04.892458" elapsed="0.057962">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:04.950667" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:04.951084" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:04.951404" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:04.951793" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:04.952229" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:04.952546" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:04.952939" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:04.953183" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:19:04.884877" elapsed="0.068408">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:04.953346" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:04.883028" elapsed="0.070405">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:04.953652" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:04.953511" elapsed="0.000213"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:04.953901" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:04.953749" elapsed="0.000203"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:04.954115" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:04.953974" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:04.953496" elapsed="0.000687"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:04.882637" elapsed="0.071584">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:04.882273" elapsed="0.072000">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:04.954323" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:04.873990" elapsed="0.080423">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:04.954585" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:04.954934" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:04.954663" elapsed="0.000322"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:04.954648" elapsed="0.000359"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:04.955131" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:04.955298" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:04.955356" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:04.872366" elapsed="0.083081">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:04.871918" elapsed="0.083590">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:04.871620" elapsed="0.083974">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:04.870884" elapsed="0.084793">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:04.955916" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:04.849292" elapsed="0.106729">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:05.975401" elapsed="0.000448"/>
</kw>
<msg time="2026-10-16T01:19:05.975963" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:05.974136" elapsed="0.001942"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:05.973184" elapsed="0.003054"/>
</kw>
<msg time="2026-10-16T01:19:05.976332" 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-10-16T01:19:05.966652" elapsed="0.009770"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:05.965816" elapsed="0.010759"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:05.977622" 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-10-16T01:19:05.977104" elapsed="0.000641"/>
</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-10-16T01:19:05.984299" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:05.983502" elapsed="0.000856"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:05.985358" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:05.984694" elapsed="0.000719"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:05.985507" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:19:05.985849" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:05.982668" elapsed="0.003234"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:05.986236" elapsed="0.000285"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:05.987628" 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-10-16T01:19:05.986953" elapsed="0.000731"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:05.988578" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:05.988066" elapsed="0.000567"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:05.989507" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:05.989001" elapsed="0.000560"/>
</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-10-16T01:19:05.998283" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:05.996923" elapsed="0.001468"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:05.998517" elapsed="0.000135"/>
</return>
<msg time="2026-10-16T01:19:05.999260" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:05.993624" elapsed="0.005762"/>
</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-10-16T01:19:06.022182" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:06.021739" elapsed="0.000480"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:06.023190" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:06.022905" elapsed="0.000380">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:06.023401" 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-10-16T01:19:06.022433" elapsed="0.000999"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:06.024145" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:06.023677" elapsed="0.000504"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:06.024570" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:06.024802" 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-10-16T01:19:06.024416" elapsed="0.000421"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:06.025408" 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-10-16T01:19:06.025103" elapsed="0.000363"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:06.026628" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:06.026398" elapsed="0.000271"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:06.027273" 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-10-16T01:19:06.026873" elapsed="0.000426"/>
</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-10-16T01:19:06.027584" 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-10-16T01:19:06.027796" 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-10-16T01:19:06.027980" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:06.027452" elapsed="0.000580"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:06.027343" elapsed="0.000717"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:06.028101" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:19:06.028232" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:06.025941" elapsed="0.002315"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:06.025552" elapsed="0.002733"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:06.028460" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:06.028310" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:06.025529" elapsed="0.003001"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:06.029101" 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-10-16T01:19:06.028683" elapsed="0.000444"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:06.029172" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:06.021013" elapsed="0.008259"/>
</kw>
<msg time="2026-10-16T01:19:06.029320" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:06.015315" elapsed="0.014057"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:06.033191" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:06.037019" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:06.040825" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:06.041001" elapsed="0.000020"/>
</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-10-16T01:19:06.041179" elapsed="0.000019"/>
</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-10-16T01:19:06.041516" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:06.041376" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:06.041362" elapsed="0.000227"/>
</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-10-16T01:19:06.041757" elapsed="0.000033"/>
</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-10-16T01:19:06.041951" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:06.042111" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:06.041337" elapsed="0.000823"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:06.041247" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:06.042340" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:06.042407" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:19:06.042512" 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-10-16T01:19:06.014451" elapsed="0.028085"/>
</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-10-16T01:19:06.043631" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:06.043442" elapsed="0.000248">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:06.043802" 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-10-16T01:19:06.043123" elapsed="0.000703"/>
</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-10-16T01:19:06.044104" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:06.043890" elapsed="0.000265"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:06.044598" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:06.044335" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:06.044178" elapsed="0.000477"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:06.043873" elapsed="0.000802"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:06.045196" 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-10-16T01:19:06.044858" elapsed="0.000393"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:06.045298" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:06.045422" 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-manganese/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-10-16T01:19:06.042826" elapsed="0.002619"/>
</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-10-16T01:19:06.046523" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:06.046334" elapsed="0.000248">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:06.046666" 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-10-16T01:19:06.046016" elapsed="0.000672"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:06.046879" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:19:06.046768" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:06.046751" elapsed="0.000205"/>
</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-10-16T01:19:06.047105" elapsed="0.000020"/>
</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-10-16T01:19:06.047275" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:06.047334" elapsed="0.000013"/>
</return>
<msg time="2026-10-16T01:19:06.047458" 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-manganese/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-10-16T01:19:06.045688" elapsed="0.001793"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:06.048930" 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-10-16T01:19:06.048675" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:06.049378" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:06.049158" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:19:06.054002" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:06.054055" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:06.054152" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:06.049713" elapsed="0.004797">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:06.049478" elapsed="0.005110">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:06.054795" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:06.054619" elapsed="0.000237"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:06.049462" elapsed="0.005416">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:06.055209" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:06.055330" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:06.055295" elapsed="0.000076"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:06.055280" elapsed="0.000111"/>
</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-10-16T01:19:06.055526" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:06.055619" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:19:06.047975" elapsed="0.007764">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:06.055821" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:19:06.004763" elapsed="0.051185">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:06.056336" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:06.056118" elapsed="0.000301"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:06.056071" elapsed="0.000531"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:06.056689" 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="FAIL" start="2026-10-16T01:19:06.002561" elapsed="0.054333">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:06.000016" elapsed="0.056979">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:05.999972" elapsed="0.057096">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:06.057315" elapsed="0.000027"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:06.057664" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:06.058006" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:06.058354" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:06.058818" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:06.059135" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:06.059481" elapsed="0.000019"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:06.059754" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:19:05.992314" elapsed="0.067556">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:06.059931" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:05.990416" elapsed="0.069604">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:06.060240" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:06.060099" elapsed="0.000192"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:06.060451" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:06.060315" elapsed="0.000184"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:06.060663" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:06.060521" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:06.060084" elapsed="0.000711"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:05.990084" elapsed="0.070755">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:05.989658" elapsed="0.071234">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:06.060941" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:05.981321" elapsed="0.079711">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:06.061208" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:06.061427" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:06.061287" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:06.061272" elapsed="0.000223"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:06.061620" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:06.061891" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:06.061952" elapsed="0.000015"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:05.979695" elapsed="0.082352">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:05.979249" elapsed="0.082860">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:05.979004" elapsed="0.083154">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:05.978212" elapsed="0.084029">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:06.062450" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:05.956892" elapsed="0.105662">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:07.081911" elapsed="0.000397"/>
</kw>
<msg time="2026-10-16T01:19:07.082424" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:07.080563" elapsed="0.002018"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:07.079625" elapsed="0.003222"/>
</kw>
<msg time="2026-10-16T01:19:07.082950" 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-10-16T01:19:07.072950" elapsed="0.010099"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:07.072048" elapsed="0.011159"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:07.084320" 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-10-16T01:19:07.083751" elapsed="0.000668"/>
</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-10-16T01:19:07.091321" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:07.090516" elapsed="0.000864"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:07.092380" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:07.091748" elapsed="0.000686"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:07.092529" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:19:07.092874" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:07.089680" elapsed="0.003247"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:07.093287" elapsed="0.000290"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:07.094679" 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-10-16T01:19:07.094007" elapsed="0.000762"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:07.095638" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:07.095133" elapsed="0.000557"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:07.096579" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:07.096052" elapsed="0.000582"/>
</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-10-16T01:19:07.105396" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:07.104003" elapsed="0.001501"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:07.105629" elapsed="0.000199"/>
</return>
<msg time="2026-10-16T01:19:07.106260" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:07.100684" elapsed="0.005700"/>
</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-10-16T01:19:07.130282" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:07.129846" elapsed="0.000473"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:07.131321" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:07.131021" elapsed="0.000400">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:07.131537" 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-10-16T01:19:07.130536" elapsed="0.001032"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:07.132270" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:07.131840" elapsed="0.000465"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:07.132687" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:07.132931" 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-10-16T01:19:07.132530" elapsed="0.000434"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:07.133539" 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-10-16T01:19:07.133232" elapsed="0.000363"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:07.135070" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:07.134597" elapsed="0.000515"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:07.135543" 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-10-16T01:19:07.135287" elapsed="0.000281"/>
</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-10-16T01:19:07.135890" 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-10-16T01:19:07.136075" elapsed="0.000022"/>
</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-10-16T01:19:07.136312" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:07.135744" elapsed="0.000621"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:07.135613" elapsed="0.000781"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:07.136439" elapsed="0.000029"/>
</return>
<msg time="2026-10-16T01:19:07.136572" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:07.134092" elapsed="0.002503"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:07.133685" elapsed="0.002939"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:07.136822" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:07.136650" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:07.133660" elapsed="0.003235"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:07.137441" 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-10-16T01:19:07.137049" elapsed="0.000417"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:07.137510" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:07.129089" elapsed="0.008520"/>
</kw>
<msg time="2026-10-16T01:19:07.137657" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:07.123201" elapsed="0.014520"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:07.141536" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:07.145333" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:07.149141" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:07.149322" elapsed="0.000020"/>
</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-10-16T01:19:07.149499" elapsed="0.000019"/>
</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-10-16T01:19:07.149868" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:07.149694" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:07.149682" 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-10-16T01:19:07.150094" elapsed="0.000019"/>
</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-10-16T01:19:07.150267" elapsed="0.000018"/>
</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-10-16T01:19:07.150426" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:07.149656" elapsed="0.000818"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:07.149568" elapsed="0.000959"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:07.150682" elapsed="0.000033"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:07.150766" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:19:07.150886" 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-10-16T01:19:07.122301" elapsed="0.028608"/>
</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-10-16T01:19:07.152017" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:07.151824" elapsed="0.000252">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:07.152157" 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-10-16T01:19:07.151475" elapsed="0.000705"/>
</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-10-16T01:19:07.152457" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:07.152243" elapsed="0.000266"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:07.153000" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:07.152718" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:07.152532" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:07.152227" elapsed="0.000878"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:07.153622" 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-10-16T01:19:07.153264" elapsed="0.000383"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:07.153691" elapsed="0.000046"/>
</return>
<msg time="2026-10-16T01:19:07.153863" 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-manganese/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-10-16T01:19:07.151174" elapsed="0.002713"/>
</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-10-16T01:19:07.155006" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:07.154802" elapsed="0.000262">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:07.155147" 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-10-16T01:19:07.154453" elapsed="0.000717"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:07.155330" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:19:07.155232" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:07.155216" elapsed="0.000192"/>
</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-10-16T01:19:07.155558" elapsed="0.000019"/>
</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-10-16T01:19:07.155748" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:07.155836" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:19:07.155961" 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-manganese/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-10-16T01:19:07.154135" elapsed="0.001850"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:07.157458" 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-10-16T01:19:07.157234" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:07.157935" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:07.157685" 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-10-16T01:19:07.162249" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:07.162333" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:07.162435" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:07.158256" elapsed="0.004578">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:07.158035" elapsed="0.004878">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:07.163096" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:07.162944" elapsed="0.000210"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:07.158018" elapsed="0.005161">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:07.163521" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:07.163641" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:07.163608" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:07.163592" 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-10-16T01:19:07.163870" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:07.163934" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:19:07.156428" elapsed="0.007609">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:07.164106" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:19:07.112548" elapsed="0.051696">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:07.164638" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:07.164418" elapsed="0.000327"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:07.164369" elapsed="0.000431"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:07.164887" elapsed="0.000040"/>
</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="FAIL" start="2026-10-16T01:19:07.110402" elapsed="0.054656">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:07.107103" elapsed="0.058057">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:07.107058" elapsed="0.058178">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:07.165485" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:07.165864" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:07.166184" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:07.166535" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:07.167043" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:07.167361" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:07.167749" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:07.168006" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:19:07.099361" elapsed="0.068747">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:07.168170" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:07.097519" elapsed="0.070740">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:07.168480" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:07.168340" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:07.168687" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:07.168552" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:07.168936" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:07.168792" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:07.168324" elapsed="0.000681"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:07.097158" elapsed="0.071886">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:07.096761" elapsed="0.072335">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:07.169145" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:07.088216" elapsed="0.081020">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:07.169411" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:07.169629" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:07.169488" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:07.169473" elapsed="0.000353"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:07.169961" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:07.170129" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:07.170187" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:07.086517" elapsed="0.083762">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:07.086040" elapsed="0.084301">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:07.085761" elapsed="0.084629">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:07.084953" elapsed="0.085524">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:07.170737" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:07.063362" elapsed="0.107495">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:08.190013" elapsed="0.000411"/>
</kw>
<msg time="2026-10-16T01:19:08.190542" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:08.188697" elapsed="0.001965"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:08.187813" elapsed="0.003066"/>
</kw>
<msg time="2026-10-16T01:19:08.190974" 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-10-16T01:19:08.181143" elapsed="0.009921"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:08.180152" elapsed="0.011061"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:08.192258" 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-10-16T01:19:08.191694" elapsed="0.000656"/>
</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-10-16T01:19:08.199022" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:08.198223" elapsed="0.000857"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:08.200079" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:08.199416" elapsed="0.000718"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:08.200228" elapsed="0.000063"/>
</return>
<msg time="2026-10-16T01:19:08.200514" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:08.197294" elapsed="0.003271"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:08.200958" elapsed="0.000288"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:08.202330" 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-10-16T01:19:08.201610" elapsed="0.000775"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:08.203278" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:08.202743" elapsed="0.000587"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:08.204199" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:08.203640" elapsed="0.000614"/>
</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-10-16T01:19:08.213032" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:08.211596" elapsed="0.001544"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:08.213266" elapsed="0.000136"/>
</return>
<msg time="2026-10-16T01:19:08.214091" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:08.208274" elapsed="0.005942"/>
</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-10-16T01:19:08.237852" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:08.237393" elapsed="0.000496"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:08.238977" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:08.238641" elapsed="0.000437">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:08.239195" 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-10-16T01:19:08.238182" elapsed="0.001045"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:08.239940" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:08.239464" elapsed="0.000512"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:08.240363" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:08.240560" 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-10-16T01:19:08.240205" elapsed="0.000388"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:08.241211" 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-10-16T01:19:08.240901" elapsed="0.000368"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:08.242757" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:08.242411" elapsed="0.000433"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:08.243524" 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-10-16T01:19:08.243120" elapsed="0.000450"/>
</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-10-16T01:19:08.244037" 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-10-16T01:19:08.244246" 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-10-16T01:19:08.244432" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:08.243881" elapsed="0.000602"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:08.243653" elapsed="0.000861"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:08.244554" elapsed="0.000032"/>
</return>
<msg time="2026-10-16T01:19:08.244725" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:08.241941" elapsed="0.002816"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:08.241515" elapsed="0.003288"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:08.244978" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:08.244830" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:08.241330" elapsed="0.003718"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:08.245596" 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-10-16T01:19:08.245202" elapsed="0.000419"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:08.245664" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:08.236639" elapsed="0.009140"/>
</kw>
<msg time="2026-10-16T01:19:08.245844" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:08.230999" elapsed="0.014892"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:08.249687" elapsed="0.000055"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:08.253522" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:08.257363" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:08.257545" 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-10-16T01:19:08.257739" 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-10-16T01:19:08.258130" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:08.257980" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:08.257965" 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-10-16T01:19:08.258357" elapsed="0.000019"/>
</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-10-16T01:19:08.258537" elapsed="0.000018"/>
</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-10-16T01:19:08.258710" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:08.257931" elapsed="0.000829"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:08.257828" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:08.258950" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:08.259017" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:19:08.259122" 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-10-16T01:19:08.230103" elapsed="0.029042"/>
</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-10-16T01:19:08.260257" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:08.260063" elapsed="0.000256">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:08.260402" 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-10-16T01:19:08.259722" elapsed="0.000703"/>
</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-10-16T01:19:08.260716" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:08.260487" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:08.261234" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:08.260972" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:08.260809" elapsed="0.000480"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:08.260470" elapsed="0.000839"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:08.261870" 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-10-16T01:19:08.261502" elapsed="0.000392"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:08.261939" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:19:08.262061" 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-manganese/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-10-16T01:19:08.259409" elapsed="0.002674"/>
</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-10-16T01:19:08.264875" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:08.263020" elapsed="0.001917">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:08.265023" 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-10-16T01:19:08.262664" elapsed="0.002382"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:08.265211" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:19:08.265111" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:08.265094" elapsed="0.000194"/>
</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-10-16T01:19:08.265440" elapsed="0.000020"/>
</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-10-16T01:19:08.265617" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:08.265676" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:08.265840" 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-manganese/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-10-16T01:19:08.262368" elapsed="0.003496"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:08.267087" 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-10-16T01:19:08.266859" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:08.267537" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:08.267314" 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-10-16T01:19:08.272217" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:08.272270" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:08.272375" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:08.267993" elapsed="0.004766">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:08.267747" elapsed="0.005104">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:08.273033" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:08.272883" elapsed="0.000208"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:08.267729" elapsed="0.005385">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:08.273448" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:08.273569" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:08.273535" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:08.273519" elapsed="0.000109"/>
</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-10-16T01:19:08.273783" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:08.273859" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:19:08.266137" elapsed="0.007830">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:08.274068" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:19:08.220427" elapsed="0.053779">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:08.274596" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:08.274376" elapsed="0.000302"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:08.274329" elapsed="0.000415"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:08.274886" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:19:08.218241" elapsed="0.056811">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:08.214673" elapsed="0.060478">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:08.214628" elapsed="0.060598">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:08.275472" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:08.275848" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:08.276160" elapsed="0.000019"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:08.276507" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:08.276975" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:08.277290" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:08.277644" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:08.277921" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:19:08.206957" elapsed="0.071066">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:08.278085" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:08.205094" elapsed="0.073080">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:08.278393" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:08.278254" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:08.278601" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:08.278466" elapsed="0.000184"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:08.278848" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:08.278672" elapsed="0.000225"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:08.278238" elapsed="0.000682"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:08.204738" elapsed="0.074220">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:08.204347" elapsed="0.074663">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:08.279057" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:08.195946" elapsed="0.083234">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:08.279358" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:08.279576" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:08.279436" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:08.279421" elapsed="0.000224"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:08.279898" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:08.280070" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:08.280127" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:08.194331" elapsed="0.085887">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:08.193880" elapsed="0.086401">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:08.193581" elapsed="0.086749">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:08.192846" elapsed="0.087564">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:08.280618" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:08.171656" elapsed="0.109081">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:09.300382" elapsed="0.000468"/>
</kw>
<msg time="2026-10-16T01:19:09.300973" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:09.299112" elapsed="0.001984"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:09.298164" elapsed="0.003092"/>
</kw>
<msg time="2026-10-16T01:19:09.301346" 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-10-16T01:19:09.291570" elapsed="0.009866"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:09.290674" elapsed="0.010911"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:09.302643" 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-10-16T01:19:09.302120" elapsed="0.000649"/>
</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-10-16T01:19:09.309406" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:09.308610" elapsed="0.000855"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:09.310466" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:09.309853" elapsed="0.000668"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:09.310772" elapsed="0.000091"/>
</return>
<msg time="2026-10-16T01:19:09.311110" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:09.307817" elapsed="0.003344"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:09.311497" elapsed="0.000401"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:09.313161" 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-10-16T01:19:09.312274" elapsed="0.000944"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:09.314126" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:09.313552" elapsed="0.000628"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:09.315059" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:09.314495" elapsed="0.000617"/>
</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-10-16T01:19:09.323962" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:09.322409" elapsed="0.001670"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:09.324206" elapsed="0.000133"/>
</return>
<msg time="2026-10-16T01:19:09.324985" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:09.319178" elapsed="0.005938"/>
</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-10-16T01:19:09.348275" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:09.347844" elapsed="0.000467"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:09.349322" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:09.349021" elapsed="0.000401">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:09.349540" 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-10-16T01:19:09.348533" elapsed="0.001038"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:09.350287" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:09.349850" elapsed="0.000472"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:09.350729" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:09.350952" 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-10-16T01:19:09.350551" elapsed="0.000434"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:09.351566" 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-10-16T01:19:09.351256" elapsed="0.000367"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:09.352821" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:09.352566" elapsed="0.000297"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:09.353438" 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-10-16T01:19:09.353038" elapsed="0.000425"/>
</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-10-16T01:19:09.353776" elapsed="0.000034"/>
</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-10-16T01:19:09.353975" 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-10-16T01:19:09.354158" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:09.353623" elapsed="0.000586"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:09.353507" elapsed="0.000733"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:09.354283" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:19:09.354450" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:09.352102" elapsed="0.002371"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:09.351730" elapsed="0.002773"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:09.354674" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:09.354529" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:09.351684" elapsed="0.003080"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:09.355337" 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-10-16T01:19:09.354936" elapsed="0.000426"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:09.355407" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:09.347095" elapsed="0.008411"/>
</kw>
<msg time="2026-10-16T01:19:09.355554" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:09.341289" elapsed="0.014311"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:09.359468" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:09.363295" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:09.367083" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:09.367263" elapsed="0.000020"/>
</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-10-16T01:19:09.367440" elapsed="0.000018"/>
</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-10-16T01:19:09.367809" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:09.367640" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:09.367626" 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-10-16T01:19:09.368040" elapsed="0.000019"/>
</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-10-16T01:19:09.368215" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:09.368374" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:09.367599" elapsed="0.000823"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:09.367509" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:09.368597" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:09.368664" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:09.368784" 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-10-16T01:19:09.340340" elapsed="0.028480"/>
</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-10-16T01:19:09.369963" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:09.369755" elapsed="0.000268">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:09.370105" 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-10-16T01:19:09.369417" elapsed="0.000711"/>
</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-10-16T01:19:09.370409" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:09.370192" elapsed="0.000269"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:09.370976" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:09.370643" elapsed="0.000358"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:09.370484" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:09.370175" elapsed="0.000878"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:09.371549" 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-10-16T01:19:09.371211" elapsed="0.000362"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:09.371619" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:19:09.371763" 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-manganese/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-10-16T01:19:09.369121" elapsed="0.002666"/>
</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-10-16T01:19:09.372900" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:09.372667" elapsed="0.000293">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:09.373043" 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-10-16T01:19:09.372348" elapsed="0.000717"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:09.373227" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:19:09.373129" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:09.373112" elapsed="0.000193"/>
</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-10-16T01:19:09.373461" elapsed="0.000020"/>
</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-10-16T01:19:09.373633" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:09.373693" elapsed="0.000033"/>
</return>
<msg time="2026-10-16T01:19:09.373857" 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-manganese/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-10-16T01:19:09.372051" elapsed="0.001831"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:09.375324" 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-10-16T01:19:09.375091" elapsed="0.000276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:09.375809" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:09.375559" 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-10-16T01:19:09.380333" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:09.380388" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:09.380529" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:09.376136" elapsed="0.004798">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:09.375911" elapsed="0.005102">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:09.381196" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:09.381044" elapsed="0.000211"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:09.375895" elapsed="0.005382">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:09.381688" elapsed="0.000041"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:09.381847" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:09.381811" elapsed="0.000075"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:09.381779" elapsed="0.000128"/>
</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-10-16T01:19:09.382045" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:09.382107" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:19:09.374350" elapsed="0.007859">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:09.382277" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:19:09.330612" elapsed="0.051801">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:09.382849" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:09.382589" elapsed="0.000345"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:09.382536" elapsed="0.000441"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:09.383063" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:19:09.328421" elapsed="0.054808">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:09.325578" elapsed="0.057750">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:09.325532" elapsed="0.057869">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:09.383649" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:09.384037" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:09.384354" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:09.384727" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:09.385184" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:09.385501" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:09.385901" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:09.386174" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:19:09.317853" elapsed="0.068425">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:09.386340" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:09.315973" elapsed="0.070457">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:09.386656" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:09.386513" elapsed="0.000218"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:09.386907" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:09.386756" elapsed="0.000201"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:09.387121" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:09.386979" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:09.386497" elapsed="0.000692"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:09.315582" elapsed="0.071646">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:09.315207" elapsed="0.072075">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:09.387332" elapsed="0.000013"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:09.306401" elapsed="0.081023">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:09.387601" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:09.387911" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:09.387680" elapsed="0.000280"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:09.387664" elapsed="0.000318"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:09.388108" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:09.388276" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:09.388334" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:09.304783" elapsed="0.083646">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:09.304297" elapsed="0.084195">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:09.304044" elapsed="0.084501">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:09.303248" elapsed="0.085382">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:09.388940" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:09.281538" elapsed="0.107510">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:10.408775" elapsed="0.000445"/>
</kw>
<msg time="2026-10-16T01:19:10.409340" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:10.407310" elapsed="0.002151"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:10.406366" elapsed="0.003255"/>
</kw>
<msg time="2026-10-16T01:19:10.409744" 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-10-16T01:19:10.399861" elapsed="0.009998"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:10.398968" elapsed="0.011044"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:10.411085" 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-10-16T01:19:10.410505" elapsed="0.000672"/>
</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-10-16T01:19:10.417907" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:10.417044" elapsed="0.000924"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:10.418977" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:10.418303" elapsed="0.000730"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:10.419130" elapsed="0.000065"/>
</return>
<msg time="2026-10-16T01:19:10.419424" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:10.416180" elapsed="0.003295"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:10.419863" elapsed="0.000301"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:10.421266" 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-10-16T01:19:10.420531" elapsed="0.000790"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:10.422211" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:10.421650" elapsed="0.000614"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:10.423140" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:10.422577" elapsed="0.000616"/>
</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-10-16T01:19:10.431980" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:10.430540" elapsed="0.001552"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:10.432224" elapsed="0.000133"/>
</return>
<msg time="2026-10-16T01:19:10.432985" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:10.427238" elapsed="0.005876"/>
</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-10-16T01:19:10.456289" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:10.455861" elapsed="0.000464"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:10.457326" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:10.457024" elapsed="0.000403">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:10.457545" 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-10-16T01:19:10.456541" elapsed="0.001036"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:10.458361" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:10.457924" elapsed="0.000473"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:10.458823" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:10.459023" 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-10-16T01:19:10.458627" elapsed="0.000430"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:10.459653" 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-10-16T01:19:10.459322" elapsed="0.000429"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:10.460893" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:10.460493" elapsed="0.000442"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:10.461369" 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-10-16T01:19:10.461110" 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-10-16T01:19:10.461679" elapsed="0.000037"/>
</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-10-16T01:19:10.461924" 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-10-16T01:19:10.462108" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:10.461549" elapsed="0.000611"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:10.461435" elapsed="0.000756"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:10.462233" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:10.462363" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:10.460158" elapsed="0.002228"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:10.459886" elapsed="0.002528"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:10.462586" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:10.462441" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:10.459860" elapsed="0.002796"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:10.463235" 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-10-16T01:19:10.462841" elapsed="0.000420"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:10.463305" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:10.455129" elapsed="0.008275"/>
</kw>
<msg time="2026-10-16T01:19:10.463452" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:10.449403" elapsed="0.014095"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:10.467300" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:10.471076" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:10.474889" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:10.475099" elapsed="0.000020"/>
</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-10-16T01:19:10.475277" 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-10-16T01:19:10.475618" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:10.475477" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:10.475463" elapsed="0.000229"/>
</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-10-16T01:19:10.475873" 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-10-16T01:19:10.476052" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:10.476212" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:10.475437" elapsed="0.000824"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:10.475346" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:10.476435" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:10.476503" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:19:10.476608" 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-10-16T01:19:10.448543" elapsed="0.028089"/>
</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-10-16T01:19:10.477745" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:10.477538" elapsed="0.000281">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:10.477903" 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-10-16T01:19:10.477218" elapsed="0.000708"/>
</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-10-16T01:19:10.478202" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:10.477988" elapsed="0.000266"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:10.478725" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:10.478446" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:10.478277" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:10.477971" elapsed="0.000844"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:10.479310" 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-10-16T01:19:10.478975" elapsed="0.000359"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:10.479379" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:10.479502" 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-manganese/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-10-16T01:19:10.476921" elapsed="0.002603"/>
</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-10-16T01:19:10.480610" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:10.480407" elapsed="0.000262">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:10.480772" 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-10-16T01:19:10.480093" elapsed="0.000702"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:10.481016" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:19:10.480916" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:10.480898" elapsed="0.000195"/>
</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-10-16T01:19:10.481242" elapsed="0.000020"/>
</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-10-16T01:19:10.481412" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:10.481473" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:10.481596" 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-manganese/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-10-16T01:19:10.479786" elapsed="0.001834"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:10.483046" 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-10-16T01:19:10.482819" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:10.483492" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:10.483275" elapsed="0.000256"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:19:10.488266" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:10.488320" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:10.488419" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:10.483873" elapsed="0.004946">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:10.483591" elapsed="0.005309">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:10.489080" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:10.488932" elapsed="0.000206"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:10.483574" elapsed="0.005586">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:10.489496" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:10.489620" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:10.489584" elapsed="0.000073"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:10.489566" elapsed="0.000111"/>
</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-10-16T01:19:10.489849" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:10.489913" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:19:10.482092" elapsed="0.007922">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:10.490082" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:19:10.438667" elapsed="0.051541">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:10.490597" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:10.490379" elapsed="0.000356"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:10.490328" elapsed="0.000451"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:10.490881" elapsed="0.000037"/>
</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="FAIL" start="2026-10-16T01:19:10.436517" elapsed="0.054530">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:10.433574" elapsed="0.057574">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:10.433529" elapsed="0.057694">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:10.491470" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:10.491845" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:10.492164" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:10.492514" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:10.492993" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:10.493309" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:10.493657" elapsed="0.000019"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:10.493941" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:19:10.425923" elapsed="0.068120">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:10.494104" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:10.424045" elapsed="0.070148">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:10.494413" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:10.494273" elapsed="0.000190"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:10.494621" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:10.494485" elapsed="0.000184"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:10.494895" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:10.494690" elapsed="0.000255"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:10.494258" elapsed="0.000709"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:10.423662" elapsed="0.071344">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:10.423286" elapsed="0.071772">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:10.495105" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:10.414821" elapsed="0.080375">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:10.495371" elapsed="0.000048"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:10.495622" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:10.495481" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:10.495466" elapsed="0.000225"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:10.495952" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:10.496122" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:10.496181" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:10.413198" elapsed="0.083077">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:10.412691" elapsed="0.083646">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:10.412442" elapsed="0.083943">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:10.411626" elapsed="0.084840">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:10.496675" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:10.389906" elapsed="0.106892">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:11.516183" elapsed="0.000410"/>
</kw>
<msg time="2026-10-16T01:19:11.516744" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:11.514930" elapsed="0.001959"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:11.513997" elapsed="0.003057"/>
</kw>
<msg time="2026-10-16T01:19:11.517144" 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-10-16T01:19:11.507196" elapsed="0.010039"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:11.506306" elapsed="0.011079"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:11.518440" 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-10-16T01:19:11.517921" elapsed="0.000611"/>
</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-10-16T01:19:11.525117" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:11.524333" elapsed="0.000841"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:11.526166" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:11.525507" elapsed="0.000713"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:11.526315" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:19:11.526601" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:11.523504" elapsed="0.003147"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:11.527038" elapsed="0.000286"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:11.528667" 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-10-16T01:19:11.527688" elapsed="0.001070"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:11.529627" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:11.529118" elapsed="0.000562"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:11.530543" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:11.530046" elapsed="0.000549"/>
</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-10-16T01:19:11.539357" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:11.537965" elapsed="0.001499"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:11.539589" elapsed="0.000177"/>
</return>
<msg time="2026-10-16T01:19:11.540225" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:11.534644" elapsed="0.005705"/>
</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-10-16T01:19:11.564830" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:11.564367" elapsed="0.000502"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:11.565862" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:11.565527" elapsed="0.000439">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:11.566085" 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-10-16T01:19:11.565087" elapsed="0.001030"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:11.566822" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:11.566351" elapsed="0.000509"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:11.567244" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:11.567443" 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-10-16T01:19:11.567088" elapsed="0.000388"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:11.568089" 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-10-16T01:19:11.567761" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:11.569463" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:11.569233" elapsed="0.000271"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:11.569966" 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-10-16T01:19:11.569677" 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-10-16T01:19:11.570272" 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-10-16T01:19:11.570454" 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-10-16T01:19:11.570633" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:11.570144" elapsed="0.000545"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:11.570033" elapsed="0.000702"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:11.570777" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:11.570922" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:11.568829" elapsed="0.002116"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:11.568393" elapsed="0.002580"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:11.571145" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:11.571000" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:11.568207" elapsed="0.003007"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:11.571774" 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-10-16T01:19:11.571369" elapsed="0.000479"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:11.571894" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:11.563635" elapsed="0.008363"/>
</kw>
<msg time="2026-10-16T01:19:11.572045" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:11.557999" elapsed="0.014092"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:11.575994" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:11.579761" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:11.583608" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:11.583798" elapsed="0.000033"/>
</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-10-16T01:19:11.583989" elapsed="0.000019"/>
</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-10-16T01:19:11.584327" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:11.584187" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:11.584173" elapsed="0.000227"/>
</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-10-16T01:19:11.584550" elapsed="0.000018"/>
</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-10-16T01:19:11.584738" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:11.584910" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:11.584147" elapsed="0.000812"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:11.584059" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:11.585130" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:11.585197" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:11.585301" 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-10-16T01:19:11.557113" elapsed="0.028211"/>
</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-10-16T01:19:11.586457" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:11.586267" elapsed="0.000250">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:11.586598" 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-10-16T01:19:11.585944" elapsed="0.000677"/>
</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-10-16T01:19:11.586934" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:11.586683" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:11.587434" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:11.587170" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:11.587009" elapsed="0.000481"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:11.586666" elapsed="0.000843"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:11.588032" 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-10-16T01:19:11.587666" elapsed="0.000390"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:11.588100" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:11.588222" 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-manganese/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-10-16T01:19:11.585584" elapsed="0.002661"/>
</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-10-16T01:19:11.590930" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:11.589126" elapsed="0.001866">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:11.591078" 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-10-16T01:19:11.588798" elapsed="0.002303"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:11.591266" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:19:11.591166" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:11.591149" elapsed="0.000193"/>
</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-10-16T01:19:11.591492" elapsed="0.000020"/>
</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-10-16T01:19:11.591661" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:11.591740" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:19:11.591879" 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-manganese/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-10-16T01:19:11.588487" elapsed="0.003415"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:11.593250" 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-10-16T01:19:11.592893" elapsed="0.000401"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:11.593720" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:11.593483" 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-10-16T01:19:11.597960" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:11.598014" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:11.598120" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:11.594065" elapsed="0.004419">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:11.593839" elapsed="0.004752">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:11.598791" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:11.598623" elapsed="0.000244"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:11.593805" elapsed="0.005084">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:11.599219" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:11.599338" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:11.599305" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:11.599289" elapsed="0.000107"/>
</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-10-16T01:19:11.599530" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:11.599592" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:19:11.592170" elapsed="0.007543">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:11.599784" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:19:11.546467" elapsed="0.053464">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:11.600316" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:11.600099" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:11.600051" elapsed="0.000389"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:11.600524" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:19:11.544134" elapsed="0.056558">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:11.541068" elapsed="0.059767">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:11.541021" elapsed="0.059890">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:11.601154" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:11.601497" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:11.601833" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:11.602184" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:11.602610" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:11.602965" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:11.603312" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:11.603555" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:19:11.533330" elapsed="0.070324">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:11.603781" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:11.531458" elapsed="0.072432">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:11.604110" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:11.603970" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:11.604317" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:11.604181" elapsed="0.000184"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:11.604527" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:11.604387" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:11.603954" elapsed="0.000640"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:11.531131" elapsed="0.073501">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:11.530688" elapsed="0.073996">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:11.604756" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:11.522153" elapsed="0.082708">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:11.605037" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:11.605252" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:11.605114" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:11.605099" elapsed="0.000239"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:11.605463" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:11.605631" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:11.605694" elapsed="0.000137"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:11.520525" elapsed="0.085389">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:11.520075" elapsed="0.085900">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:11.519798" elapsed="0.086226">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:11.519031" elapsed="0.087074">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:11.606313" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:11.497541" elapsed="0.108876">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:12.625784" elapsed="0.000437"/>
</kw>
<msg time="2026-10-16T01:19:12.626343" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:12.624484" elapsed="0.002092"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:12.623539" elapsed="0.003235"/>
</kw>
<msg time="2026-10-16T01:19:12.626894" 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-10-16T01:19:12.616980" elapsed="0.010010"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:12.616084" elapsed="0.011058"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:12.628228" 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-10-16T01:19:12.627652" elapsed="0.000668"/>
</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-10-16T01:19:12.634980" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:12.634161" elapsed="0.000877"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:12.636028" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:12.635371" elapsed="0.000712"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:12.636181" elapsed="0.000065"/>
</return>
<msg time="2026-10-16T01:19:12.636474" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:12.633323" elapsed="0.003201"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:12.636909" elapsed="0.000292"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:12.638304" 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-10-16T01:19:12.637569" elapsed="0.000791"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:12.639249" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:12.638689" elapsed="0.000613"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:12.640181" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:12.639614" elapsed="0.000620"/>
</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-10-16T01:19:12.649237" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:12.647599" elapsed="0.001754"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:12.649485" elapsed="0.000135"/>
</return>
<msg time="2026-10-16T01:19:12.650317" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:12.644297" elapsed="0.006146"/>
</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-10-16T01:19:12.673664" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:12.673237" elapsed="0.000484"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:12.674717" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:12.674399" elapsed="0.000438">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:12.674959" 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-10-16T01:19:12.673955" elapsed="0.001036"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:12.675660" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:12.675227" elapsed="0.000468"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:12.676124" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:12.676372" 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-10-16T01:19:12.675963" elapsed="0.000443"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:12.677080" 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-10-16T01:19:12.676683" elapsed="0.000440"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:12.678044" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:12.677800" elapsed="0.000285"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:12.678658" 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-10-16T01:19:12.678259" elapsed="0.000423"/>
</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-10-16T01:19:12.679000" elapsed="0.000020"/>
</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-10-16T01:19:12.679185" elapsed="0.000022"/>
</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-10-16T01:19:12.679365" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:12.678869" elapsed="0.000547"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:12.678743" elapsed="0.000703"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:12.679488" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:12.679619" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:12.677447" elapsed="0.002195"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:12.677186" 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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:12.679871" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:12.679697" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:12.677168" elapsed="0.002775"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:12.680492" 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-10-16T01:19:12.680098" elapsed="0.000420"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:12.680562" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:12.672489" elapsed="0.008173"/>
</kw>
<msg time="2026-10-16T01:19:12.680732" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:12.666779" elapsed="0.014001"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:12.684599" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:12.688428" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:12.692237" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:12.692449" 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-10-16T01:19:12.692633" elapsed="0.000019"/>
</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-10-16T01:19:12.693005" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:12.692862" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:12.692848" 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-10-16T01:19:12.693236" elapsed="0.000019"/>
</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-10-16T01:19:12.693414" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:12.693574" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:12.692808" elapsed="0.000814"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:12.692715" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:12.693825" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:12.693896" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:12.694002" 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-10-16T01:19:12.665935" elapsed="0.028090"/>
</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-10-16T01:19:12.695137" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:12.694941" elapsed="0.000256">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:12.695279" 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-10-16T01:19:12.694586" elapsed="0.000716"/>
</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-10-16T01:19:12.695612" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:12.695365" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:12.696152" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:12.695880" elapsed="0.000297"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:12.695688" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:12.695348" elapsed="0.000881"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:12.696748" 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-10-16T01:19:12.696390" elapsed="0.000384"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:12.696836" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:19:12.696962" 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-manganese/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-10-16T01:19:12.694290" elapsed="0.002695"/>
</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-10-16T01:19:12.698089" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:12.697888" elapsed="0.000260">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:12.698232" 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-10-16T01:19:12.697536" elapsed="0.000718"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:12.698425" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:19:12.698319" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:12.698301" elapsed="0.000202"/>
</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-10-16T01:19:12.698658" elapsed="0.000020"/>
</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-10-16T01:19:12.698917" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:12.698982" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:19:12.699116" 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-manganese/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-10-16T01:19:12.697236" elapsed="0.001903"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:12.700575" 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-10-16T01:19:12.700347" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:12.701251" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:12.701022" elapsed="0.000271"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:19:12.705974" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:12.706048" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:12.706190" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:12.701586" elapsed="0.005102">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:12.701355" elapsed="0.005491">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:12.707107" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:12.706892" elapsed="0.000296"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:12.701338" elapsed="0.005880">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:12.707744" elapsed="0.000044"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:12.707980" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:12.707921" elapsed="0.000112"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:12.707893" elapsed="0.000165"/>
</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-10-16T01:19:12.708205" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:12.708269" elapsed="0.000013"/>
</return>
<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="FAIL" start="2026-10-16T01:19:12.699588" elapsed="0.008786">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:12.708442" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:19:12.655955" elapsed="0.052627">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:12.709014" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:12.708780" elapsed="0.000322"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:12.708728" elapsed="0.000416"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:12.709228" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:19:12.653757" elapsed="0.055681">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:12.650972" elapsed="0.058568">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:12.650925" elapsed="0.058699">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:12.709916" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:12.710276" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:12.710597" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:12.710993" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:12.711432" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:12.711772" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:12.712137" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:12.712379" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:19:12.642965" elapsed="0.069518">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:12.712547" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:12.641085" elapsed="0.071552">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:12.712908" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:12.712746" elapsed="0.000213"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:12.713121" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:12.712982" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:12.713336" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:12.713193" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:12.712728" elapsed="0.000676"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:12.640695" elapsed="0.072747">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:12.640328" elapsed="0.073170">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:12.713548" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:12.631974" elapsed="0.081665">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:12.713914" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:12.714139" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:12.713998" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:12.713981" elapsed="0.000227"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:12.714387" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:12.714560" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:12.714618" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:12.630339" elapsed="0.084451">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:12.629879" elapsed="0.084995">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:12.629572" elapsed="0.085353">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:12.628801" elapsed="0.086208">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:12.715232" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:12.607243" elapsed="0.108095">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:13.734940" elapsed="0.000424"/>
</kw>
<msg time="2026-10-16T01:19:13.735492" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:13.733528" elapsed="0.002091"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:13.732541" elapsed="0.003312"/>
</kw>
<msg time="2026-10-16T01:19:13.735954" 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-10-16T01:19:13.725961" elapsed="0.010087"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:13.725059" elapsed="0.011137"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:13.737268" 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-10-16T01:19:13.736691" elapsed="0.000671"/>
</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-10-16T01:19:13.744576" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:13.743817" elapsed="0.000818"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:13.745637" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:13.745037" elapsed="0.000655"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:13.745839" elapsed="0.000066"/>
</return>
<msg time="2026-10-16T01:19:13.746134" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:13.742990" elapsed="0.003197"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:13.746516" elapsed="0.000338"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:13.747967" 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-10-16T01:19:13.747224" elapsed="0.000799"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:13.749207" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:13.748350" elapsed="0.001000"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:13.750875" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:13.749923" elapsed="0.001010"/>
</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-10-16T01:19:13.760066" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:13.758628" elapsed="0.001549"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:13.760309" elapsed="0.000147"/>
</return>
<msg time="2026-10-16T01:19:13.760961" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:13.755386" elapsed="0.005656"/>
</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-10-16T01:19:13.783641" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:13.783211" elapsed="0.000466"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:13.784767" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:13.784384" elapsed="0.000515">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:13.785020" 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-10-16T01:19:13.783936" elapsed="0.001116"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:13.785747" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:13.785290" elapsed="0.000495"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:13.786199" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:13.786401" 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-10-16T01:19:13.786035" elapsed="0.000400"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:13.787130" 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-10-16T01:19:13.786728" elapsed="0.000449"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:13.788219" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:13.787855" elapsed="0.000405"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:13.788714" 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-10-16T01:19:13.788436" 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-10-16T01:19:13.789054" elapsed="0.000020"/>
</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-10-16T01:19:13.789240" elapsed="0.000022"/>
</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-10-16T01:19:13.789424" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:13.788921" elapsed="0.000555"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:13.788785" elapsed="0.000721"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:13.789549" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:13.789678" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:13.787495" elapsed="0.002221"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:13.787238" elapsed="0.002508"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:13.789936" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:13.789774" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:13.787221" elapsed="0.002787"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:13.790562" 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-10-16T01:19:13.790165" elapsed="0.000422"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:13.790630" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:13.782477" elapsed="0.008268"/>
</kw>
<msg time="2026-10-16T01:19:13.790848" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:13.776775" elapsed="0.014124"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:13.794662" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:13.798448" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:13.802196" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:13.802373" elapsed="0.000020"/>
</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-10-16T01:19:13.802550" elapsed="0.000019"/>
</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-10-16T01:19:13.802920" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:13.802763" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:13.802749" 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-10-16T01:19:13.803145" 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-10-16T01:19:13.803336" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:13.803496" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:13.802722" elapsed="0.000822"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:13.802619" elapsed="0.000948"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:13.803732" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:13.803801" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:13.803920" 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-10-16T01:19:13.775925" elapsed="0.028018"/>
</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-10-16T01:19:13.805060" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:13.804856" elapsed="0.000264">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:13.805242" 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-10-16T01:19:13.804499" 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-10-16T01:19:13.805547" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:13.805330" elapsed="0.000269"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:13.806106" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:13.805840" elapsed="0.000290"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:13.805622" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:13.805313" elapsed="0.000869"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:13.806675" 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-10-16T01:19:13.806341" elapsed="0.000377"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:13.806765" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:13.806909" 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-manganese/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-10-16T01:19:13.804202" elapsed="0.002730"/>
</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-10-16T01:19:13.808108" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:13.807806" elapsed="0.000364">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:13.808254" 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-10-16T01:19:13.807472" elapsed="0.000805"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:13.808438" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:19:13.808339" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:13.808323" elapsed="0.000192"/>
</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-10-16T01:19:13.808664" elapsed="0.000020"/>
</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-10-16T01:19:13.808871" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:13.808932" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:13.809056" 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-manganese/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-10-16T01:19:13.807175" elapsed="0.001904"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:13.810610" 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-10-16T01:19:13.810383" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:13.811099" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:13.810879" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:19:13.815484" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:13.815539" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:13.815642" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:13.811424" elapsed="0.004637">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:13.811199" elapsed="0.004946">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:13.816324" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:13.816174" elapsed="0.000236"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:13.811182" elapsed="0.005253">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:13.816803" elapsed="0.000042"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:13.816944" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:13.816911" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:13.816894" elapsed="0.000108"/>
</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-10-16T01:19:13.817139" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:13.817202" elapsed="0.000013"/>
</return>
<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="FAIL" start="2026-10-16T01:19:13.809521" elapsed="0.007784">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:13.817373" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:19:13.766213" elapsed="0.051285">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:13.817922" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:13.817666" elapsed="0.000339"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:13.817618" elapsed="0.000429"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:13.818131" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:19:13.764062" elapsed="0.054233">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:13.761341" elapsed="0.057053">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:13.761312" elapsed="0.057157">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:13.818730" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:13.819098" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:13.819411" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:13.819782" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:13.820227" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:13.820541" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:13.820946" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:13.821187" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:19:13.754064" elapsed="0.067224">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:13.821349" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:13.751971" elapsed="0.069467">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:13.821693" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:13.821553" elapsed="0.000212"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:13.821940" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:13.821787" elapsed="0.000203"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:13.822155" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:13.822012" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:13.821536" elapsed="0.000687"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:13.751510" elapsed="0.070751">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:13.751047" elapsed="0.071267">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:13.822362" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:13.741494" elapsed="0.080961">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:13.822632" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:13.822988" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:13.822842" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:13.822696" elapsed="0.000362"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:13.823185" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:13.823352" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:13.823410" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:13.739440" elapsed="0.084062">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:13.738959" elapsed="0.084607">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:13.738611" elapsed="0.085005">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:13.737863" elapsed="0.085849">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:13.823956" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:13.716220" elapsed="0.107846">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:14.843161" elapsed="0.000414"/>
</kw>
<msg time="2026-10-16T01:19:14.843729" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:14.841906" elapsed="0.001967"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:14.840973" elapsed="0.003064"/>
</kw>
<msg time="2026-10-16T01:19:14.844234" 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-10-16T01:19:14.834377" elapsed="0.009979"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:14.833502" elapsed="0.011012"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:14.845574" 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-10-16T01:19:14.845053" elapsed="0.000611"/>
</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-10-16T01:19:14.852439" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:14.851643" elapsed="0.000853"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:14.853487" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:14.852885" elapsed="0.000656"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:14.853636" elapsed="0.000092"/>
</return>
<msg time="2026-10-16T01:19:14.853988" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:14.850868" elapsed="0.003172"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:14.854371" elapsed="0.000283"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:14.855877" 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-10-16T01:19:14.855151" elapsed="0.000784"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:14.856796" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:14.856263" elapsed="0.000607"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:14.857673" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:14.857178" elapsed="0.000577"/>
</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-10-16T01:19:14.866525" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:14.865108" elapsed="0.001526"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:14.866808" elapsed="0.000167"/>
</return>
<msg time="2026-10-16T01:19:14.867432" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:14.861759" elapsed="0.005799"/>
</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-10-16T01:19:14.890063" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:14.889601" elapsed="0.000499"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:14.891080" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:14.890767" elapsed="0.000414">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:14.891299" 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-10-16T01:19:14.890312" elapsed="0.001017"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:14.892029" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:14.891560" elapsed="0.000504"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:14.892445" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:14.892640" 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-10-16T01:19:14.892290" elapsed="0.000383"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:14.893335" 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-10-16T01:19:14.892977" elapsed="0.000415"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:14.894718" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:14.894477" elapsed="0.000284"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:14.895211" 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-10-16T01:19:14.894952" 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-10-16T01:19:14.895514" elapsed="0.000020"/>
</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-10-16T01:19:14.895696" elapsed="0.000038"/>
</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-10-16T01:19:14.895911" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:14.895387" elapsed="0.000576"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:14.895278" elapsed="0.000715"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:14.896034" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:14.896163" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:14.894125" elapsed="0.002060"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:14.893637" 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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:14.896381" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:14.896239" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:14.893454" elapsed="0.002996"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:14.897028" 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-10-16T01:19:14.896604" elapsed="0.000449"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:14.897096" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:14.888909" elapsed="0.008286"/>
</kw>
<msg time="2026-10-16T01:19:14.897242" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:14.883206" elapsed="0.014082"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:14.901159" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:14.904956" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:14.908689" elapsed="0.000038"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:14.908897" elapsed="0.000020"/>
</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-10-16T01:19:14.909075" elapsed="0.000019"/>
</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-10-16T01:19:14.909444" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:14.909271" elapsed="0.000226"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:14.909258" elapsed="0.000262"/>
</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-10-16T01:19:14.909671" elapsed="0.000019"/>
</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-10-16T01:19:14.909877" 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-10-16T01:19:14.910040" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:14.909232" elapsed="0.000856"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:14.909144" elapsed="0.000967"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:14.910260" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:14.910327" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:14.910430" 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-10-16T01:19:14.882348" elapsed="0.028105"/>
</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-10-16T01:19:14.911554" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:14.911362" elapsed="0.000252">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:14.911712" 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-10-16T01:19:14.911044" elapsed="0.000692"/>
</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-10-16T01:19:14.912031" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:14.911799" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:14.912524" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:14.912262" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:14.912106" elapsed="0.000473"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:14.911783" elapsed="0.000816"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:14.913127" 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-10-16T01:19:14.912771" elapsed="0.000380"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:14.913197" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:19:14.913319" 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-manganese/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-10-16T01:19:14.910731" elapsed="0.002610"/>
</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-10-16T01:19:14.916070" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:14.914228" elapsed="0.001902">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:14.916215" 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-10-16T01:19:14.913914" elapsed="0.002324"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:14.916400" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:19:14.916302" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:14.916285" elapsed="0.000191"/>
</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-10-16T01:19:14.916628" elapsed="0.000020"/>
</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-10-16T01:19:14.916817" elapsed="0.000032"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:14.916892" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:19:14.917019" 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-manganese/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-10-16T01:19:14.913584" elapsed="0.003495"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:14.918475" 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-10-16T01:19:14.918245" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:14.918963" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:14.918721" 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-10-16T01:19:14.923263" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:14.923316" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:14.923420" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:14.919284" elapsed="0.004517">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:14.919063" elapsed="0.004839">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:14.924088" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:14.923939" elapsed="0.000207"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:14.919047" elapsed="0.005121">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:14.924502" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:14.924620" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:14.924588" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:14.924572" elapsed="0.000106"/>
</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-10-16T01:19:14.924842" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:14.924908" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:19:14.917355" elapsed="0.007655">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:14.925078" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:19:14.872675" elapsed="0.052529">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:14.925588" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:14.925372" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:14.925324" elapsed="0.000413"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:14.925836" elapsed="0.000038"/>
</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="FAIL" start="2026-10-16T01:19:14.870517" elapsed="0.055488">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:14.868185" elapsed="0.057949">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:14.868155" elapsed="0.058054">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:14.926455" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:14.926818" elapsed="0.000037"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:14.927151" elapsed="0.000019"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:14.927500" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:14.927984" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:14.928301" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:14.928649" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:14.928932" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:19:14.860406" elapsed="0.068627">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:14.929095" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:14.858570" elapsed="0.070613">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:14.929400" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:14.929261" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:14.929608" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:14.929472" elapsed="0.000188"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:14.929859" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:14.929681" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:14.929245" elapsed="0.000685"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:14.858241" elapsed="0.071727">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:14.857873" elapsed="0.072146">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:14.930067" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:14.849467" elapsed="0.080689">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:14.930329" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:14.930545" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:14.930406" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:14.930392" elapsed="0.000220"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:14.930875" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:14.931046" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:14.931104" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:14.847681" elapsed="0.083548">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:14.847229" elapsed="0.084062">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:14.846979" elapsed="0.084360">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:14.846168" elapsed="0.085250">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:14.931625" elapsed="0.000021"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:14.824926" elapsed="0.106817">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:15.950970" elapsed="0.000410"/>
</kw>
<msg time="2026-10-16T01:19:15.951497" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:15.949655" elapsed="0.001958"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:15.948741" elapsed="0.003060"/>
</kw>
<msg time="2026-10-16T01:19:15.951914" 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-10-16T01:19:15.942153" elapsed="0.009854"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:15.941271" elapsed="0.010884"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:15.953209" 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-10-16T01:19:15.952636" elapsed="0.000664"/>
</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-10-16T01:19:15.959877" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:15.959079" elapsed="0.000859"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:15.960944" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:15.960277" elapsed="0.000722"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:15.961095" elapsed="0.000106"/>
</return>
<msg time="2026-10-16T01:19:15.961438" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:15.958244" elapsed="0.003248"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:15.961880" elapsed="0.000297"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:15.963276" 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-10-16T01:19:15.962546" elapsed="0.000786"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:15.964235" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:15.963664" elapsed="0.000625"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:15.965168" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:15.964598" elapsed="0.000624"/>
</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-10-16T01:19:15.974071" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:15.972529" elapsed="0.001749"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:15.974411" elapsed="0.000133"/>
</return>
<msg time="2026-10-16T01:19:15.975197" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:15.969309" elapsed="0.006013"/>
</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-10-16T01:19:15.998978" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:15.998511" elapsed="0.000503"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:16.000009" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:15.999674" elapsed="0.000435">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:16.000227" 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-10-16T01:19:15.999233" elapsed="0.001026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:16.000969" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:16.000494" elapsed="0.000511"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:16.001388" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:16.001587" 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-10-16T01:19:16.001232" elapsed="0.000389"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:16.002288" 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-10-16T01:19:16.001951" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:16.003243" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:16.003011" elapsed="0.000274"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:16.003885" 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-10-16T01:19:16.003458" elapsed="0.000453"/>
</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-10-16T01:19:16.004197" elapsed="0.000020"/>
</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-10-16T01:19:16.004381" 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-10-16T01:19:16.004561" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:16.004066" elapsed="0.000548"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:16.003954" elapsed="0.000689"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:16.004684" elapsed="0.000041"/>
</return>
<msg time="2026-10-16T01:19:16.004845" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:16.002642" elapsed="0.002228"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:16.002389" elapsed="0.002511"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:16.005071" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:16.004926" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:16.002372" elapsed="0.002770"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:16.005688" 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-10-16T01:19:16.005296" elapsed="0.000435"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:16.005776" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:15.997727" elapsed="0.008171"/>
</kw>
<msg time="2026-10-16T01:19:16.005985" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:15.991950" elapsed="0.014084"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:16.009935" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:16.013684" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:16.017454" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:16.017634" elapsed="0.000020"/>
</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-10-16T01:19:16.017871" 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-10-16T01:19:16.018224" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:16.018075" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:16.018061" 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-10-16T01:19:16.018448" 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-10-16T01:19:16.018624" elapsed="0.000018"/>
</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-10-16T01:19:16.018800" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:16.018035" elapsed="0.000828"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:16.017945" elapsed="0.000942"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:16.019037" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:16.019104" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:19:16.019209" 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-10-16T01:19:15.991003" elapsed="0.028229"/>
</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-10-16T01:19:16.020335" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:16.020145" elapsed="0.000249">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:16.020508" 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-10-16T01:19:16.019810" elapsed="0.000720"/>
</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-10-16T01:19:16.020828" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:16.020595" elapsed="0.000338"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:16.021394" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:16.021128" elapsed="0.000291"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:16.020958" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:16.020578" elapsed="0.000894"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:16.022012" 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-10-16T01:19:16.021629" elapsed="0.000407"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:16.022082" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:16.022207" 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-manganese/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-10-16T01:19:16.019497" elapsed="0.002733"/>
</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-10-16T01:19:16.023335" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:16.023131" elapsed="0.000264">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:16.023480" 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-10-16T01:19:16.022796" elapsed="0.000708"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:16.023666" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:19:16.023568" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:16.023550" elapsed="0.000214"/>
</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-10-16T01:19:16.023928" 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-10-16T01:19:16.024101" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:16.024162" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:16.024286" 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-manganese/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-10-16T01:19:16.022475" elapsed="0.001834"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:16.026103" 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-10-16T01:19:16.025870" elapsed="0.000276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:16.026552" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:16.026333" elapsed="0.000259"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:19:16.031075" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:16.031140" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:16.031304" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:16.026925" elapsed="0.004889">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:16.026653" elapsed="0.005291">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:16.032197" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:16.031988" elapsed="0.000292"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:16.026636" elapsed="0.005674">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:16.032801" elapsed="0.000048"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:16.033031" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:16.032984" elapsed="0.000104"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:16.032960" elapsed="0.000157"/>
</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-10-16T01:19:16.033307" elapsed="0.000028"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:16.033395" elapsed="0.000020"/>
</return>
<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="FAIL" start="2026-10-16T01:19:16.024915" elapsed="0.008623">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:16.033634" elapsed="0.000022"/>
</return>
<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="FAIL" start="2026-10-16T01:19:15.981168" elapsed="0.052682">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:16.034393" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:16.034090" elapsed="0.000418"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:16.034023" elapsed="0.000545"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:16.034685" 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="FAIL" start="2026-10-16T01:19:15.979020" elapsed="0.055947">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:15.975810" elapsed="0.059301">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:15.975765" elapsed="0.059448">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:16.035558" elapsed="0.000033"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:16.036083" elapsed="0.000029"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:16.036518" elapsed="0.000028"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:16.037055" elapsed="0.000031"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:16.037655" elapsed="0.000031"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:16.038154" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:16.038643" elapsed="0.000028"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:16.039018" elapsed="0.000025"/>
</return>
<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="FAIL" start="2026-10-16T01:19:15.967991" elapsed="0.071171">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:16.039249" elapsed="0.000022"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:15.966076" elapsed="0.073300">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:16.039684" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:16.039488" elapsed="0.000297"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:16.040202" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:16.039817" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:16.040513" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:16.040309" elapsed="0.000269"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:16.039465" elapsed="0.001144"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:15.965688" elapsed="0.074979">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:15.965316" elapsed="0.075556">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:16.040951" elapsed="0.000027"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:15.956893" elapsed="0.084201">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:16.041346" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:16.041651" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:16.041457" elapsed="0.000393"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:16.041436" elapsed="0.000448"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:16.042063" elapsed="0.000026"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:16.042298" elapsed="0.000025"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:16.042380" elapsed="0.000019"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:15.955279" elapsed="0.087232">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:15.954806" elapsed="0.087793">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:15.954529" elapsed="0.088141">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:15.953774" elapsed="0.089035">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:16.043138" elapsed="0.000032"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:15.932498" elapsed="0.110790">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:17.062505" elapsed="0.000646"/>
</kw>
<msg time="2026-10-16T01:19:17.063292" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:17.061251" elapsed="0.002184"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:17.060289" elapsed="0.003333"/>
</kw>
<msg time="2026-10-16T01:19:17.063777" 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-10-16T01:19:17.053749" elapsed="0.010171"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:17.052883" elapsed="0.011210"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:17.065305" 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-10-16T01:19:17.064686" elapsed="0.000715"/>
</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-10-16T01:19:17.072147" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:17.071320" elapsed="0.000886"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:17.073257" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:17.072541" elapsed="0.000770"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:17.073408" elapsed="0.000063"/>
</return>
<msg time="2026-10-16T01:19:17.073696" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:17.070482" elapsed="0.003299"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:17.074187" elapsed="0.000287"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:17.075603" 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-10-16T01:19:17.074902" elapsed="0.000756"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:17.076560" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:17.076055" elapsed="0.000557"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:17.077475" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:17.076976" elapsed="0.000552"/>
</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-10-16T01:19:17.086499" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:17.085103" elapsed="0.001504"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:17.086773" elapsed="0.000178"/>
</return>
<msg time="2026-10-16T01:19:17.087400" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:17.081661" elapsed="0.005863"/>
</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-10-16T01:19:17.110501" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:17.110080" elapsed="0.000457"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:17.111534" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:17.111238" elapsed="0.000396">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:17.111774" 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-10-16T01:19:17.110773" elapsed="0.001033"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:17.112494" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:17.112067" elapsed="0.000462"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:17.112953" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:17.113155" 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-10-16T01:19:17.112776" elapsed="0.000411"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:17.113787" 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-10-16T01:19:17.113453" elapsed="0.000411"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:17.115297" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:17.114783" elapsed="0.000555"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:17.115854" 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-10-16T01:19:17.115512" elapsed="0.000368"/>
</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-10-16T01:19:17.116169" elapsed="0.000020"/>
</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-10-16T01:19:17.116351" 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-10-16T01:19:17.116530" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:17.116040" elapsed="0.000542"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:17.115926" elapsed="0.000685"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:17.116652" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:17.116797" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:17.114296" elapsed="0.002524"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:17.113951" elapsed="0.002913"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:17.117032" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:17.116890" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:17.113927" elapsed="0.003174"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:17.117639" 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-10-16T01:19:17.117255" elapsed="0.000409"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:17.117724" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:17.109351" elapsed="0.008472"/>
</kw>
<msg time="2026-10-16T01:19:17.117909" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:17.103637" elapsed="0.014320"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:17.121725" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:17.125513" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:17.129404" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:17.129581" elapsed="0.000019"/>
</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-10-16T01:19:17.129775" 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-10-16T01:19:17.130580" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:17.130439" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:17.130425" elapsed="0.000229"/>
</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-10-16T01:19:17.130819" elapsed="0.000031"/>
</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-10-16T01:19:17.131012" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:17.131258" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:17.130399" elapsed="0.000909"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:17.130306" elapsed="0.001026"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:17.131480" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:17.131548" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:17.131651" 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-10-16T01:19:17.102796" elapsed="0.028879"/>
</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-10-16T01:19:17.132804" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:17.132588" elapsed="0.000291">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:17.132962" 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-10-16T01:19:17.132270" elapsed="0.000714"/>
</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-10-16T01:19:17.133259" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:17.133047" elapsed="0.000264"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:17.133783" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:17.133504" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:17.133334" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:17.133030" elapsed="0.000994"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:17.134529" 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-10-16T01:19:17.134191" elapsed="0.000362"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:17.134598" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:17.134740" 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-manganese/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-10-16T01:19:17.131971" elapsed="0.002792"/>
</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-10-16T01:19:17.135850" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:17.135632" elapsed="0.000279">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:17.135994" 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-10-16T01:19:17.135319" elapsed="0.000697"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:17.136177" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:19:17.136080" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:17.136063" elapsed="0.000189"/>
</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-10-16T01:19:17.136400" elapsed="0.000020"/>
</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-10-16T01:19:17.136570" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:17.136629" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:17.136769" 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-manganese/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-10-16T01:19:17.135022" elapsed="0.001771"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:17.138200" 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-10-16T01:19:17.137975" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:17.138682" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:17.138461" elapsed="0.000278"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:19:17.143383" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:17.143436" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:17.143532" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:17.139040" elapsed="0.004890">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:17.138800" elapsed="0.005247">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:17.144316" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:17.144099" elapsed="0.000299"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:17.138783" elapsed="0.005645">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:17.144940" elapsed="0.000033"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:17.145109" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:17.145062" elapsed="0.000100"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:17.145040" elapsed="0.000151"/>
</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-10-16T01:19:17.145380" elapsed="0.000028"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:17.145469" elapsed="0.000019"/>
</return>
<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="FAIL" start="2026-10-16T01:19:17.137249" elapsed="0.008362">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:17.145728" elapsed="0.000022"/>
</return>
<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="FAIL" start="2026-10-16T01:19:17.093114" elapsed="0.052810">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:17.146471" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:17.146165" elapsed="0.000423"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:17.146097" elapsed="0.000552"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:17.146801" elapsed="0.000072"/>
</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="FAIL" start="2026-10-16T01:19:17.090975" elapsed="0.056084">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:17.088076" elapsed="0.059128">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:17.088024" elapsed="0.059283">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:17.147653" elapsed="0.000033"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:17.148229" elapsed="0.000029"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:17.148666" elapsed="0.000029"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:17.149206" elapsed="0.000031"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:17.149863" elapsed="0.000032"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:17.150304" elapsed="0.000028"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:17.150818" elapsed="0.000081"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:17.151219" elapsed="0.000024"/>
</return>
<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="FAIL" start="2026-10-16T01:19:17.080280" elapsed="0.071080">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:17.151445" elapsed="0.000021"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:17.078383" elapsed="0.073185">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:17.151985" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:17.151679" elapsed="0.000379"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:17.152279" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:17.152089" elapsed="0.000257"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:17.152572" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:17.152377" elapsed="0.000260"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:17.151657" elapsed="0.001010"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:17.078052" elapsed="0.074784">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:17.077621" elapsed="0.075311">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:17.153007" elapsed="0.000020"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:17.069130" elapsed="0.084004">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:17.153376" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:17.153677" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:17.153484" elapsed="0.000280"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:17.153463" elapsed="0.000331"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:17.153988" elapsed="0.000027"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:17.154219" elapsed="0.000026"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:17.154300" elapsed="0.000019"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:17.067466" elapsed="0.086961">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:17.067007" elapsed="0.087506">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:17.066683" elapsed="0.087946">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:17.065910" elapsed="0.088858">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:17.155081" elapsed="0.000031"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:17.044137" elapsed="0.111092">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:18.174742" elapsed="0.000483"/>
</kw>
<msg time="2026-10-16T01:19:18.175340" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:18.173463" elapsed="0.001994"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:18.172530" elapsed="0.003081"/>
</kw>
<msg time="2026-10-16T01:19:18.175730" 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-10-16T01:19:18.166031" elapsed="0.009793"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:18.165149" elapsed="0.010850"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:18.177205" 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-10-16T01:19:18.176478" elapsed="0.000843"/>
</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-10-16T01:19:18.183892" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:18.183103" elapsed="0.000853"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:18.184937" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:18.184287" elapsed="0.000705"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:18.185086" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:19:18.185369" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:18.182277" elapsed="0.003142"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:18.185770" elapsed="0.000310"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:18.187162" 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-10-16T01:19:18.186441" elapsed="0.000777"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:18.188108" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:18.187540" elapsed="0.000621"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:18.189016" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:18.188465" elapsed="0.000604"/>
</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-10-16T01:19:18.197819" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:18.196354" elapsed="0.001647"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:18.198156" elapsed="0.000136"/>
</return>
<msg time="2026-10-16T01:19:18.198919" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:18.193076" elapsed="0.005980"/>
</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-10-16T01:19:18.221722" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:18.221279" elapsed="0.000481"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:18.222741" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:18.222432" elapsed="0.000408">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:18.222976" 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-10-16T01:19:18.221991" elapsed="0.001016"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:18.223668" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:18.223240" elapsed="0.000482"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:18.224125" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:18.224318" 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-10-16T01:19:18.223968" elapsed="0.000383"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:18.225005" 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-10-16T01:19:18.224616" elapsed="0.000451"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:18.226181" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:18.225946" elapsed="0.000275"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:18.226647" 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-10-16T01:19:18.226394" elapsed="0.000277"/>
</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-10-16T01:19:18.226990" elapsed="0.000020"/>
</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-10-16T01:19:18.227171" 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-10-16T01:19:18.227350" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:18.226859" elapsed="0.000541"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:18.226734" elapsed="0.000695"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:18.227470" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:18.227598" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:18.225580" elapsed="0.002040"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:18.225324" elapsed="0.002325"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:18.227833" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:18.227674" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:18.225133" elapsed="0.002785"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:18.228462" 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-10-16T01:19:18.228077" elapsed="0.000410"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:18.228530" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:18.220553" elapsed="0.008075"/>
</kw>
<msg time="2026-10-16T01:19:18.228675" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:18.214940" elapsed="0.013797"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:18.232502" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:18.236485" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:18.240251" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:18.240428" elapsed="0.000020"/>
</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-10-16T01:19:18.240605" 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-10-16T01:19:18.240979" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:18.240819" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:18.240806" 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-10-16T01:19:18.241204" elapsed="0.000019"/>
</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-10-16T01:19:18.241379" elapsed="0.000018"/>
</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-10-16T01:19:18.241537" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:18.240779" elapsed="0.000979"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:18.240675" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:18.241951" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:18.242020" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:18.242124" 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-10-16T01:19:18.214080" elapsed="0.028068"/>
</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-10-16T01:19:18.243251" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:18.243061" elapsed="0.000250">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:18.243393" 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-10-16T01:19:18.242723" elapsed="0.000693"/>
</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-10-16T01:19:18.243692" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:18.243478" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:18.244223" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:18.243961" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:18.243789" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:18.243461" elapsed="0.000839"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:18.244808" 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-10-16T01:19:18.244457" elapsed="0.000429"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:18.244936" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:19:18.245062" 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-manganese/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-10-16T01:19:18.242411" elapsed="0.002673"/>
</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-10-16T01:19:18.248007" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:18.245969" elapsed="0.002103">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:18.248161" 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-10-16T01:19:18.245622" elapsed="0.002562"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:18.248350" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:19:18.248249" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:18.248232" elapsed="0.000194"/>
</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-10-16T01:19:18.248576" 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-10-16T01:19:18.248766" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:18.248827" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:18.248969" 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-manganese/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-10-16T01:19:18.245327" elapsed="0.003666"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:18.250211" 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-10-16T01:19:18.249982" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:18.250654" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:18.250439" elapsed="0.000255"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:19:18.256142" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:18.256252" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:18.256386" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:18.251004" elapsed="0.005757">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:18.250770" elapsed="0.006069">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:18.257035" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:18.256883" elapsed="0.000213"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:18.250753" elapsed="0.006364">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:18.257449" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:18.257568" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:18.257535" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:18.257519" elapsed="0.000107"/>
</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-10-16T01:19:18.257776" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:18.257882" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:19:18.249260" elapsed="0.008728">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:18.258055" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:19:18.204421" elapsed="0.053761">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:18.258569" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:18.258352" elapsed="0.000298"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:18.258304" elapsed="0.000388"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:18.258804" elapsed="0.000037"/>
</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="FAIL" start="2026-10-16T01:19:18.202230" elapsed="0.056783">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:18.199518" elapsed="0.059594">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:18.199475" elapsed="0.059711">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:18.259434" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:18.259800" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:18.260128" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:18.260480" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:18.260954" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:18.261270" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:18.261618" elapsed="0.000019"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:18.261904" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:19:18.191758" elapsed="0.070247">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:18.262066" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:18.189945" elapsed="0.072209">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:18.262371" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:18.262232" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:18.262578" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:18.262443" elapsed="0.000184"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:18.262856" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:18.262648" elapsed="0.000274"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:18.262217" elapsed="0.000771"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:18.189531" elapsed="0.073507">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:18.189165" elapsed="0.073937">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:18.263160" elapsed="0.000017"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:18.180929" elapsed="0.082340">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:18.263488" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:18.263882" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:18.263581" elapsed="0.000359"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:18.263562" elapsed="0.000400"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:18.264090" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:18.264256" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:18.264314" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:18.179307" elapsed="0.085099">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:18.178839" elapsed="0.085630">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:18.178562" elapsed="0.085955">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:18.177800" elapsed="0.086798">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:18.264822" elapsed="0.000033"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:18.156105" elapsed="0.108834">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:19.284130" elapsed="0.000401"/>
</kw>
<msg time="2026-10-16T01:19:19.284646" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:19.282872" elapsed="0.001922"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:19.281932" elapsed="0.003050"/>
</kw>
<msg time="2026-10-16T01:19:19.285073" 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-10-16T01:19:19.275264" elapsed="0.009899"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:19.274381" elapsed="0.010930"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:19.286368" 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-10-16T01:19:19.285825" elapsed="0.000634"/>
</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-10-16T01:19:19.293296" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:19.292496" elapsed="0.000858"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:19.294352" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:19.293688" elapsed="0.000718"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:19.294501" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:19:19.294825" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:19.291656" elapsed="0.003245"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:19.295233" elapsed="0.000287"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:19.296617" 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-10-16T01:19:19.295941" elapsed="0.000732"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:19.297572" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:19.297066" elapsed="0.000560"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:19.298499" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:19.297993" elapsed="0.000558"/>
</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-10-16T01:19:19.307351" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:19.305989" elapsed="0.001472"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:19.307588" elapsed="0.000309"/>
</return>
<msg time="2026-10-16T01:19:19.308339" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:19.302674" elapsed="0.005789"/>
</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-10-16T01:19:19.332005" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:19.331538" elapsed="0.000504"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:19.333035" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:19.332719" elapsed="0.000416">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:19.333252" 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-10-16T01:19:19.332259" elapsed="0.001025"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:19.334032" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:19.333521" elapsed="0.000547"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:19.334452" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:19.334648" 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-10-16T01:19:19.334294" elapsed="0.000388"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:19.335303" 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-10-16T01:19:19.334993" elapsed="0.000367"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:19.336615" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:19.336380" elapsed="0.000276"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:19.337263" 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-10-16T01:19:19.336845" elapsed="0.000443"/>
</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-10-16T01:19:19.337576" elapsed="0.000020"/>
</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-10-16T01:19:19.337779" 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-10-16T01:19:19.338013" elapsed="0.000024"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:19.337444" elapsed="0.000626"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:19.337333" elapsed="0.000766"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:19.338140" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:19:19.338272" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:19.335815" elapsed="0.002480"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:19.335445" elapsed="0.002879"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:19.338495" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:19.338349" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:19.335421" elapsed="0.003145"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:19.339144" 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-10-16T01:19:19.338737" elapsed="0.000432"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:19.339213" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:19.330823" elapsed="0.008489"/>
</kw>
<msg time="2026-10-16T01:19:19.339359" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:19.325141" elapsed="0.014265"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:19.343209" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:19.347055" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:19.350996" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:19.351177" elapsed="0.000020"/>
</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-10-16T01:19:19.351358" 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-10-16T01:19:19.351713" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:19.351556" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:19.351542" 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-10-16T01:19:19.351954" 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-10-16T01:19:19.352130" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:19.352290" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:19.351516" elapsed="0.000822"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:19.351427" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:19.352546" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:19.352615" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:19:19.352740" 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-10-16T01:19:19.324276" elapsed="0.028489"/>
</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-10-16T01:19:19.353882" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:19.353660" elapsed="0.000283">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:19.354025" 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-10-16T01:19:19.353339" elapsed="0.000709"/>
</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-10-16T01:19:19.354323" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:19.354110" elapsed="0.000265"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:19.354842" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:19.354557" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:19.354399" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:19.354094" elapsed="0.000840"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:19.355428" 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-10-16T01:19:19.355091" elapsed="0.000361"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:19.355497" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:19.355620" 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-manganese/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-10-16T01:19:19.353042" elapsed="0.002601"/>
</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-10-16T01:19:19.356772" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:19.356557" elapsed="0.000274">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:19.356928" 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-10-16T01:19:19.356244" elapsed="0.000707"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:19.357114" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:19:19.357015" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:19.356998" elapsed="0.000194"/>
</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-10-16T01:19:19.357341" elapsed="0.000020"/>
</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-10-16T01:19:19.357510" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:19.357569" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:19.357693" 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-manganese/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-10-16T01:19:19.355946" elapsed="0.001788"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:19.359153" 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-10-16T01:19:19.358926" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:19.359599" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:19.359381" elapsed="0.000259"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:19:19.363979" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:19.364065" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:19.364169" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:19.359952" elapsed="0.004575">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:19.359714" elapsed="0.004893">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:19.364803" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:19.364638" elapsed="0.000236"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:19.359683" elapsed="0.005214">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:19.365235" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:19.365355" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:19.365322" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:19.365306" elapsed="0.000107"/>
</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-10-16T01:19:19.365548" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:19.365611" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:19:19.358201" elapsed="0.007528">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:19.365799" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:19:19.314525" elapsed="0.051415">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:19.366330" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:19.366111" elapsed="0.000302"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:19.366063" elapsed="0.000393"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:19.366541" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:19:19.312367" elapsed="0.054360">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:19.309091" elapsed="0.057740">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:19.309044" elapsed="0.057905">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:19.367202" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:19.367550" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:19.367981" elapsed="0.000025"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:19.368364" elapsed="0.000024"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:19.368882" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:19.369211" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:19.369565" elapsed="0.000019"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:19.369848" elapsed="0.000032"/>
</return>
<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="FAIL" start="2026-10-16T01:19:19.301342" elapsed="0.068637">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:19.370042" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:19.299410" elapsed="0.070723">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:19.370365" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:19.370221" elapsed="0.000194"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:19.370576" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:19.370439" elapsed="0.000186"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:19.370812" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:19.370646" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:19.370203" elapsed="0.000692"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:19.299080" elapsed="0.071855">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:19.298647" elapsed="0.072343">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:19.371042" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:19.290173" elapsed="0.080962">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:19.371311" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:19.371531" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:19.371390" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:19.371374" elapsed="0.000226"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:19.371812" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:19.371999" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:19.372057" elapsed="0.000015"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:19.288494" elapsed="0.083663">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:19.288035" elapsed="0.084186">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:19.287761" elapsed="0.084509">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:19.286974" elapsed="0.085380">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:19.372604" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:19.265680" elapsed="0.107092">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:20.391918" elapsed="0.000399"/>
</kw>
<msg time="2026-10-16T01:19:20.392431" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:20.390600" elapsed="0.001946"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:20.389654" elapsed="0.003077"/>
</kw>
<msg time="2026-10-16T01:19:20.392828" 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-10-16T01:19:20.383130" elapsed="0.009814"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:20.382140" elapsed="0.010956"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:20.394321" 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-10-16T01:19:20.393571" elapsed="0.000837"/>
</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-10-16T01:19:20.397422" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:20.397086" elapsed="0.000362"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:20.397895" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:20.397596" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:20.397963" elapsed="0.000030"/>
</return>
<msg time="2026-10-16T01:19:20.398095" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:20.396594" elapsed="0.001524"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:20.398263" elapsed="0.000128"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:20.398874" 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-10-16T01:19:20.398551" elapsed="0.000349"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:20.399266" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:20.399044" elapsed="0.000246"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:20.399643" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:20.399424" elapsed="0.000243"/>
</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-10-16T01:19:20.403482" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:20.402898" elapsed="0.000640"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:20.403595" elapsed="0.000063"/>
</return>
<msg time="2026-10-16T01:19:20.403896" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:20.401434" elapsed="0.002519"/>
</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-10-16T01:19:20.419918" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:20.419577" elapsed="0.000369"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:20.420740" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:20.420498" elapsed="0.000317">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:20.420918" 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-10-16T01:19:20.420175" elapsed="0.000766"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:20.421419" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:20.421110" elapsed="0.000334"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:20.421736" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:20.421898" 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-10-16T01:19:20.421606" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:20.422338" 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-10-16T01:19:20.422115" elapsed="0.000266"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:20.423438" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:20.423066" elapsed="0.000414"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:20.423944" 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-10-16T01:19:20.423655" 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-10-16T01:19:20.424256" 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-10-16T01:19:20.424439" elapsed="0.000022"/>
</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-10-16T01:19:20.424620" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:20.424126" elapsed="0.000546"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:20.424014" elapsed="0.000702"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:20.424759" elapsed="0.000029"/>
</return>
<msg time="2026-10-16T01:19:20.424913" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:20.422715" elapsed="0.002223"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:20.422447" elapsed="0.002521"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:20.425142" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:20.424992" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:20.422429" elapsed="0.002784"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:20.425772" 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-10-16T01:19:20.425366" elapsed="0.000432"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:20.425843" elapsed="0.000041"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:20.419079" elapsed="0.006880"/>
</kw>
<msg time="2026-10-16T01:19:20.426007" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:20.415033" elapsed="0.011021"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:20.429898" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:20.433660" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:20.437471" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:20.437649" elapsed="0.000020"/>
</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-10-16T01:19:20.437841" elapsed="0.000031"/>
</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-10-16T01:19:20.438201" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:20.438054" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:20.438040" 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-10-16T01:19:20.438426" elapsed="0.000019"/>
</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-10-16T01:19:20.438602" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:20.438782" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:20.438013" elapsed="0.000819"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:20.437923" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:20.439019" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:20.439087" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:20.439191" 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-10-16T01:19:20.414408" elapsed="0.024807"/>
</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-10-16T01:19:20.440318" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:20.440127" elapsed="0.000250">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:20.440459" 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-10-16T01:19:20.439786" elapsed="0.000697"/>
</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-10-16T01:19:20.440773" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:20.440545" elapsed="0.000281"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:20.441298" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:20.441035" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:20.440849" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:20.440529" elapsed="0.000846"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:20.441897" 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-10-16T01:19:20.441531" elapsed="0.000391"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:20.441967" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:20.442089" 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-manganese/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-10-16T01:19:20.439472" elapsed="0.002640"/>
</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-10-16T01:19:20.443214" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:20.443027" elapsed="0.000245">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:20.443355" 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-10-16T01:19:20.442682" elapsed="0.000696"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:20.443537" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:19:20.443440" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:20.443424" elapsed="0.000190"/>
</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-10-16T01:19:20.443777" elapsed="0.000020"/>
</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-10-16T01:19:20.443962" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:20.444023" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:20.444146" 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-manganese/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-10-16T01:19:20.442388" elapsed="0.001781"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:20.445542" 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-10-16T01:19:20.445319" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:20.446016" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:20.445785" elapsed="0.000272"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:19:20.450129" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:20.450183" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:20.450279" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:20.446337" elapsed="0.004291">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:20.446117" elapsed="0.004607">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:20.450925" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:20.450757" elapsed="0.000228"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:20.446100" elapsed="0.004907">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:20.451347" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:20.451469" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:20.451434" elapsed="0.000073"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:20.451418" elapsed="0.000110"/>
</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-10-16T01:19:20.451664" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:20.451743" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:19:20.444602" elapsed="0.007244">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:20.451971" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:19:20.407482" elapsed="0.044629">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:20.452500" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:20.452281" elapsed="0.000302"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:20.452234" elapsed="0.000391"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:20.452735" elapsed="0.000044"/>
</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="FAIL" start="2026-10-16T01:19:20.405845" elapsed="0.047082">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:20.404162" elapsed="0.048866">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:20.404143" elapsed="0.048959">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:20.453350" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:20.453717" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:20.454051" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:20.454402" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:20.454871" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:20.455190" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:20.455539" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:20.455818" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:19:20.400878" elapsed="0.055055">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:20.456003" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:20.400049" elapsed="0.056043">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:20.456310" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:20.456171" elapsed="0.000190"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:20.456516" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:20.456382" elapsed="0.000183"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:20.456749" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:20.456587" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:20.456155" elapsed="0.000666"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:20.399901" elapsed="0.056969">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:20.399723" elapsed="0.057363">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:20.457140" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:20.396013" elapsed="0.061251">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:20.457443" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:20.457664" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:20.457523" elapsed="0.000274"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:20.457507" elapsed="0.000314"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:20.457965" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:20.458133" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:20.458191" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:20.395302" elapsed="0.062983">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:20.395095" elapsed="0.063253">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:20.394983" elapsed="0.063413">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:20.394619" elapsed="0.063859">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:20.458690" elapsed="0.000078"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:20.373584" elapsed="0.085287">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:21.468317" elapsed="0.000197"/>
</kw>
<msg time="2026-10-16T01:19:21.468575" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:21.467751" elapsed="0.000885"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:21.467339" elapsed="0.001385"/>
</kw>
<msg time="2026-10-16T01:19:21.468766" 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-10-16T01:19:21.464304" elapsed="0.004503"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:21.463908" elapsed="0.004978"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:21.469344" 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-10-16T01:19:21.469115" elapsed="0.000271"/>
</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-10-16T01:19:21.472454" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:21.472119" elapsed="0.000360"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:21.472935" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:21.472627" elapsed="0.000334"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:21.473072" elapsed="0.000031"/>
</return>
<msg time="2026-10-16T01:19:21.473208" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:21.471742" elapsed="0.001489"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:21.473380" elapsed="0.000130"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:21.474003" 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-10-16T01:19:21.473673" elapsed="0.000355"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:21.474401" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:21.474176" elapsed="0.000249"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:21.474805" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:21.474563" 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-10-16T01:19:21.478633" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:21.478045" elapsed="0.000637"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:21.478762" elapsed="0.000063"/>
</return>
<msg time="2026-10-16T01:19:21.479036" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:21.476579" 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-10-16T01:19:21.495017" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:21.494685" elapsed="0.000358"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:21.495745" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:21.495511" elapsed="0.000309">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:21.495920" 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-10-16T01:19:21.495198" elapsed="0.000745"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:21.496415" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:21.496110" elapsed="0.000330"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:21.496731" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:21.496899" 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-10-16T01:19:21.496603" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:21.497334" 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-10-16T01:19:21.497118" elapsed="0.000256"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:21.498404" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:21.498175" elapsed="0.000269"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:21.498905" 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-10-16T01:19:21.498617" elapsed="0.000313"/>
</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-10-16T01:19:21.499212" elapsed="0.000020"/>
</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-10-16T01:19:21.499393" elapsed="0.000022"/>
</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-10-16T01:19:21.499577" elapsed="0.000023"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:21.499084" elapsed="0.000556"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:21.498973" elapsed="0.000705"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:21.499736" elapsed="0.000028"/>
</return>
<msg time="2026-10-16T01:19:21.499932" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:21.497820" elapsed="0.002136"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:21.497546" 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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:21.500191" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:21.500024" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:21.497417" elapsed="0.002893"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:21.501111" 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-10-16T01:19:21.500535" elapsed="0.000611"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:21.501207" elapsed="0.000037"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:21.494189" elapsed="0.007157"/>
</kw>
<msg time="2026-10-16T01:19:21.501411" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:21.490171" elapsed="0.011303"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:21.505571" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:21.509333" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:21.513084" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:21.513260" elapsed="0.000020"/>
</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-10-16T01:19:21.513436" elapsed="0.000019"/>
</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-10-16T01:19:21.513786" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:21.513633" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:21.513619" 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-10-16T01:19:21.514024" 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-10-16T01:19:21.514199" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:21.514358" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:21.513593" elapsed="0.000814"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:21.513503" elapsed="0.000927"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:21.514578" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:21.514645" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:19:21.514763" 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-10-16T01:19:21.489551" elapsed="0.025236"/>
</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-10-16T01:19:21.515999" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:21.515730" elapsed="0.000329">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:21.516141" 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-10-16T01:19:21.515392" elapsed="0.000771"/>
</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-10-16T01:19:21.516439" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:21.516227" elapsed="0.000264"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:21.516962" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:21.516671" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:21.516513" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:21.516209" elapsed="0.000829"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:21.517526" 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-10-16T01:19:21.517192" elapsed="0.000357"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:21.517594" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:21.517733" 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-manganese/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-10-16T01:19:21.515094" elapsed="0.002663"/>
</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-10-16T01:19:21.520337" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:21.518622" elapsed="0.001777">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:21.520484" 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-10-16T01:19:21.518307" elapsed="0.002201"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:21.520673" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-10-16T01:19:21.520573" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:21.520556" elapsed="0.000212"/>
</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-10-16T01:19:21.520936" 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-10-16T01:19:21.521110" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:21.521193" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:19:21.521321" 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-manganese/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-10-16T01:19:21.518012" elapsed="0.003333"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:21.522575" 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-10-16T01:19:21.522346" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:21.523053" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:21.522822" elapsed="0.000272"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:19:21.527203" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:21.527257" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:21.527398" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:21.523375" elapsed="0.004403">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:21.523153" elapsed="0.004701">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:21.528051" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:21.527901" elapsed="0.000208"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:21.523136" elapsed="0.004994">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:21.528460" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:21.528578" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:21.528546" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:21.528530" elapsed="0.000106"/>
</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-10-16T01:19:21.528788" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:21.528851" elapsed="0.000031"/>
</return>
<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="FAIL" start="2026-10-16T01:19:21.521616" elapsed="0.007356">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:21.529039" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:19:21.482642" elapsed="0.046530">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:21.529556" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:21.529340" elapsed="0.000298"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:21.529293" elapsed="0.000386"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:21.529792" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:19:21.480994" elapsed="0.048979">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:21.479303" elapsed="0.050770">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:21.479282" elapsed="0.050863">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:21.530397" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:21.530761" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:21.531090" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:21.531442" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:21.531907" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:21.532229" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:21.532576" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:21.532890" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:19:21.476025" elapsed="0.056968">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:21.533056" elapsed="0.000014"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:21.475201" elapsed="0.057944">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:21.533369" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:21.533226" elapsed="0.000193"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:21.533581" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:21.533442" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:21.533820" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:21.533653" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:21.533210" elapsed="0.000694"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:21.475052" elapsed="0.058890">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:21.474886" elapsed="0.059110">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:21.534045" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:21.471006" elapsed="0.063131">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:21.534313" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:21.534532" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:21.534392" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:21.534376" elapsed="0.000225"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:21.534843" elapsed="0.000033"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:21.535029" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:21.535087" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:21.470288" elapsed="0.064892">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:21.470075" elapsed="0.065170">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:21.469956" elapsed="0.065337">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:21.469588" elapsed="0.065785">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:21.535579" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:21.459544" elapsed="0.076138">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:22.600991" elapsed="0.000260"/>
</kw>
<msg time="2026-10-16T01:19:22.601329" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:22.600150" elapsed="0.001256"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:22.599559" elapsed="0.001946"/>
</kw>
<msg time="2026-10-16T01:19:22.601562" 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-10-16T01:19:22.595283" elapsed="0.006335"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:22.594603" elapsed="0.007130"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:22.602374" 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-10-16T01:19:22.602052" elapsed="0.000379"/>
</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-10-16T01:19:22.606498" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:22.606028" elapsed="0.000505"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:22.607163" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:22.606764" elapsed="0.000433"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:22.607261" elapsed="0.000040"/>
</return>
<msg time="2026-10-16T01:19:22.607445" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:22.605499" elapsed="0.001978"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:22.607683" elapsed="0.000219"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:22.608551" 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-10-16T01:19:22.608135" elapsed="0.000450"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:22.609232" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:22.608812" elapsed="0.000453"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:22.610003" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:22.609461" elapsed="0.000576"/>
</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-10-16T01:19:22.615293" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:22.614423" elapsed="0.000938"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:22.615443" elapsed="0.000085"/>
</return>
<msg time="2026-10-16T01:19:22.615840" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:22.612351" elapsed="0.003588"/>
</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-10-16T01:19:22.634340" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:22.634035" elapsed="0.000331"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:22.635097" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:22.634860" elapsed="0.000312">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:22.635257" 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-10-16T01:19:22.634521" elapsed="0.000759"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:22.635849" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:22.635517" elapsed="0.000372"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:22.636169" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:22.636316" 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-10-16T01:19:22.636054" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:22.636771" 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-10-16T01:19:22.636531" 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-10-16T01:19:22.637720" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:22.637473" elapsed="0.000289"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:22.638213" 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-10-16T01:19:22.637949" 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-10-16T01:19:22.638518" elapsed="0.000020"/>
</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-10-16T01:19:22.638713" 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-10-16T01:19:22.638909" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:22.638390" elapsed="0.000571"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:22.638280" elapsed="0.000711"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:22.639033" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:22.639162" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:22.637136" elapsed="0.002049"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:22.636888" elapsed="0.002326"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:22.639383" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:22.639239" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:22.636856" elapsed="0.002597"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:22.640030" 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-10-16T01:19:22.639609" elapsed="0.000447"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:22.640100" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:22.633501" elapsed="0.006699"/>
</kw>
<msg time="2026-10-16T01:19:22.640248" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:22.629264" elapsed="0.011031"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:22.644215" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:22.648251" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:22.652069" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:22.652287" 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-10-16T01:19:22.652470" elapsed="0.000019"/>
</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-10-16T01:19:22.652829" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:22.652670" elapsed="0.000249"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:22.652656" 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-10-16T01:19:22.653099" 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-10-16T01:19:22.653278" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:22.653440" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:22.652630" elapsed="0.000858"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:22.652540" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:22.653663" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:22.653748" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:19:22.653853" 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-10-16T01:19:22.628642" elapsed="0.025249"/>
</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-10-16T01:19:22.654999" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:22.654790" elapsed="0.000269">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:22.655141" 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-10-16T01:19:22.654453" elapsed="0.000710"/>
</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-10-16T01:19:22.655443" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:22.655225" elapsed="0.000270"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:22.655980" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:22.655677" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:22.655517" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:22.655209" elapsed="0.000848"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:22.656552" 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-10-16T01:19:22.656216" elapsed="0.000361"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:22.656621" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:22.656762" 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-manganese/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-10-16T01:19:22.654151" elapsed="0.002634"/>
</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-10-16T01:19:22.657889" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:22.657666" elapsed="0.000283">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:22.658032" 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-10-16T01:19:22.657347" elapsed="0.000707"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:22.658254" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:19:22.658153" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:22.658135" elapsed="0.000197"/>
</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-10-16T01:19:22.658483" elapsed="0.000020"/>
</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-10-16T01:19:22.658656" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:22.658733" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:19:22.658857" 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-manganese/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-10-16T01:19:22.657044" elapsed="0.001852"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:22.660113" 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-10-16T01:19:22.659888" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:22.660559" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:22.660341" elapsed="0.000257"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:19:22.664959" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:22.665013" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:22.665122" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:22.660913" elapsed="0.004570">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:22.660657" elapsed="0.004906">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:22.665762" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:22.665593" elapsed="0.000230"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:22.660641" elapsed="0.005204">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:22.666192" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:22.666313" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:22.666279" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:22.666263" elapsed="0.000107"/>
</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-10-16T01:19:22.666507" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:22.666569" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:19:22.659166" elapsed="0.007505">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:22.666757" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:19:22.620988" elapsed="0.045912">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:22.667287" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:22.667070" elapsed="0.000330"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:22.667022" elapsed="0.000421"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:22.667526" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:19:22.618762" elapsed="0.048929">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:22.616233" elapsed="0.051582">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:22.616206" elapsed="0.051697">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:22.668151" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:22.668503" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:22.668830" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:22.669193" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:22.669623" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:22.669975" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:22.670332" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:22.670570" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:19:22.611526" elapsed="0.059143">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:22.670768" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:22.610538" elapsed="0.060320">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:22.671097" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:22.670955" elapsed="0.000192"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:22.671307" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:22.671169" elapsed="0.000187"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:22.671521" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:22.671378" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:22.670938" elapsed="0.000651"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:22.610331" elapsed="0.061297">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:22.610097" elapsed="0.061583">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:22.671752" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:22.604651" elapsed="0.067194">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:22.672038" elapsed="0.000050"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:22.672295" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:22.672152" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:22.672135" elapsed="0.000229"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:22.672491" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:22.672661" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:22.672808" elapsed="0.000016"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:22.603655" elapsed="0.069266">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:22.603374" elapsed="0.069611">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:22.603220" elapsed="0.069814">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:22.602734" elapsed="0.070381">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:22.673329" elapsed="0.000021"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:22.536510" elapsed="0.136921">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:23.691916" elapsed="0.000406"/>
</kw>
<msg time="2026-10-16T01:19:23.692438" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:23.690615" elapsed="0.001940"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:23.689682" elapsed="0.003061"/>
</kw>
<msg time="2026-10-16T01:19:23.692836" 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-10-16T01:19:23.683157" elapsed="0.009791"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:23.682290" elapsed="0.010807"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:23.694276" 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-10-16T01:19:23.693576" elapsed="0.000794"/>
</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-10-16T01:19:23.701469" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:23.700678" elapsed="0.000849"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:23.702526" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:23.701915" elapsed="0.000666"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:23.702677" elapsed="0.000099"/>
</return>
<msg time="2026-10-16T01:19:23.703032" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:23.699898" elapsed="0.003186"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:23.703415" elapsed="0.000312"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:23.705187" 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-10-16T01:19:23.704119" elapsed="0.001125"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:23.706146" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:23.705575" elapsed="0.000625"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:23.707070" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:23.706510" elapsed="0.000614"/>
</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-10-16T01:19:23.715456" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:23.714064" elapsed="0.001503"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:23.715694" elapsed="0.000399"/>
</return>
<msg time="2026-10-16T01:19:23.716525" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:23.710763" elapsed="0.005890"/>
</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-10-16T01:19:23.743513" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:23.743086" elapsed="0.000472"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:23.744619" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:23.744314" elapsed="0.000423">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:23.744857" 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-10-16T01:19:23.743850" elapsed="0.001055"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:23.745572" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:23.745144" elapsed="0.000463"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:23.746026" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:23.746225" 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-10-16T01:19:23.745853" elapsed="0.000405"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:23.746856" 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-10-16T01:19:23.746524" elapsed="0.000405"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:23.748201" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:23.747865" elapsed="0.000392"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:23.748868" 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-10-16T01:19:23.748496" elapsed="0.000421"/>
</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-10-16T01:19:23.749314" elapsed="0.000027"/>
</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-10-16T01:19:23.749563" 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-10-16T01:19:23.749834" elapsed="0.000028"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:23.749137" elapsed="0.000789"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:23.748978" elapsed="0.000988"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:23.750025" elapsed="0.000046"/>
</return>
<msg time="2026-10-16T01:19:23.750216" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:23.747375" elapsed="0.002874"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:23.747023" elapsed="0.003265"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:23.750522" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:23.750324" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:23.746995" elapsed="0.003625"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:23.751423" 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-10-16T01:19:23.750865" elapsed="0.000656"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:23.751586" elapsed="0.000038"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:23.742357" elapsed="0.009408"/>
</kw>
<msg time="2026-10-16T01:19:23.751833" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:23.736589" elapsed="0.015328"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:23.756416" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:23.760215" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:23.764012" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:23.764189" elapsed="0.000020"/>
</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-10-16T01:19:23.764366" elapsed="0.000019"/>
</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-10-16T01:19:23.764722" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:23.764563" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:23.764549" 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-10-16T01:19:23.764963" 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-10-16T01:19:23.765142" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:23.765301" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:23.764523" elapsed="0.000826"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:23.764433" elapsed="0.000939"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:23.765521" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:23.765588" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:23.765692" 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-10-16T01:19:23.735647" elapsed="0.030083"/>
</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-10-16T01:19:23.766873" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:23.766666" elapsed="0.000282">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:23.767031" 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-10-16T01:19:23.766343" elapsed="0.000711"/>
</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-10-16T01:19:23.767342" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:23.767117" elapsed="0.000278"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:23.767894" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:23.767590" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:23.767418" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:23.767101" elapsed="0.000872"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:23.768475" 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-10-16T01:19:23.768132" elapsed="0.000369"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:23.768549" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:23.768675" 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-manganese/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-10-16T01:19:23.766010" elapsed="0.002703"/>
</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-10-16T01:19:23.769809" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:23.769602" elapsed="0.000266">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:23.769968" 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-10-16T01:19:23.769283" elapsed="0.000709"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:23.770153" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:19:23.770055" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:23.770039" elapsed="0.000191"/>
</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-10-16T01:19:23.770380" elapsed="0.000020"/>
</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-10-16T01:19:23.770551" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:23.770610" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:23.770751" 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-manganese/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-10-16T01:19:23.768979" elapsed="0.001796"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:23.772012" 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-10-16T01:19:23.771770" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:23.772451" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:23.772236" elapsed="0.000255"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:19:23.776975" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:23.777029" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:23.777126" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:23.772784" elapsed="0.004702">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:23.772548" elapsed="0.005045">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:23.777794" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:23.777626" elapsed="0.000227"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:23.772532" elapsed="0.005343">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:23.778264" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:23.778393" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:23.778358" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:23.778341" 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-10-16T01:19:23.778602" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:23.778669" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:19:23.771065" elapsed="0.007727">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:23.778864" elapsed="0.000026"/>
</return>
<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="FAIL" start="2026-10-16T01:19:23.724972" elapsed="0.054058">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:23.779436" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:23.779205" elapsed="0.000315"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:23.779157" elapsed="0.000406"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:23.779649" elapsed="0.000037"/>
</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="FAIL" start="2026-10-16T01:19:23.721360" elapsed="0.058485">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:23.717174" elapsed="0.062790">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:23.717129" elapsed="0.062911">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:23.780293" elapsed="0.000025"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:23.780647" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:23.780998" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:23.781349" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:23.781805" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:23.782134" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:23.782479" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:23.782754" elapsed="0.000019"/>
</return>
<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="FAIL" start="2026-10-16T01:19:23.709427" elapsed="0.073430">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:23.782964" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:23.707969" elapsed="0.075089">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:23.783280" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:23.783138" elapsed="0.000196"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:23.783492" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:23.783356" elapsed="0.000184"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:23.783724" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:23.783562" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:23.783122" elapsed="0.000672"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:23.707589" elapsed="0.076243">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:23.707216" elapsed="0.076681">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:23.783948" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:23.698493" elapsed="0.085547">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:23.784215" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:23.784430" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:23.784292" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:23.784277" elapsed="0.000221"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:23.784622" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:23.784922" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:23.784984" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:23.696908" elapsed="0.088170">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:23.696397" elapsed="0.088743">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:23.695616" elapsed="0.089574">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:23.694852" elapsed="0.090421">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:23.785483" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:23.674272" elapsed="0.111316">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:24.804368" elapsed="0.000434"/>
</kw>
<msg time="2026-10-16T01:19:24.805066" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:24.803104" elapsed="0.002229"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:24.802151" elapsed="0.003351"/>
</kw>
<msg time="2026-10-16T01:19:24.805596" 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-10-16T01:19:24.795154" elapsed="0.010535"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:24.794287" elapsed="0.011591"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:24.806946" 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-10-16T01:19:24.806371" elapsed="0.000670"/>
</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-10-16T01:19:24.813759" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:24.812987" elapsed="0.000831"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:24.814809" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:24.814173" elapsed="0.000691"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:24.814981" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:19:24.815269" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:24.812134" elapsed="0.003185"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:24.815646" elapsed="0.000338"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:24.817074" 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-10-16T01:19:24.816353" elapsed="0.000778"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:24.818014" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:24.817456" elapsed="0.000611"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:24.818924" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:24.818373" elapsed="0.000606"/>
</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-10-16T01:19:24.827656" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:24.826254" elapsed="0.001559"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:24.827970" elapsed="0.000137"/>
</return>
<msg time="2026-10-16T01:19:24.828545" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:24.822931" elapsed="0.005742"/>
</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-10-16T01:19:24.854015" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:24.853550" elapsed="0.000502"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:24.855035" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:24.854723" elapsed="0.000410">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:24.855251" 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-10-16T01:19:24.854267" elapsed="0.001015"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:24.855991" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:24.855515" elapsed="0.000512"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:24.856410" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:24.856653" 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-10-16T01:19:24.856253" elapsed="0.000434"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:24.857310" 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-10-16T01:19:24.856997" elapsed="0.000370"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:24.858631" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:24.858312" elapsed="0.000376"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:24.859526" 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-10-16T01:19:24.858968" elapsed="0.000594"/>
</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-10-16T01:19:24.859996" elapsed="0.000030"/>
</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-10-16T01:19:24.860253" 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-10-16T01:19:24.860500" elapsed="0.000027"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:24.859799" elapsed="0.000773"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:24.859623" elapsed="0.000989"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:24.860667" elapsed="0.000056"/>
</return>
<msg time="2026-10-16T01:19:24.860873" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:24.857823" elapsed="0.003100"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:24.857453" elapsed="0.003511"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:24.861199" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:24.860998" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:24.857429" elapsed="0.003867"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:24.862051" 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-10-16T01:19:24.861546" elapsed="0.000530"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:24.862121" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:24.852843" elapsed="0.009377"/>
</kw>
<msg time="2026-10-16T01:19:24.862266" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:24.847233" elapsed="0.015078"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:24.866080" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:24.869882" elapsed="0.000035"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:24.873712" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:24.873936" 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-10-16T01:19:24.874117" elapsed="0.000019"/>
</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-10-16T01:19:24.874457" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:24.874317" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:24.874303" elapsed="0.000227"/>
</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-10-16T01:19:24.874681" elapsed="0.000033"/>
</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-10-16T01:19:24.874873" elapsed="0.000032"/>
</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-10-16T01:19:24.875049" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:24.874276" elapsed="0.000821"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:24.874185" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:24.875269" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:24.875335" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:19:24.875440" 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-10-16T01:19:24.846374" elapsed="0.029089"/>
</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-10-16T01:19:24.876563" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:24.876372" elapsed="0.000250">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:24.876719" 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-10-16T01:19:24.876049" elapsed="0.000694"/>
</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-10-16T01:19:24.877033" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:24.876807" elapsed="0.000279"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:24.877526" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:24.877264" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:24.877109" elapsed="0.000474"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:24.876790" elapsed="0.000813"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:24.878126" 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-10-16T01:19:24.877775" elapsed="0.000375"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:24.878195" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:24.878318" 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-manganese/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-10-16T01:19:24.875737" elapsed="0.002603"/>
</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-10-16T01:19:24.879411" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:24.879224" elapsed="0.000251">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:24.879556" 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-10-16T01:19:24.878908" elapsed="0.000671"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:24.879756" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:19:24.879642" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:24.879625" elapsed="0.000208"/>
</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-10-16T01:19:24.879995" 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-10-16T01:19:24.880200" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:24.880261" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:19:24.880385" 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-manganese/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-10-16T01:19:24.878583" elapsed="0.001825"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:24.882969" 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-10-16T01:19:24.882722" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:24.883429" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:24.883201" elapsed="0.000269"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:19:24.887597" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:24.887651" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:24.887772" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:24.883769" elapsed="0.004375">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:24.883531" elapsed="0.004690">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:24.888428" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:24.888252" elapsed="0.000236"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:24.883514" elapsed="0.004997">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:24.888862" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:24.888998" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:24.888963" elapsed="0.000073"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:24.888947" elapsed="0.000110"/>
</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-10-16T01:19:24.889194" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:24.889258" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:19:24.882010" elapsed="0.007354">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:24.889435" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:19:24.836749" elapsed="0.052815">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:24.889994" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:24.889761" elapsed="0.000317"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:24.889685" elapsed="0.000436"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:24.890206" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:19:24.833340" elapsed="0.057066">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:24.829400" elapsed="0.061108">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:24.829356" elapsed="0.061227">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:24.890850" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:24.891207" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:24.891518" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:24.891901" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:24.892332" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:24.892646" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:24.893035" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:24.893276" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:19:24.821277" elapsed="0.072100">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:24.893439" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:24.819787" elapsed="0.073741">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:24.893771" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:24.893607" elapsed="0.000216"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:24.893995" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:24.893845" elapsed="0.000200"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:24.894208" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:24.894067" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:24.893592" elapsed="0.000686"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:24.819432" elapsed="0.074885">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:24.819071" elapsed="0.075299">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:24.894419" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:24.810579" elapsed="0.083930">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:24.894681" elapsed="0.000140"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:24.895036" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:24.894894" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:24.894868" elapsed="0.000238"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:24.895262" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:24.895430" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:24.895489" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:24.809014" elapsed="0.086568">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:24.808522" elapsed="0.087123">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:24.808282" elapsed="0.087412">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:24.807486" elapsed="0.088308">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:24.896013" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:24.786372" elapsed="0.109746">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:25.915503" elapsed="0.000465"/>
</kw>
<msg time="2026-10-16T01:19:25.916085" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:25.914173" elapsed="0.002028"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:25.913157" elapsed="0.003201"/>
</kw>
<msg time="2026-10-16T01:19:25.916449" 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-10-16T01:19:25.906351" elapsed="0.010188"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:25.905468" elapsed="0.011218"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:25.917766" 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-10-16T01:19:25.917218" elapsed="0.000644"/>
</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-10-16T01:19:25.924608" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:25.923849" elapsed="0.000817"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:25.925858" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:25.925207" elapsed="0.000730"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:25.926033" elapsed="0.000063"/>
</return>
<msg time="2026-10-16T01:19:25.926323" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:25.923027" elapsed="0.003354"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:25.926741" elapsed="0.000311"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:25.928141" 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-10-16T01:19:25.927418" elapsed="0.000779"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:25.929136" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:25.928520" elapsed="0.000669"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:25.930231" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:25.929494" elapsed="0.000791"/>
</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-10-16T01:19:25.939296" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:25.937873" elapsed="0.001537"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:25.939540" elapsed="0.000137"/>
</return>
<msg time="2026-10-16T01:19:25.940293" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:25.934364" elapsed="0.006057"/>
</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-10-16T01:19:25.966578" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:25.966154" elapsed="0.000460"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:25.967596" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:25.967308" elapsed="0.000383">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:25.967839" 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-10-16T01:19:25.966851" elapsed="0.001019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:25.968558" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:25.968125" elapsed="0.000469"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:25.969071" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:25.969266" 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-10-16T01:19:25.968858" elapsed="0.000443"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:25.969926" 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-10-16T01:19:25.969571" elapsed="0.000414"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:25.971433" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:25.970930" elapsed="0.000561"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:25.972669" 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-10-16T01:19:25.971754" elapsed="0.000968"/>
</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-10-16T01:19:25.973136" elapsed="0.000029"/>
</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-10-16T01:19:25.973392" 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-10-16T01:19:25.973644" elapsed="0.000028"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:25.972955" elapsed="0.000781"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:25.972785" elapsed="0.000991"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:25.973833" elapsed="0.000037"/>
</return>
<msg time="2026-10-16T01:19:25.974037" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:25.970427" elapsed="0.003642"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:25.970072" elapsed="0.004037"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:25.974344" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:25.974143" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:25.970048" elapsed="0.004367"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:25.974995" 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-10-16T01:19:25.974569" elapsed="0.000452"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:25.975075" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:25.965423" elapsed="0.009752"/>
</kw>
<msg time="2026-10-16T01:19:25.975263" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:25.959803" elapsed="0.015508"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:25.979092" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:25.982938" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:25.986694" elapsed="0.000037"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:25.986905" 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-10-16T01:19:25.987085" elapsed="0.000019"/>
</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-10-16T01:19:25.987421" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:25.987281" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:25.987267" elapsed="0.000227"/>
</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-10-16T01:19:25.987643" elapsed="0.000019"/>
</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-10-16T01:19:25.987847" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:25.988020" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:25.987242" elapsed="0.000827"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:25.987152" elapsed="0.000941"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:25.988240" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:25.988307" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:25.988410" 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-10-16T01:19:25.958946" elapsed="0.029488"/>
</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-10-16T01:19:25.989535" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:25.989343" elapsed="0.000252">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:25.989727" 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-10-16T01:19:25.989022" elapsed="0.000730"/>
</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-10-16T01:19:25.990050" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:25.989816" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:25.990551" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:25.990287" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:25.990125" elapsed="0.000482"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:25.989799" elapsed="0.000828"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:25.991185" 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-10-16T01:19:25.990802" elapsed="0.000407"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:25.991254" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:19:25.991377" 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-manganese/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-10-16T01:19:25.988694" elapsed="0.002706"/>
</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-10-16T01:19:25.992500" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:25.992305" elapsed="0.000254">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:25.992641" 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-10-16T01:19:25.991985" elapsed="0.000679"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:25.992844" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:19:25.992744" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:25.992726" elapsed="0.000212"/>
</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-10-16T01:19:25.993089" elapsed="0.000020"/>
</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-10-16T01:19:25.993261" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:25.993319" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:25.993443" 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-manganese/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-10-16T01:19:25.991652" elapsed="0.001814"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:25.994879" 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-10-16T01:19:25.994636" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:25.995341" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:25.995121" elapsed="0.000264"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:19:25.999628" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:25.999680" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:25.999796" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:25.995665" elapsed="0.004500">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:25.995444" elapsed="0.004799">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:26.000427" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:26.000274" elapsed="0.000241"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:25.995428" elapsed="0.005113">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:26.000916" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:26.001039" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:26.001005" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:26.000989" elapsed="0.000109"/>
</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-10-16T01:19:26.001235" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:26.001299" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:19:25.993944" elapsed="0.007457">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:26.001471" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:19:25.948655" elapsed="0.052946">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:26.002033" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:26.001796" elapsed="0.000322"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:26.001748" elapsed="0.000413"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:26.002246" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:19:25.944931" elapsed="0.057488">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:25.941050" elapsed="0.061470">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:25.941007" elapsed="0.061586">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:26.002860" elapsed="0.000025"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:26.003252" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:26.003564" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:26.003953" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:26.004383" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:26.004696" elapsed="0.000041"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:26.005080" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:26.005318" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:19:25.933021" elapsed="0.072398">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:26.005482" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:25.931139" elapsed="0.074434">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:26.005853" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:26.005687" elapsed="0.000231"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:26.006126" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:26.005942" elapsed="0.000258"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:26.006416" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:26.006229" elapsed="0.000249"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:26.005670" elapsed="0.000831"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:25.930782" elapsed="0.075769">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:25.930381" elapsed="0.076240">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:26.006689" elapsed="0.000179"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:25.921581" elapsed="0.085410">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:26.007238" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:26.007545" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:26.007344" elapsed="0.000269"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:26.007323" elapsed="0.000323"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:26.007858" elapsed="0.000027"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:26.008129" elapsed="0.000027"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:26.008215" elapsed="0.000021"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:25.920000" elapsed="0.088357">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:25.919373" elapsed="0.089074">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:25.919132" elapsed="0.089390">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:25.918330" elapsed="0.090308">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:26.008889" elapsed="0.000035"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:25.896952" elapsed="0.112058">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:27.028138" elapsed="0.000405"/>
</kw>
<msg time="2026-10-16T01:19:27.028661" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:27.026805" elapsed="0.002007"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:27.025860" elapsed="0.003134"/>
</kw>
<msg time="2026-10-16T01:19:27.029209" 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-10-16T01:19:27.019353" elapsed="0.009955"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:27.018467" elapsed="0.010997"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:27.030512" 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-10-16T01:19:27.029992" elapsed="0.000613"/>
</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-10-16T01:19:27.037508" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:27.036736" elapsed="0.000831"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:27.038667" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:27.038027" elapsed="0.000726"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:27.038850" elapsed="0.000084"/>
</return>
<msg time="2026-10-16T01:19:27.039167" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:27.035875" elapsed="0.003343"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:27.039668" elapsed="0.000352"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:27.041118" 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-10-16T01:19:27.040394" elapsed="0.000780"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:27.042066" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:27.041499" elapsed="0.000621"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:27.042986" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:27.042428" elapsed="0.000612"/>
</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-10-16T01:19:27.051814" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:27.050382" elapsed="0.001565"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:27.052081" elapsed="0.000135"/>
</return>
<msg time="2026-10-16T01:19:27.052645" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:27.047085" elapsed="0.005775"/>
</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-10-16T01:19:27.076638" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:27.076204" elapsed="0.000472"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:27.077689" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:27.077379" elapsed="0.000434">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:27.077948" 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-10-16T01:19:27.076934" elapsed="0.001047"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:27.078648" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:27.078216" elapsed="0.000467"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:27.079113" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:27.079314" 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-10-16T01:19:27.078950" elapsed="0.000397"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:27.080038" 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-10-16T01:19:27.079613" elapsed="0.000484"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:27.081591" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:27.081263" elapsed="0.000387"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:27.082296" 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-10-16T01:19:27.081936" elapsed="0.000396"/>
</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-10-16T01:19:27.082755" 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-10-16T01:19:27.082955" 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-10-16T01:19:27.083138" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:27.082563" elapsed="0.000627"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:27.082398" elapsed="0.000821"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:27.083260" elapsed="0.000028"/>
</return>
<msg time="2026-10-16T01:19:27.083400" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:27.080769" elapsed="0.002655"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:27.080191" elapsed="0.003263"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:27.083624" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:27.083480" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:27.080164" elapsed="0.003532"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:27.084273" 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-10-16T01:19:27.083868" elapsed="0.000431"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:27.084343" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:27.075467" elapsed="0.008977"/>
</kw>
<msg time="2026-10-16T01:19:27.084492" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:27.069589" elapsed="0.014950"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:27.088342" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:27.092149" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:27.095927" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:27.096106" elapsed="0.000020"/>
</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-10-16T01:19:27.096285" elapsed="0.000019"/>
</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-10-16T01:19:27.096659" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:27.096484" elapsed="0.000243"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:27.096470" elapsed="0.000281"/>
</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-10-16T01:19:27.096924" 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-10-16T01:19:27.097105" elapsed="0.000018"/>
</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-10-16T01:19:27.097265" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:27.096443" elapsed="0.000871"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:27.096353" elapsed="0.000984"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:27.097487" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:27.097554" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:19:27.097659" 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-10-16T01:19:27.068686" elapsed="0.028997"/>
</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-10-16T01:19:27.098804" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:27.098597" elapsed="0.000267">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:27.098966" 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-10-16T01:19:27.098275" elapsed="0.000714"/>
</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-10-16T01:19:27.099265" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:27.099052" elapsed="0.000264"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:27.099790" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:27.099510" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:27.099339" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:27.099035" elapsed="0.000831"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:27.100372" 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-10-16T01:19:27.100038" elapsed="0.000358"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:27.100441" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:27.100563" 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-manganese/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-10-16T01:19:27.097979" elapsed="0.002607"/>
</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-10-16T01:19:27.101661" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:27.101473" elapsed="0.000262">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:27.101819" 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-10-16T01:19:27.101158" elapsed="0.000684"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:27.102181" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:19:27.102078" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:27.101888" elapsed="0.000371"/>
</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-10-16T01:19:27.102410" elapsed="0.000020"/>
</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-10-16T01:19:27.102583" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:27.102644" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:27.102786" 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-manganese/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-10-16T01:19:27.100846" elapsed="0.001993"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:27.104082" 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-10-16T01:19:27.103841" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:27.104525" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:27.104310" elapsed="0.000254"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:19:27.108680" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:27.108755" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:27.108853" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:27.104862" elapsed="0.004362">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:27.104623" elapsed="0.004678">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:27.109483" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:27.109331" elapsed="0.000211"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:27.104607" elapsed="0.004957">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:27.109933" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:27.110053" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:27.110021" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:27.110005" 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-10-16T01:19:27.110254" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:27.110316" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:19:27.103135" elapsed="0.007289">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:27.110492" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:19:27.058835" elapsed="0.051794">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:27.111058" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:27.110823" elapsed="0.000317"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:27.110773" elapsed="0.000409"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:27.111266" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:19:27.056666" elapsed="0.054768">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:27.053346" elapsed="0.058218">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:27.053303" elapsed="0.058336">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:27.111922" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:27.112276" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:27.112590" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:27.112984" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:27.113416" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:27.113752" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:27.114122" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:27.114364" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:19:27.045676" elapsed="0.068790">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:27.114529" elapsed="0.000014"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:27.043865" elapsed="0.070752">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:27.114862" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:27.114719" elapsed="0.000205"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:27.115082" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:27.114946" elapsed="0.000184"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:27.115292" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:27.115152" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:27.114682" elapsed="0.000678"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:27.043503" elapsed="0.071896">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:27.043134" elapsed="0.072321">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:27.115503" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:27.034250" elapsed="0.081346">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:27.115921" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:27.116144" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:27.116003" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:27.115987" elapsed="0.000225"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:27.116337" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:27.116505" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:27.116563" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:27.032605" elapsed="0.084093">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:27.032160" elapsed="0.084618">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:27.031896" elapsed="0.084933">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:27.031105" elapsed="0.085823">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:27.117144" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:27.009858" elapsed="0.107391">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:28.136415" elapsed="0.000425"/>
</kw>
<msg time="2026-10-16T01:19:28.136980" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:28.135152" elapsed="0.001948"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:28.134129" elapsed="0.003128"/>
</kw>
<msg time="2026-10-16T01:19:28.137347" 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-10-16T01:19:28.127574" elapsed="0.009863"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:28.126693" elapsed="0.010894"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:28.138632" 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-10-16T01:19:28.138115" elapsed="0.000655"/>
</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-10-16T01:19:28.145487" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:28.144694" elapsed="0.000851"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:28.146543" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:28.145936" elapsed="0.000661"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:28.146692" elapsed="0.000095"/>
</return>
<msg time="2026-10-16T01:19:28.147036" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:28.143888" elapsed="0.003199"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:28.147419" elapsed="0.000323"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:28.148842" 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-10-16T01:19:28.148137" elapsed="0.000761"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:28.149786" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:28.149249" elapsed="0.000592"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:28.150672" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:28.150175" elapsed="0.000581"/>
</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-10-16T01:19:28.159478" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:28.158095" elapsed="0.001588"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:28.159867" elapsed="0.000157"/>
</return>
<msg time="2026-10-16T01:19:28.160461" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:28.154820" elapsed="0.005765"/>
</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-10-16T01:19:28.184085" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:28.183613" elapsed="0.000509"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:28.185111" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:28.184802" elapsed="0.000407">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:28.185325" 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-10-16T01:19:28.184338" elapsed="0.001018"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:28.186085" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:28.185592" elapsed="0.000528"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:28.186504" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:28.186697" 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-10-16T01:19:28.186347" elapsed="0.000405"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:28.187342" 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-10-16T01:19:28.187037" elapsed="0.000361"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:28.188914" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:28.188536" elapsed="0.000419"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:28.189387" 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-10-16T01:19:28.189131" elapsed="0.000281"/>
</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-10-16T01:19:28.189693" elapsed="0.000036"/>
</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-10-16T01:19:28.189892" elapsed="0.000033"/>
</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-10-16T01:19:28.190084" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:28.189564" elapsed="0.000572"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:28.189454" elapsed="0.000709"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:28.190203" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:28.190332" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:28.188036" elapsed="0.002319"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:28.187484" elapsed="0.002900"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:28.190554" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:28.190409" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:28.187460" elapsed="0.003163"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:28.191196" 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-10-16T01:19:28.190793" elapsed="0.000428"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:28.191265" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:28.182901" elapsed="0.008463"/>
</kw>
<msg time="2026-10-16T01:19:28.191445" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:28.177258" elapsed="0.014235"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:28.195315" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:28.199098" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:28.202863" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:28.203052" 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-10-16T01:19:28.203229" elapsed="0.000019"/>
</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-10-16T01:19:28.203563" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:28.203423" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:28.203409" elapsed="0.000226"/>
</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-10-16T01:19:28.203803" 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-10-16T01:19:28.204040" 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-10-16T01:19:28.204201" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:28.203383" elapsed="0.000866"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:28.203296" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:28.204421" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:28.204488" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:28.204592" 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-10-16T01:19:28.176389" elapsed="0.028226"/>
</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-10-16T01:19:28.205739" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:28.205533" elapsed="0.000266">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:28.205883" 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-10-16T01:19:28.205213" elapsed="0.000706"/>
</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-10-16T01:19:28.206202" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:28.205984" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:28.206757" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:28.206476" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:28.206313" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:28.205968" elapsed="0.000866"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:28.207344" 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-10-16T01:19:28.207007" elapsed="0.000361"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:28.207414" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:28.207537" 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-manganese/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-10-16T01:19:28.204893" elapsed="0.002667"/>
</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-10-16T01:19:28.208636" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:28.208445" elapsed="0.000264">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:28.208795" 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-10-16T01:19:28.208131" elapsed="0.000687"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:28.210498" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:19:28.210390" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:28.208865" elapsed="0.001712"/>
</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-10-16T01:19:28.210745" 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-10-16T01:19:28.210936" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:28.210999" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:28.211127" 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-manganese/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-10-16T01:19:28.207820" elapsed="0.003331"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:28.212380" 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-10-16T01:19:28.212150" elapsed="0.000274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:28.212853" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:28.212611" 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-10-16T01:19:28.216980" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:28.217034" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:28.217138" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:28.213204" elapsed="0.004285">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:28.212970" elapsed="0.004598">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:28.217772" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:28.217599" elapsed="0.000233"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:28.212953" elapsed="0.004902">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:28.218202" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:28.218357" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:28.218323" elapsed="0.000073"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:28.218306" elapsed="0.000111"/>
</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-10-16T01:19:28.218555" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:28.218617" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:19:28.211423" elapsed="0.007314">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:28.218808" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:19:28.166762" elapsed="0.052189">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:28.219344" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:28.219125" elapsed="0.000301"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:28.219076" elapsed="0.000392"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:28.219557" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:19:28.164572" elapsed="0.055174">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:28.161240" elapsed="0.058609">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:28.161196" elapsed="0.058739">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:28.220183" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:28.220528" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:28.220860" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:28.221227" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:28.221660" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:28.222015" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:28.222365" elapsed="0.000019"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:28.222603" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:19:28.153460" elapsed="0.069280">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:28.222803" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:28.151599" elapsed="0.071294">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:28.223126" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:28.222985" elapsed="0.000192"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:28.223425" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:28.223199" elapsed="0.000277"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:28.223641" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:28.223499" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:28.222969" elapsed="0.000763"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:28.151243" elapsed="0.072529">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:28.150852" elapsed="0.072974">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:28.223874" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:28.142475" elapsed="0.081506">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:28.224158" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:28.224376" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:28.224237" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:28.224221" elapsed="0.000226"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:28.224575" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:28.224861" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:28.224936" elapsed="0.000015"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:28.140753" elapsed="0.084276">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:28.140275" elapsed="0.084816">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:28.140035" elapsed="0.085105">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:28.139241" elapsed="0.085979">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:28.225428" elapsed="0.000021"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:28.118090" elapsed="0.107440">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:29.244768" elapsed="0.000423"/>
</kw>
<msg time="2026-10-16T01:19:29.245306" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:29.243477" elapsed="0.001943"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:29.242522" elapsed="0.003055"/>
</kw>
<msg time="2026-10-16T01:19:29.245671" 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-10-16T01:19:29.235796" elapsed="0.010000"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:29.234909" elapsed="0.011058"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:29.247148" 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-10-16T01:19:29.246562" elapsed="0.000682"/>
</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-10-16T01:19:29.254077" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:29.253292" elapsed="0.000843"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:29.255121" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:29.254466" elapsed="0.000709"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:29.255270" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:19:29.255562" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:29.252464" elapsed="0.003148"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:29.255994" elapsed="0.000287"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:29.257400" 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-10-16T01:19:29.256670" elapsed="0.000785"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:29.258374" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:29.257841" elapsed="0.000586"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:29.259291" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:29.258767" elapsed="0.000576"/>
</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-10-16T01:19:29.268105" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:29.266669" elapsed="0.001544"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:29.268341" elapsed="0.000133"/>
</return>
<msg time="2026-10-16T01:19:29.269167" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:29.263384" elapsed="0.005913"/>
</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-10-16T01:19:29.293371" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:29.292945" elapsed="0.000462"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:29.294404" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:29.294111" elapsed="0.000390">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:29.294619" 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-10-16T01:19:29.293624" elapsed="0.001026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:29.295354" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:29.294907" elapsed="0.000483"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:29.295799" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:29.296010" 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-10-16T01:19:29.295617" elapsed="0.000427"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:29.296622" 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-10-16T01:19:29.296313" elapsed="0.000366"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:29.297977" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:29.297616" elapsed="0.000419"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:29.298895" 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-10-16T01:19:29.298274" elapsed="0.000676"/>
</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-10-16T01:19:29.299347" elapsed="0.000028"/>
</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-10-16T01:19:29.299634" elapsed="0.000038"/>
</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-10-16T01:19:29.299936" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:29.299166" elapsed="0.000823"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:29.299012" elapsed="0.001005"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:29.300056" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:19:29.300187" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:29.297150" elapsed="0.003060"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:29.296786" elapsed="0.003452"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:29.300407" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:29.300263" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:29.296762" elapsed="0.003716"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:29.301053" 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-10-16T01:19:29.300631" elapsed="0.000448"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:29.301123" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:29.292213" elapsed="0.009008"/>
</kw>
<msg time="2026-10-16T01:19:29.301268" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:29.286403" elapsed="0.014910"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:29.305138" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:29.309113" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:29.312904" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:29.313093" elapsed="0.000019"/>
</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-10-16T01:19:29.313268" elapsed="0.000019"/>
</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-10-16T01:19:29.313601" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:29.313462" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:29.313449" elapsed="0.000225"/>
</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-10-16T01:19:29.313840" elapsed="0.000019"/>
</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-10-16T01:19:29.314028" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:29.314227" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:29.313423" elapsed="0.000854"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:29.313335" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:29.314452" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:29.314521" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:19:29.314625" 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-10-16T01:19:29.285544" elapsed="0.029105"/>
</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-10-16T01:19:29.315765" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:29.315560" elapsed="0.000266">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:29.315909" 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-10-16T01:19:29.315238" elapsed="0.000705"/>
</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-10-16T01:19:29.316233" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:29.316008" elapsed="0.000277"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:29.316747" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:29.316468" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:29.316308" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:29.315991" elapsed="0.000835"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:29.317333" 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-10-16T01:19:29.316995" elapsed="0.000362"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:29.317402" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:29.317526" 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-manganese/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-10-16T01:19:29.314940" elapsed="0.002609"/>
</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-10-16T01:19:29.318632" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:29.318440" elapsed="0.000250">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:29.318791" 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-10-16T01:19:29.318122" elapsed="0.000692"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:29.318988" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:19:29.318878" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:29.318862" elapsed="0.000204"/>
</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-10-16T01:19:29.319218" elapsed="0.000019"/>
</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-10-16T01:19:29.319389" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:29.319449" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:29.319574" 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-manganese/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-10-16T01:19:29.317812" elapsed="0.001785"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:29.321024" 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-10-16T01:19:29.320783" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:29.321515" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:29.321289" elapsed="0.000268"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:19:29.325892" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:29.325957" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:29.326055" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:29.321859" elapsed="0.004546">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:29.321618" elapsed="0.004865">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:29.326669" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:29.326514" elapsed="0.000231"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:29.321601" elapsed="0.005168">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:29.327124" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:29.327246" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:29.327212" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:29.327196" elapsed="0.000109"/>
</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-10-16T01:19:29.327441" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:29.327507" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:19:29.320069" elapsed="0.007541">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:29.327678" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:19:29.275860" elapsed="0.051965">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:29.328230" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:29.328010" elapsed="0.000302"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:29.327961" elapsed="0.000394"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:29.328440" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:19:29.273637" elapsed="0.054971">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:29.269782" elapsed="0.058950">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:29.269739" elapsed="0.059071">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:29.329074" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:29.329451" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:29.329782" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:29.330145" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:29.330573" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:29.330924" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:29.331274" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:29.331513" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:19:29.262074" elapsed="0.069541">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:29.331678" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:29.260199" elapsed="0.071610">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:29.332047" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:29.331891" elapsed="0.000207"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:29.332259" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:29.332121" elapsed="0.000187"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:29.332472" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:29.332331" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:29.331874" elapsed="0.000667"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:29.259844" elapsed="0.072736">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:29.259437" elapsed="0.073196">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:29.332682" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:29.251044" elapsed="0.081753">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:29.332985" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:29.333207" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:29.333065" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:29.333050" elapsed="0.000227"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:29.333402" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:29.333570" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:29.333629" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:29.249228" elapsed="0.084576">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:29.248760" elapsed="0.085110">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:29.248489" elapsed="0.085485">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:29.247688" elapsed="0.086372">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:29.334271" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:29.226307" elapsed="0.108070">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:30.354323" elapsed="0.000436"/>
</kw>
<msg time="2026-10-16T01:19:30.354877" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:30.352856" elapsed="0.002163"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:30.351735" elapsed="0.003442"/>
</kw>
<msg time="2026-10-16T01:19:30.355267" 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-10-16T01:19:30.345030" elapsed="0.010326"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:30.344100" elapsed="0.011403"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:30.356551" 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-10-16T01:19:30.356036" elapsed="0.000606"/>
</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-10-16T01:19:30.363273" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:30.362473" elapsed="0.000858"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:30.364333" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:30.363662" elapsed="0.000725"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:30.364483" elapsed="0.000064"/>
</return>
<msg time="2026-10-16T01:19:30.364806" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:30.361633" elapsed="0.003226"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:30.365221" elapsed="0.000286"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:30.366600" 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-10-16T01:19:30.365903" elapsed="0.000751"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:30.367546" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:30.367037" elapsed="0.000561"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:30.368464" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:30.367960" elapsed="0.000559"/>
</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-10-16T01:19:30.377394" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:30.376006" elapsed="0.001500"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:30.377634" elapsed="0.000215"/>
</return>
<msg time="2026-10-16T01:19:30.378310" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:30.372620" elapsed="0.005819"/>
</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-10-16T01:19:30.401016" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:30.400678" elapsed="0.000366"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:30.401761" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:30.401518" elapsed="0.000317">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:30.401933" 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-10-16T01:19:30.401202" elapsed="0.000755"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:30.402444" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:30.402125" elapsed="0.000344"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:30.402763" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:30.402913" 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-10-16T01:19:30.402632" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:30.403366" 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-10-16T01:19:30.403144" elapsed="0.000262"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:30.404478" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:30.404098" elapsed="0.000422"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:30.404985" 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-10-16T01:19:30.404695" 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-10-16T01:19:30.405297" 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-10-16T01:19:30.405481" elapsed="0.000022"/>
</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-10-16T01:19:30.405661" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:30.405168" elapsed="0.000560"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:30.405055" elapsed="0.000703"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:30.405800" elapsed="0.000029"/>
</return>
<msg time="2026-10-16T01:19:30.405949" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:30.403741" elapsed="0.002232"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:30.403472" elapsed="0.002530"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:30.406171" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:30.406028" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:30.403453" elapsed="0.002788"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:30.406805" 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-10-16T01:19:30.406394" elapsed="0.000437"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:30.406876" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:30.400178" elapsed="0.006811"/>
</kw>
<msg time="2026-10-16T01:19:30.407037" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:30.396103" elapsed="0.010982"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:30.410897" elapsed="0.000037"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:30.414765" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:30.418554" elapsed="0.000033"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:30.418754" elapsed="0.000020"/>
</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-10-16T01:19:30.418948" 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-10-16T01:19:30.419287" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:30.419146" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:30.419132" elapsed="0.000227"/>
</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-10-16T01:19:30.419510" elapsed="0.000019"/>
</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-10-16T01:19:30.419685" 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-10-16T01:19:30.419862" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:30.419107" elapsed="0.000803"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:30.419017" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:30.420097" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:30.420170" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:19:30.420274" 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-10-16T01:19:30.395187" elapsed="0.025111"/>
</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-10-16T01:19:30.421402" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:30.421211" elapsed="0.000251">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:30.421545" 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-10-16T01:19:30.420875" elapsed="0.000696"/>
</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-10-16T01:19:30.421868" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:30.421636" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:30.422390" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:30.422128" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:30.421957" elapsed="0.000490"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:30.421620" elapsed="0.000847"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:30.422990" 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-10-16T01:19:30.422623" elapsed="0.000420"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:30.423090" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:19:30.423222" 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-manganese/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-10-16T01:19:30.420560" elapsed="0.002684"/>
</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-10-16T01:19:30.424326" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:30.424139" elapsed="0.000246">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:30.424469" 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-10-16T01:19:30.423801" elapsed="0.000690"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:30.424653" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:19:30.424555" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:30.424538" elapsed="0.000209"/>
</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-10-16T01:19:30.424898" elapsed="0.000036"/>
</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-10-16T01:19:30.425088" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:30.425148" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:30.425272" 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-manganese/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-10-16T01:19:30.423485" elapsed="0.001811"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:30.426686" 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-10-16T01:19:30.426461" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:30.427167" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:30.426947" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:19:30.431393" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:30.431445" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:30.431542" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:30.427489" elapsed="0.004423">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:30.427267" elapsed="0.004739">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:30.432187" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:30.432037" elapsed="0.000209"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:30.427251" elapsed="0.005017">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:30.432609" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:30.432752" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:30.432716" elapsed="0.000076"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:30.432684" elapsed="0.000128"/>
</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-10-16T01:19:30.432962" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:30.433056" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:19:30.425752" elapsed="0.007408">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:30.433227" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:19:30.385229" elapsed="0.048136">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:30.433779" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:30.433536" elapsed="0.000328"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:30.433487" elapsed="0.000419"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:30.434007" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:19:30.383010" elapsed="0.051163">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:30.378971" elapsed="0.055304">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:30.378894" elapsed="0.055454">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:30.434595" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:30.434986" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:30.435301" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:30.435649" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:30.436116" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:30.436429" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:30.436802" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:30.437060" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:19:30.371293" elapsed="0.065869">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:30.437223" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:30.369406" elapsed="0.067906">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:30.437532" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:30.437391" elapsed="0.000191"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:30.437774" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:30.437605" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:30.437999" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:30.437845" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:30.437375" elapsed="0.000722"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:30.369077" elapsed="0.069061">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:30.368629" elapsed="0.069562">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:30.438239" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:30.360274" elapsed="0.078055">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:30.438505" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:30.438746" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:30.438584" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:30.438568" elapsed="0.000249"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:30.438956" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:30.439126" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:30.439184" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:30.358647" elapsed="0.080630">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:30.358200" elapsed="0.081139">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:30.357948" elapsed="0.081440">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:30.357145" elapsed="0.082325">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:30.439678" elapsed="0.000145"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:30.335193" elapsed="0.104720">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:31.458901" elapsed="0.000425"/>
</kw>
<msg time="2026-10-16T01:19:31.459437" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:31.457609" elapsed="0.001942"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:31.456665" elapsed="0.003072"/>
</kw>
<msg time="2026-10-16T01:19:31.460019" 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-10-16T01:19:31.450048" elapsed="0.010069"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:31.449065" elapsed="0.011206"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:31.461329" 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-10-16T01:19:31.460780" elapsed="0.000641"/>
</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-10-16T01:19:31.468504" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:31.467731" elapsed="0.000831"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:31.469554" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:31.468949" elapsed="0.000659"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:31.469733" elapsed="0.000065"/>
</return>
<msg time="2026-10-16T01:19:31.470051" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:31.466895" elapsed="0.003207"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:31.470431" elapsed="0.000319"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:31.471842" 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-10-16T01:19:31.471140" elapsed="0.000758"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:31.472806" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:31.472262" elapsed="0.000599"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:31.473696" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:31.473198" elapsed="0.000582"/>
</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-10-16T01:19:31.482512" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:31.481118" elapsed="0.001501"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:31.482789" elapsed="0.000165"/>
</return>
<msg time="2026-10-16T01:19:31.483393" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:31.477850" elapsed="0.005668"/>
</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-10-16T01:19:31.508367" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:31.507920" elapsed="0.000483"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:31.509428" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:31.509134" elapsed="0.000393">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:31.509644" 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-10-16T01:19:31.508617" elapsed="0.001058"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:31.510382" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:31.509948" elapsed="0.000469"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:31.510821" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:31.511034" 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-10-16T01:19:31.510642" elapsed="0.000426"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:31.511641" 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-10-16T01:19:31.511336" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:31.513169" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:31.512833" elapsed="0.000393"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:31.513865" 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-10-16T01:19:31.513482" elapsed="0.000416"/>
</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-10-16T01:19:31.514304" elapsed="0.000028"/>
</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-10-16T01:19:31.514553" elapsed="0.000034"/>
</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-10-16T01:19:31.514959" elapsed="0.000027"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:31.514126" elapsed="0.000898"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:31.513974" elapsed="0.001077"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:31.515091" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:31.515220" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:31.512343" elapsed="0.002900"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:31.511994" elapsed="0.003278"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:31.515442" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:31.515297" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:31.511788" elapsed="0.003724"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:31.516119" 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-10-16T01:19:31.515668" elapsed="0.000476"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:31.516188" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:31.507204" elapsed="0.009082"/>
</kw>
<msg time="2026-10-16T01:19:31.516333" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:31.501485" elapsed="0.014894"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:31.520162" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:31.523897" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:31.527650" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:31.527839" elapsed="0.000020"/>
</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-10-16T01:19:31.528032" 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-10-16T01:19:31.528369" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:31.528229" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:31.528215" elapsed="0.000227"/>
</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-10-16T01:19:31.528594" 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-10-16T01:19:31.528788" 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-10-16T01:19:31.528966" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:31.528189" elapsed="0.000826"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:31.528101" elapsed="0.000967"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:31.529222" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:31.529290" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:31.529393" 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-10-16T01:19:31.500622" elapsed="0.028794"/>
</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-10-16T01:19:31.530516" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:31.530326" elapsed="0.000249">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:31.530657" 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-10-16T01:19:31.530006" elapsed="0.000674"/>
</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-10-16T01:19:31.530989" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:31.530759" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:31.531484" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:31.531224" elapsed="0.000283"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:31.531064" elapsed="0.000475"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:31.530742" elapsed="0.000817"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:31.532084" 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-10-16T01:19:31.531734" elapsed="0.000374"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:31.532153" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:31.532275" 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-manganese/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-10-16T01:19:31.529675" elapsed="0.002623"/>
</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-10-16T01:19:31.534896" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:31.533182" elapsed="0.001792">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:31.535060" 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-10-16T01:19:31.532851" elapsed="0.002232"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:31.535247" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:19:31.535148" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:31.535130" elapsed="0.000194"/>
</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-10-16T01:19:31.535476" 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-10-16T01:19:31.535648" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:31.535732" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:19:31.535858" 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-manganese/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-10-16T01:19:31.532539" elapsed="0.003342"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:31.537125" 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-10-16T01:19:31.536881" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:31.537576" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:31.537354" elapsed="0.000263"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:19:31.541773" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:31.541860" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:31.541984" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:31.537923" elapsed="0.004411">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:31.537682" elapsed="0.004728">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:31.542592" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:31.542441" elapsed="0.000210"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:31.537663" elapsed="0.005015">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:31.543043" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:31.543164" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:31.543130" elapsed="0.000073"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:31.543114" elapsed="0.000109"/>
</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-10-16T01:19:31.543360" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:31.543423" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:19:31.536166" elapsed="0.007358">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:31.543593" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:19:31.490883" elapsed="0.052862">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:31.544148" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:31.543916" elapsed="0.000315"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:31.543868" elapsed="0.000404"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:31.544358" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:19:31.488077" elapsed="0.056447">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:31.484246" elapsed="0.060392">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:31.484200" elapsed="0.060531">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:31.544996" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:31.545341" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:31.545650" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:31.546060" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:31.546524" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:31.546860" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:31.547221" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:31.547461" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:19:31.476504" elapsed="0.071059">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:31.547629" elapsed="0.000017"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:31.474594" elapsed="0.073150">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:31.547984" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:31.547829" elapsed="0.000207"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:31.548197" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:31.548058" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:31.548421" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:31.548269" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:31.547813" elapsed="0.000679"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:31.474270" elapsed="0.074261">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:31.473873" elapsed="0.074712">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:31.548635" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:31.465388" elapsed="0.083414">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:31.548993" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:31.549213" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:31.549073" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:31.549057" elapsed="0.000225"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:31.549407" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:31.549574" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:31.549632" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:31.463534" elapsed="0.086270">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:31.463016" elapsed="0.086853">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:31.462655" elapsed="0.087264">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:31.461897" elapsed="0.088123">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:31.550271" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:31.440640" elapsed="0.109737">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:32.570252" elapsed="0.000400"/>
</kw>
<msg time="2026-10-16T01:19:32.570799" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:32.568964" elapsed="0.001954"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:32.567986" elapsed="0.003118"/>
</kw>
<msg time="2026-10-16T01:19:32.571196" 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-10-16T01:19:32.561177" elapsed="0.010111"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:32.560254" elapsed="0.011186"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:32.572538" 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-10-16T01:19:32.572008" elapsed="0.000625"/>
</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-10-16T01:19:32.579406" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:32.578613" elapsed="0.000852"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:32.580535" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:32.579866" elapsed="0.000724"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:32.580691" elapsed="0.000109"/>
</return>
<msg time="2026-10-16T01:19:32.581070" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:32.577801" elapsed="0.003321"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:32.581450" elapsed="0.000341"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:32.582929" 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-10-16T01:19:32.582223" elapsed="0.000788"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:32.584052" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:32.583338" elapsed="0.000772"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:32.585074" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:32.584425" elapsed="0.000703"/>
</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-10-16T01:19:32.594032" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:32.592578" elapsed="0.001563"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:32.594269" elapsed="0.000134"/>
</return>
<msg time="2026-10-16T01:19:32.594877" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:32.589324" elapsed="0.005706"/>
</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-10-16T01:19:32.619113" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:32.618646" elapsed="0.000504"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:32.620269" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:32.619921" elapsed="0.000467">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:32.620513" 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-10-16T01:19:32.619441" elapsed="0.001106"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:32.621359" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:32.620810" elapsed="0.000587"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:32.621822" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:32.622045" 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-10-16T01:19:32.621632" elapsed="0.000449"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:32.622734" 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-10-16T01:19:32.622370" elapsed="0.000442"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:32.623860" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:32.623601" elapsed="0.000301"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:32.624545" 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-10-16T01:19:32.624126" elapsed="0.000446"/>
</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-10-16T01:19:32.624880" 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-10-16T01:19:32.625085" 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-10-16T01:19:32.625283" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:32.624748" elapsed="0.000588"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:32.624617" elapsed="0.000747"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:32.625404" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:19:32.625537" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:32.623257" elapsed="0.002305"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:32.622923" elapsed="0.002669"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:32.625783" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:32.625617" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:32.622892" elapsed="0.002964"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:32.626454" 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-10-16T01:19:32.626027" elapsed="0.000453"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:32.626525" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:32.617947" elapsed="0.008677"/>
</kw>
<msg time="2026-10-16T01:19:32.626672" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:32.612229" elapsed="0.014505"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:32.630765" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:32.634666" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:32.638512" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:32.638694" 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-10-16T01:19:32.638887" elapsed="0.000019"/>
</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-10-16T01:19:32.639242" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:32.639101" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:32.639087" elapsed="0.000227"/>
</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-10-16T01:19:32.639466" 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-10-16T01:19:32.639641" elapsed="0.000018"/>
</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-10-16T01:19:32.639818" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:32.639061" elapsed="0.000807"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:32.638968" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:32.640055" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:32.640123" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:32.640227" 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-10-16T01:19:32.611272" elapsed="0.028978"/>
</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-10-16T01:19:32.641400" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:32.641205" elapsed="0.000256">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:32.641546" 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-10-16T01:19:32.640854" elapsed="0.000715"/>
</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-10-16T01:19:32.641869" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:32.641631" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:32.642389" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:32.642123" elapsed="0.000290"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:32.641962" elapsed="0.000484"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:32.641615" elapsed="0.000851"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:32.642994" 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-10-16T01:19:32.642622" elapsed="0.000397"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:32.643065" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:32.643189" 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-manganese/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-10-16T01:19:32.640514" elapsed="0.002697"/>
</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-10-16T01:19:32.644330" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:32.644140" elapsed="0.000249">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:32.644473" 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-10-16T01:19:32.643802" elapsed="0.000694"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:32.644661" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:19:32.644560" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:32.644543" elapsed="0.000216"/>
</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-10-16T01:19:32.644911" elapsed="0.000020"/>
</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-10-16T01:19:32.645100" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:32.645160" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:32.645284" 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-manganese/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-10-16T01:19:32.643489" elapsed="0.001819"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:32.646719" 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-10-16T01:19:32.646478" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:32.647186" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:32.646965" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:19:32.651414" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:32.651467" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:32.651564" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:32.647505" elapsed="0.004459">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:32.647286" elapsed="0.004758">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:32.652225" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:32.652076" elapsed="0.000207"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:32.647269" elapsed="0.005036">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:32.652644" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:32.652787" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:32.652753" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:32.652736" elapsed="0.000110"/>
</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-10-16T01:19:32.652994" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:32.653056" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:19:32.645768" elapsed="0.007391">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:32.653257" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:19:32.601514" elapsed="0.051873">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:32.653802" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:32.653556" elapsed="0.000330"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:32.653508" elapsed="0.000421"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:32.654030" elapsed="0.000038"/>
</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="FAIL" start="2026-10-16T01:19:32.599318" elapsed="0.054880">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:32.595485" elapsed="0.058812">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:32.595442" elapsed="0.058930">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:32.654622" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:32.654999" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:32.655314" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:32.655662" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:32.656132" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:32.656447" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:32.656819" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:32.657072" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:19:32.587921" elapsed="0.069254">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:32.657237" elapsed="0.000014"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:32.586015" elapsed="0.071311">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:32.657548" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:32.657407" elapsed="0.000192"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:32.657782" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:32.657622" elapsed="0.000211"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:32.658013" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:32.657855" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:32.657391" elapsed="0.000692"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:32.585596" elapsed="0.072525">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:32.585224" elapsed="0.072949">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:32.658222" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:32.576373" elapsed="0.081982">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:32.658534" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:32.658876" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:32.658614" elapsed="0.000312"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:32.658598" elapsed="0.000365"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:32.659091" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:32.659265" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:32.659323" elapsed="0.000015"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:32.574755" elapsed="0.084670">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:32.574281" elapsed="0.085208">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:32.574026" elapsed="0.085512">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:32.573171" elapsed="0.086448">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:32.659843" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:32.551211" elapsed="0.108756">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:33.679791" elapsed="0.000434"/>
</kw>
<msg time="2026-10-16T01:19:33.680336" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:33.678501" elapsed="0.001949"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:33.677558" elapsed="0.003049"/>
</kw>
<msg time="2026-10-16T01:19:33.680728" 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-10-16T01:19:33.670471" elapsed="0.010354"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:33.669510" elapsed="0.011490"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:33.682057" 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-10-16T01:19:33.681476" elapsed="0.000677"/>
</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-10-16T01:19:33.688769" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:33.687998" elapsed="0.000830"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:33.689820" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:33.689184" elapsed="0.000693"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:33.690085" elapsed="0.000067"/>
</return>
<msg time="2026-10-16T01:19:33.690391" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:33.687160" elapsed="0.003283"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:33.690804" elapsed="0.000317"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:33.692220" 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-10-16T01:19:33.691490" elapsed="0.000787"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:33.693178" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:33.692607" elapsed="0.000624"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:33.694099" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:33.693541" elapsed="0.000612"/>
</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-10-16T01:19:33.702916" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:33.701481" elapsed="0.001570"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:33.703179" elapsed="0.000136"/>
</return>
<msg time="2026-10-16T01:19:33.703937" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:33.698190" elapsed="0.005916"/>
</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-10-16T01:19:33.727585" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:33.727156" elapsed="0.000467"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:33.728623" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:33.728323" elapsed="0.000422">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:33.728865" 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-10-16T01:19:33.727861" elapsed="0.001035"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:33.729584" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:33.729147" elapsed="0.000471"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:33.730059" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:33.730255" 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-10-16T01:19:33.729865" elapsed="0.000423"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:33.730883" 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-10-16T01:19:33.730551" elapsed="0.000407"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:33.732439" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:33.731896" elapsed="0.000601"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:33.733176" 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-10-16T01:19:33.732778" elapsed="0.000422"/>
</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-10-16T01:19:33.733490" elapsed="0.000020"/>
</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-10-16T01:19:33.733670" elapsed="0.000022"/>
</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-10-16T01:19:33.733866" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:33.733360" elapsed="0.000557"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:33.733245" elapsed="0.000719"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:33.734009" elapsed="0.000029"/>
</return>
<msg time="2026-10-16T01:19:33.734190" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:33.731405" elapsed="0.002809"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:33.731054" elapsed="0.003188"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:33.734412" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:33.734268" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:33.731027" elapsed="0.003456"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:33.735064" 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-10-16T01:19:33.734637" elapsed="0.000452"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:33.735133" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:33.726415" elapsed="0.008818"/>
</kw>
<msg time="2026-10-16T01:19:33.735281" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:33.720728" elapsed="0.014600"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:33.739125" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:33.742898" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:33.746627" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:33.746817" elapsed="0.000020"/>
</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-10-16T01:19:33.747005" 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-10-16T01:19:33.747351" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:33.747210" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:33.747197" elapsed="0.000226"/>
</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-10-16T01:19:33.747572" elapsed="0.000019"/>
</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-10-16T01:19:33.747766" 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-10-16T01:19:33.747928" elapsed="0.000033"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:33.747165" elapsed="0.000826"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:33.747074" elapsed="0.000941"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:33.748165" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:33.748231" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:19:33.748336" 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-10-16T01:19:33.719837" elapsed="0.028522"/>
</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-10-16T01:19:33.749493" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:33.749301" elapsed="0.000252">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:33.749636" 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-10-16T01:19:33.748980" elapsed="0.000678"/>
</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-10-16T01:19:33.749967" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:33.749738" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:33.750483" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:33.750215" elapsed="0.000293"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:33.750044" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:33.749721" elapsed="0.000839"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:33.751087" 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-10-16T01:19:33.750734" elapsed="0.000378"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:33.751159" elapsed="0.000039"/>
</return>
<msg time="2026-10-16T01:19:33.751296" 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-manganese/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-10-16T01:19:33.748655" elapsed="0.002663"/>
</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-10-16T01:19:33.752396" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:33.752207" elapsed="0.000248">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:33.752537" 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-10-16T01:19:33.751873" elapsed="0.000686"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:33.752739" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:19:33.752622" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:33.752606" elapsed="0.000211"/>
</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-10-16T01:19:33.752981" elapsed="0.000020"/>
</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-10-16T01:19:33.753155" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:33.753214" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:33.753338" 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-manganese/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-10-16T01:19:33.751562" elapsed="0.001798"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:33.754764" 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-10-16T01:19:33.754524" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:33.755224" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:33.755006" elapsed="0.000258"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:19:33.759485" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:33.759548" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:33.759674" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:33.755547" elapsed="0.004519">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:33.755324" elapsed="0.004821">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:33.760332" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:33.760183" elapsed="0.000208"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:33.755308" elapsed="0.005105">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:33.760774" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:33.760899" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:33.760865" elapsed="0.000073"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:33.760849" 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-10-16T01:19:33.761109" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:33.761173" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:19:33.753821" elapsed="0.007455">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:33.761344" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:19:33.710216" elapsed="0.051268">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:33.761894" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:33.761655" elapsed="0.000337"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:33.761607" elapsed="0.000427"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:33.762119" elapsed="0.000039"/>
</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="FAIL" start="2026-10-16T01:19:33.708037" elapsed="0.054257">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:33.704575" elapsed="0.057820">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:33.704530" elapsed="0.057942">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:33.762736" elapsed="0.000025"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:33.763099" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:33.763415" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:33.763790" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:33.764240" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:33.764557" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:33.764928" elapsed="0.000036"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:33.765218" elapsed="0.000019"/>
</return>
<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="FAIL" start="2026-10-16T01:19:33.696849" elapsed="0.068473">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:33.765384" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:33.695003" elapsed="0.070471">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:33.765693" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:33.765554" elapsed="0.000210"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:33.765923" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:33.765786" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:33.766149" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:33.766006" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:33.765538" elapsed="0.000679"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:33.694620" elapsed="0.071635">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:33.694248" elapsed="0.072060">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:33.766358" elapsed="0.000013"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:33.685777" elapsed="0.080671">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:33.766622" elapsed="0.000018"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:33.766975" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:33.766818" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:33.766684" elapsed="0.000361"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:33.767171" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:33.767338" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:33.767402" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:33.684144" elapsed="0.083350">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:33.683634" elapsed="0.083923">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:33.683386" elapsed="0.084220">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:33.682597" elapsed="0.085092">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:33.767927" elapsed="0.000034"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:33.660777" elapsed="0.107269">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:34.787327" elapsed="0.000438"/>
</kw>
<msg time="2026-10-16T01:19:34.787881" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:34.786050" elapsed="0.001966"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:34.784919" elapsed="0.003256"/>
</kw>
<msg time="2026-10-16T01:19:34.788267" 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-10-16T01:19:34.778277" elapsed="0.010079"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:34.777366" elapsed="0.011141"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:34.789548" 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-10-16T01:19:34.789032" elapsed="0.000609"/>
</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-10-16T01:19:34.796340" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:34.795537" elapsed="0.000862"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:34.797399" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:34.796765" elapsed="0.000689"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:34.797549" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:19:34.797869" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:34.794663" elapsed="0.003259"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:34.798277" elapsed="0.000285"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:34.799653" 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-10-16T01:19:34.798980" elapsed="0.000760"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:34.800609" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:34.800102" elapsed="0.000560"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:34.801523" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:34.801023" elapsed="0.000552"/>
</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-10-16T01:19:34.810345" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:34.808907" elapsed="0.001548"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:34.810583" elapsed="0.000177"/>
</return>
<msg time="2026-10-16T01:19:34.811224" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:34.805574" elapsed="0.005775"/>
</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-10-16T01:19:34.835479" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:34.835054" elapsed="0.000461"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:34.836500" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:34.836211" elapsed="0.000383">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:34.836731" 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-10-16T01:19:34.835749" elapsed="0.001016"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:34.837528" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:34.837093" elapsed="0.000470"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:34.837986" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:34.838181" 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-10-16T01:19:34.837813" elapsed="0.000401"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:34.838812" 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-10-16T01:19:34.838481" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:34.840314" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:34.839992" elapsed="0.000379"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:34.841012" 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-10-16T01:19:34.840613" elapsed="0.000434"/>
</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-10-16T01:19:34.841436" elapsed="0.000029"/>
</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-10-16T01:19:34.841688" elapsed="0.000053"/>
</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-10-16T01:19:34.841905" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:34.841258" elapsed="0.000712"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:34.841107" elapsed="0.000892"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:34.842039" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:34.842168" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:34.839488" elapsed="0.002703"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:34.839135" elapsed="0.003084"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:34.842388" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:34.842244" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:34.838932" elapsed="0.003526"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:34.843029" 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-10-16T01:19:34.842613" elapsed="0.000442"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:34.843099" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:34.834322" elapsed="0.008875"/>
</kw>
<msg time="2026-10-16T01:19:34.843243" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:34.828596" elapsed="0.014693"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:34.847093" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:34.850854" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:34.854607" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:34.854829" elapsed="0.000020"/>
</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-10-16T01:19:34.855025" elapsed="0.000019"/>
</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-10-16T01:19:34.855366" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:34.855225" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:34.855210" elapsed="0.000228"/>
</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-10-16T01:19:34.855588" elapsed="0.000019"/>
</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-10-16T01:19:34.855779" 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-10-16T01:19:34.855941" elapsed="0.000032"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:34.855184" elapsed="0.000819"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:34.855093" elapsed="0.000934"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:34.856177" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:34.856243" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:19:34.856346" 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-10-16T01:19:34.827763" elapsed="0.028607"/>
</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-10-16T01:19:34.857461" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:34.857271" elapsed="0.000249">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:34.857601" 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-10-16T01:19:34.856939" elapsed="0.000684"/>
</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-10-16T01:19:34.857914" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:34.857684" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:34.858428" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:34.858167" elapsed="0.000284"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:34.858008" elapsed="0.000475"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:34.857668" elapsed="0.000835"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:34.859022" 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-10-16T01:19:34.858658" elapsed="0.000388"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:34.859090" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:34.859211" 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-manganese/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-10-16T01:19:34.856627" elapsed="0.002607"/>
</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-10-16T01:19:34.861786" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:34.860114" elapsed="0.001734">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:34.861933" 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-10-16T01:19:34.859784" elapsed="0.002190"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:34.862172" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:19:34.862071" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:34.862053" elapsed="0.000196"/>
</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-10-16T01:19:34.862401" 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-10-16T01:19:34.862573" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:34.862634" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:34.862778" 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-manganese/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-10-16T01:19:34.859474" elapsed="0.003328"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:34.864046" 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-10-16T01:19:34.863800" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:34.864501" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:34.864280" elapsed="0.000263"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:19:34.868457" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:34.868510" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:34.868615" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:34.864842" elapsed="0.004158">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:34.864603" elapsed="0.004475">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:34.869259" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:34.869109" elapsed="0.000209"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:34.864587" elapsed="0.004754">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:34.869680" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:34.869819" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:34.869785" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:34.869769" elapsed="0.000109"/>
</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-10-16T01:19:34.870028" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:34.870091" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:19:34.863089" elapsed="0.007104">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:34.870261" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:19:34.818038" elapsed="0.052356">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:34.870809" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:34.870562" elapsed="0.000361"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:34.870515" elapsed="0.000473"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:34.871076" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:19:34.815873" elapsed="0.055370">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:34.812071" elapsed="0.059274">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:34.812026" elapsed="0.059392">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:34.871667" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:34.872045" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:34.872360" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:34.872763" elapsed="0.000024"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:34.873219" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:34.873532" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:34.873917" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:34.874171" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:19:34.804261" elapsed="0.070011">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:34.874334" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:34.802428" elapsed="0.071996">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:34.874644" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:34.874504" elapsed="0.000191"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:34.874882" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:34.874744" elapsed="0.000187"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:34.875112" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:34.874970" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:34.874489" elapsed="0.000692"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:34.802097" elapsed="0.073123">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:34.801668" elapsed="0.073604">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:34.875321" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:34.793313" elapsed="0.082099">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:34.875614" elapsed="0.000074"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:34.875983" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:34.875823" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:34.875806" elapsed="0.000248"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:34.876181" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:34.876350" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:34.876410" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:34.791627" elapsed="0.084876">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:34.791179" elapsed="0.085386">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:34.790908" elapsed="0.085706">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:34.790141" elapsed="0.086554">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:34.877044" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:34.768852" elapsed="0.108316">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:35.897199" elapsed="0.000410"/>
</kw>
<msg time="2026-10-16T01:19:35.897758" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:35.895764" elapsed="0.002116"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:35.894813" elapsed="0.003253"/>
</kw>
<msg time="2026-10-16T01:19:35.898159" 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-10-16T01:19:35.887815" elapsed="0.010434"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:35.886931" elapsed="0.011467"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:35.899449" 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-10-16T01:19:35.898910" elapsed="0.000631"/>
</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-10-16T01:19:35.906197" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:35.905398" elapsed="0.000856"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:35.907252" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:35.906585" elapsed="0.000722"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:35.907402" elapsed="0.000065"/>
</return>
<msg time="2026-10-16T01:19:35.907696" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:35.904561" elapsed="0.003219"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:35.908139" elapsed="0.000288"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:35.909648" 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-10-16T01:19:35.908829" elapsed="0.000907"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:35.910637" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:35.910097" elapsed="0.000596"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:35.911576" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:35.911068" elapsed="0.000561"/>
</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-10-16T01:19:35.920489" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:35.919094" elapsed="0.001503"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:35.920766" elapsed="0.000138"/>
</return>
<msg time="2026-10-16T01:19:35.921358" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:35.915787" elapsed="0.005653"/>
</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-10-16T01:19:35.944218" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:35.943640" elapsed="0.000616"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:35.945256" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:35.944942" elapsed="0.000412">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:35.945472" 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-10-16T01:19:35.944473" elapsed="0.001030"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:35.946251" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:35.945761" elapsed="0.000515"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:35.946551" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:35.946713" 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-10-16T01:19:35.946438" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:35.947172" 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-10-16T01:19:35.946929" 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-10-16T01:19:35.948116" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:35.947873" elapsed="0.000284"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:35.948737" 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-10-16T01:19:35.948329" elapsed="0.000434"/>
</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-10-16T01:19:35.949061" 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-10-16T01:19:35.949243" elapsed="0.000022"/>
</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-10-16T01:19:35.949428" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:35.948916" elapsed="0.000563"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:35.948806" elapsed="0.000702"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:35.949550" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:35.949680" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:35.947524" elapsed="0.002194"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:35.947274" 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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:35.949917" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:35.949773" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:35.947257" elapsed="0.002750"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:35.950548" 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-10-16T01:19:35.950161" elapsed="0.000444"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:35.950652" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:35.942927" elapsed="0.007844"/>
</kw>
<msg time="2026-10-16T01:19:35.950820" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:35.937201" elapsed="0.013666"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:35.954691" elapsed="0.000037"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:35.958527" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:35.962342" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:35.962519" elapsed="0.000019"/>
</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-10-16T01:19:35.962695" 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-10-16T01:19:35.963072" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:35.962910" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:35.962897" 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-10-16T01:19:35.963297" 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-10-16T01:19:35.963473" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:35.963632" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:35.962870" elapsed="0.000810"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:35.962780" elapsed="0.000939"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:35.963871" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:35.963938" elapsed="0.000028"/>
</return>
<msg time="2026-10-16T01:19:35.964058" 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-10-16T01:19:35.936331" elapsed="0.027751"/>
</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-10-16T01:19:35.965234" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:35.965041" elapsed="0.000253">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:35.965378" 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-10-16T01:19:35.964680" elapsed="0.000722"/>
</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-10-16T01:19:35.965681" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:35.965466" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:35.966219" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:35.965936" elapsed="0.000308"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:35.965774" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:35.965449" elapsed="0.000848"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:35.966819" 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-10-16T01:19:35.966455" elapsed="0.000390"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:35.966891" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:35.967037" 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-manganese/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-10-16T01:19:35.964347" elapsed="0.002714"/>
</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-10-16T01:19:35.968147" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:35.967942" elapsed="0.000265">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:35.968292" 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-10-16T01:19:35.967604" elapsed="0.000711"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:35.968479" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:19:35.968379" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:35.968363" elapsed="0.000194"/>
</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-10-16T01:19:35.968723" 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-10-16T01:19:35.968897" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:35.968973" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:19:35.969102" 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-manganese/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-10-16T01:19:35.967308" elapsed="0.001818"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:35.970540" 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-10-16T01:19:35.970312" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:35.971036" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:35.970788" 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-10-16T01:19:35.975190" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:35.975244" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:35.975342" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:35.971364" elapsed="0.004354">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:35.971140" elapsed="0.004689">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:35.976025" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:35.975861" elapsed="0.000225"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:35.971122" elapsed="0.004986">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:35.976442" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:35.976562" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:35.976529" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:35.976513" elapsed="0.000109"/>
</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-10-16T01:19:35.976778" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:35.976842" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:19:35.969583" elapsed="0.007367">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:35.977039" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:19:35.926530" elapsed="0.050637">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:35.977552" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:35.977335" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:35.977287" elapsed="0.000390"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:35.977790" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:19:35.924368" elapsed="0.053602">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:35.921877" elapsed="0.056196">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:35.921847" elapsed="0.056300">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:35.978396" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:35.978757" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:35.979095" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:35.979462" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:35.979925" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:35.980281" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:35.980632" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:35.980901" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:19:35.914417" elapsed="0.066603">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:35.981116" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:35.912541" elapsed="0.068669">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:35.981436" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:35.981293" elapsed="0.000195"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:35.981648" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:35.981511" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:35.981887" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:35.981745" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:35.981276" elapsed="0.000697"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:35.912158" elapsed="0.069855">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:35.911754" elapsed="0.070313">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:35.982117" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:35.903197" elapsed="0.079012">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:35.982383" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:35.982604" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:35.982464" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:35.982448" elapsed="0.000226"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:35.982923" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:35.983114" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:35.983173" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:35.901552" elapsed="0.081714">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:35.901099" elapsed="0.082229">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:35.900821" elapsed="0.082555">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:35.900044" elapsed="0.083414">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:35.983743" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:35.878050" elapsed="0.105806">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:37.003284" elapsed="0.000489"/>
</kw>
<msg time="2026-10-16T01:19:37.003893" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:37.002027" elapsed="0.002140"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:37.001090" elapsed="0.003245"/>
</kw>
<msg time="2026-10-16T01:19:37.004428" 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-10-16T01:19:36.994252" elapsed="0.010268"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:36.993353" elapsed="0.011318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:37.005760" 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-10-16T01:19:37.005210" elapsed="0.000647"/>
</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-10-16T01:19:37.012494" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:37.011694" elapsed="0.000858"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:37.013549" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:37.012918" elapsed="0.000685"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:37.013729" elapsed="0.000066"/>
</return>
<msg time="2026-10-16T01:19:37.014050" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:37.010890" elapsed="0.003212"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:37.014429" elapsed="0.000312"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:37.015834" 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-10-16T01:19:37.015137" elapsed="0.000754"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:37.016781" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:37.016248" elapsed="0.000587"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:37.017666" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:37.017166" elapsed="0.000591"/>
</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-10-16T01:19:37.026670" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:37.025212" elapsed="0.001619"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:37.026982" elapsed="0.000139"/>
</return>
<msg time="2026-10-16T01:19:37.027551" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:37.021810" elapsed="0.005871"/>
</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-10-16T01:19:37.051507" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:37.051067" elapsed="0.000478"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:37.052562" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:37.052265" elapsed="0.000392">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:37.052813" 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-10-16T01:19:37.051789" elapsed="0.001057"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:37.053547" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:37.053107" elapsed="0.000475"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:37.054015" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:37.054280" 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-10-16T01:19:37.053832" elapsed="0.000482"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:37.054925" 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-10-16T01:19:37.054583" elapsed="0.000422"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:37.056461" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:37.056005" elapsed="0.000498"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:37.056950" 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-10-16T01:19:37.056677" 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-10-16T01:19:37.057283" 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-10-16T01:19:37.057468" elapsed="0.000022"/>
</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-10-16T01:19:37.057649" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:37.057153" elapsed="0.000562"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:37.057038" elapsed="0.000708"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:37.057788" elapsed="0.000029"/>
</return>
<msg time="2026-10-16T01:19:37.057928" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:37.055469" elapsed="0.002483"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:37.055101" elapsed="0.002897"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:37.058170" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:37.058024" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:37.055074" elapsed="0.003167"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:37.058804" 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-10-16T01:19:37.058398" elapsed="0.000432"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:37.058874" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:37.050297" elapsed="0.008693"/>
</kw>
<msg time="2026-10-16T01:19:37.059039" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:37.044621" elapsed="0.014465"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:37.062890" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:37.066688" elapsed="0.000038"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:37.070489" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:37.070713" 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-10-16T01:19:37.070897" 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-10-16T01:19:37.071269" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:37.071116" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:37.071102" elapsed="0.000245"/>
</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-10-16T01:19:37.071500" 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-10-16T01:19:37.071678" 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-10-16T01:19:37.071858" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:37.071075" elapsed="0.000832"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:37.070982" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:37.072101" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:37.072170" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:37.072293" 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-10-16T01:19:37.043778" elapsed="0.028539"/>
</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-10-16T01:19:37.073441" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:37.073251" elapsed="0.000249">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:37.073580" 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-10-16T01:19:37.072912" elapsed="0.000691"/>
</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-10-16T01:19:37.073935" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:37.073665" elapsed="0.000339"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:37.074460" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:37.074198" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:37.074027" elapsed="0.000488"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:37.073649" elapsed="0.000885"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:37.075059" 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-10-16T01:19:37.074690" elapsed="0.000394"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:37.075128" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:19:37.075250" 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-manganese/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-10-16T01:19:37.072590" elapsed="0.002683"/>
</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-10-16T01:19:37.076359" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:37.076170" elapsed="0.000247">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:37.076500" 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-10-16T01:19:37.075834" elapsed="0.000689"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:37.076683" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-10-16T01:19:37.076585" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:37.076569" elapsed="0.000207"/>
</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-10-16T01:19:37.076924" elapsed="0.000020"/>
</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-10-16T01:19:37.077147" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:37.077209" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:19:37.077333" 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-manganese/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-10-16T01:19:37.075525" elapsed="0.001832"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:37.078771" 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-10-16T01:19:37.078531" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:37.079233" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:37.079015" elapsed="0.000258"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:19:37.083313" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:37.083367" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:37.083464" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:37.079554" elapsed="0.004285">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:37.079333" elapsed="0.004586">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:37.084119" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:37.083953" elapsed="0.000225"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:37.079317" elapsed="0.004884">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:37.084537" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:37.084657" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:37.084623" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:37.084608" elapsed="0.000126"/>
</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-10-16T01:19:37.084872" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:37.084940" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:19:37.077814" elapsed="0.007243">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:37.085125" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:19:37.034029" elapsed="0.051234">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:37.085656" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:37.085434" elapsed="0.000329"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:37.085386" elapsed="0.000420"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:37.085894" elapsed="0.000039"/>
</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="FAIL" start="2026-10-16T01:19:37.031836" elapsed="0.054280">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:37.028411" elapsed="0.057808">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:37.028366" elapsed="0.057927">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:37.086542" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:37.086921" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:37.087249" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:37.087595" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:37.088060" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:37.088376" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:37.088769" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:37.089022" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:19:37.020446" elapsed="0.068679">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:37.089187" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:37.018573" elapsed="0.070704">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:37.089499" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:37.089358" elapsed="0.000191"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:37.089788" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:37.089572" elapsed="0.000269"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:37.090027" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:37.089864" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:37.089342" elapsed="0.000755"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:37.018247" elapsed="0.071888">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:37.017857" elapsed="0.072331">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:37.090241" elapsed="0.000019"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:37.009500" elapsed="0.080838">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:37.090512" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:37.090790" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:37.090589" elapsed="0.000250"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:37.090574" elapsed="0.000287"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:37.091031" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:37.091202" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:37.091260" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:37.007874" elapsed="0.083479">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:37.007388" elapsed="0.084027">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:37.007134" elapsed="0.084330">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:37.006328" elapsed="0.085220">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:37.091788" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:36.984630" elapsed="0.107264">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:38.110936" elapsed="0.000429"/>
</kw>
<msg time="2026-10-16T01:19:38.111480" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:38.109648" elapsed="0.001950"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:38.108747" elapsed="0.003042"/>
</kw>
<msg time="2026-10-16T01:19:38.111884" 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-10-16T01:19:38.102231" elapsed="0.009766"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:38.101341" elapsed="0.010807"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:38.113196" 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-10-16T01:19:38.112623" elapsed="0.000666"/>
</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-10-16T01:19:38.119893" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:38.119118" elapsed="0.000834"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:38.120958" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:38.120316" elapsed="0.000720"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:38.121132" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:19:38.121419" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:38.118265" elapsed="0.003206"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:38.121833" elapsed="0.000310"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:38.123239" 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-10-16T01:19:38.122508" elapsed="0.000787"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:38.124192" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:38.123622" elapsed="0.000625"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:38.125233" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:38.124554" elapsed="0.000733"/>
</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-10-16T01:19:38.134094" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:38.132659" elapsed="0.001547"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:38.134334" elapsed="0.000133"/>
</return>
<msg time="2026-10-16T01:19:38.135172" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:38.129408" elapsed="0.005892"/>
</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-10-16T01:19:38.158621" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:38.158197" elapsed="0.000460"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:38.159640" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:38.159354" elapsed="0.000406">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:38.159885" 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-10-16T01:19:38.158894" elapsed="0.001023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:38.160604" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:38.160170" elapsed="0.000473"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:38.161066" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:38.161258" 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-10-16T01:19:38.160892" elapsed="0.000399"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:38.161887" 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-10-16T01:19:38.161554" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:38.163403" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:38.163127" elapsed="0.000317"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:38.163899" 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-10-16T01:19:38.163629" 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-10-16T01:19:38.164215" elapsed="0.000020"/>
</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-10-16T01:19:38.164397" elapsed="0.000022"/>
</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-10-16T01:19:38.164575" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:38.164088" elapsed="0.000538"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:38.163966" elapsed="0.000687"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:38.164692" elapsed="0.000040"/>
</return>
<msg time="2026-10-16T01:19:38.164845" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:38.162563" elapsed="0.002305"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:38.162210" elapsed="0.002687"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:38.165079" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:38.164921" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:38.162027" elapsed="0.003123"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:38.165689" 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-10-16T01:19:38.165304" elapsed="0.000426"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:38.165775" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:38.157462" elapsed="0.008413"/>
</kw>
<msg time="2026-10-16T01:19:38.165962" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:38.151774" elapsed="0.014250"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:38.169818" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:38.173604" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:38.177470" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:38.177647" elapsed="0.000020"/>
</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-10-16T01:19:38.177848" 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-10-16T01:19:38.178205" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:38.178062" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:38.178048" 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-10-16T01:19:38.178430" elapsed="0.000019"/>
</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-10-16T01:19:38.178605" elapsed="0.000018"/>
</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-10-16T01:19:38.178779" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:38.178021" elapsed="0.000808"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:38.177918" elapsed="0.000935"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:38.179016" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:38.179084" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:38.179188" 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-10-16T01:19:38.150900" elapsed="0.028312"/>
</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-10-16T01:19:38.180308" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:38.180117" elapsed="0.000251">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:38.180481" 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-10-16T01:19:38.179783" elapsed="0.000721"/>
</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-10-16T01:19:38.180799" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:38.180569" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:38.181324" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:38.181050" elapsed="0.000298"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:38.180875" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:38.180552" elapsed="0.000849"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:38.181916" 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-10-16T01:19:38.181558" elapsed="0.000383"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:38.182002" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:19:38.182127" 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-manganese/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-10-16T01:19:38.179473" elapsed="0.002677"/>
</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-10-16T01:19:38.184830" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:38.183035" elapsed="0.001858">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:38.184993" 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-10-16T01:19:38.182688" elapsed="0.002330"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:38.185185" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:19:38.185083" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:38.185066" elapsed="0.000198"/>
</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-10-16T01:19:38.185417" 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-10-16T01:19:38.185589" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:38.185649" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:38.185793" 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-manganese/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-10-16T01:19:38.182392" elapsed="0.003426"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:38.187090" 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-10-16T01:19:38.186810" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:38.187540" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:38.187319" elapsed="0.000262"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:19:38.191592" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:38.191645" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:38.191769" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:38.187883" elapsed="0.004263">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:38.187641" elapsed="0.004582">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:38.192403" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:38.192253" elapsed="0.000241"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:38.187625" elapsed="0.004893">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:38.192868" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:38.193009" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:38.192960" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:38.192944" 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-10-16T01:19:38.193203" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:38.193267" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:19:38.186103" elapsed="0.007264">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:38.193435" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:19:38.141293" elapsed="0.052274">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:38.193999" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:38.193761" elapsed="0.000321"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:38.193690" elapsed="0.000434"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:38.194210" elapsed="0.000037"/>
</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="FAIL" start="2026-10-16T01:19:38.139058" elapsed="0.055320">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:38.135788" elapsed="0.058691">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:38.135745" elapsed="0.058808">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:38.194826" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:38.195185" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:38.195500" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:38.195870" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:38.196311" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:38.196629" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:38.197013" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:38.197252" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:19:38.128078" elapsed="0.069275">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:38.197415" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:38.126203" elapsed="0.071300">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:38.197779" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:38.197615" elapsed="0.000216"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:38.198000" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:38.197853" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:38.198213" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:38.198072" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:38.197598" elapsed="0.000684"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:38.125804" elapsed="0.072515">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:38.125385" elapsed="0.072986">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:38.198420" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:38.116870" elapsed="0.081640">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:38.198685" elapsed="0.000145"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:38.199054" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:38.198894" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:38.198877" elapsed="0.000247"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:38.199249" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:38.199414" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:38.199472" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:38.115258" elapsed="0.084306">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:38.114788" elapsed="0.084838">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:38.114516" elapsed="0.085158">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:38.113762" elapsed="0.086008">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:38.199993" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:38.092642" elapsed="0.107457">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:39.219855" elapsed="0.000425"/>
</kw>
<msg time="2026-10-16T01:19:39.220397" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:39.218550" elapsed="0.001965"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:39.217600" elapsed="0.003074"/>
</kw>
<msg time="2026-10-16T01:19:39.220904" 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-10-16T01:19:39.210749" elapsed="0.010275"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:39.209809" elapsed="0.011374"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:39.222267" 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-10-16T01:19:39.221668" elapsed="0.000695"/>
</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-10-16T01:19:39.229292" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:39.228495" elapsed="0.000856"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:39.230352" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:39.229683" elapsed="0.000724"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:39.230504" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:19:39.230830" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:39.227656" elapsed="0.003227"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:39.231234" elapsed="0.000290"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:39.232622" 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-10-16T01:19:39.231925" elapsed="0.000753"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:39.233574" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:39.233065" elapsed="0.000563"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:39.234642" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:39.234120" elapsed="0.000576"/>
</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-10-16T01:19:39.243763" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:39.242207" elapsed="0.001671"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:39.244032" elapsed="0.000147"/>
</return>
<msg time="2026-10-16T01:19:39.244608" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:39.238882" elapsed="0.006087"/>
</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-10-16T01:19:39.268280" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:39.267833" elapsed="0.000484"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:39.269327" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:39.269022" elapsed="0.000406">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:39.269572" 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-10-16T01:19:39.268535" elapsed="0.001073"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:39.270373" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:39.269892" elapsed="0.000517"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:39.270824" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:39.271051" 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-10-16T01:19:39.270637" elapsed="0.000450"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:39.271615" 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-10-16T01:19:39.271329" elapsed="0.000337"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:39.272591" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:39.272358" elapsed="0.000274"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:39.273250" 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-10-16T01:19:39.272824" elapsed="0.000451"/>
</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-10-16T01:19:39.273573" 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-10-16T01:19:39.273777" elapsed="0.000022"/>
</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-10-16T01:19:39.273960" elapsed="0.000034"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:39.273442" elapsed="0.000585"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:39.273322" elapsed="0.000735"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:39.274099" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:19:39.274232" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:39.272021" elapsed="0.002234"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:39.271744" 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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:39.274454" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:39.274310" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:39.271725" elapsed="0.002799"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:39.275104" 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-10-16T01:19:39.274679" elapsed="0.000451"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:39.275173" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:39.267110" elapsed="0.008163"/>
</kw>
<msg time="2026-10-16T01:19:39.275320" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:39.261285" elapsed="0.014082"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:39.279254" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:39.283116" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:39.286934" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:39.287126" elapsed="0.000020"/>
</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-10-16T01:19:39.287305" 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-10-16T01:19:39.287682" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:39.287505" elapsed="0.000247"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:39.287491" elapsed="0.000285"/>
</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-10-16T01:19:39.287930" 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-10-16T01:19:39.288131" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:39.288294" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:39.287465" elapsed="0.000876"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:39.287373" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:39.288518" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:39.288586" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:19:39.288693" 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-10-16T01:19:39.260407" elapsed="0.028325"/>
</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-10-16T01:19:39.289952" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:39.289739" elapsed="0.000292">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:39.290116" 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-10-16T01:19:39.289342" elapsed="0.000797"/>
</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-10-16T01:19:39.290419" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:39.290202" elapsed="0.000269"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:39.290947" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:39.290666" elapsed="0.000307"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:39.290495" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:39.290185" elapsed="0.000856"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:39.291536" 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-10-16T01:19:39.291200" elapsed="0.000361"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:39.291606" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:39.291747" 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-manganese/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-10-16T01:19:39.289042" elapsed="0.002729"/>
</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-10-16T01:19:39.292860" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:39.292655" elapsed="0.000264">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:39.293016" 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-10-16T01:19:39.292340" elapsed="0.000699"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:39.293202" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:19:39.293103" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:39.293086" elapsed="0.000194"/>
</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-10-16T01:19:39.293431" elapsed="0.000020"/>
</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-10-16T01:19:39.293602" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:39.293662" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:19:39.293804" 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-manganese/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-10-16T01:19:39.292043" elapsed="0.001817"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:39.295289" 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-10-16T01:19:39.295058" elapsed="0.000274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:39.295798" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:39.295553" 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-10-16T01:19:39.300227" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:39.300281" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:39.300377" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:39.296144" elapsed="0.004614">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:39.295902" elapsed="0.004936">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:39.301058" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:39.300868" elapsed="0.000250"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:39.295884" elapsed="0.005256">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:39.301478" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:39.301598" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:39.301565" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:39.301549" elapsed="0.000108"/>
</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-10-16T01:19:39.301813" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:39.301878" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:19:39.294332" elapsed="0.007666">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:39.302068" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:19:39.250456" elapsed="0.051739">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:39.302582" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:39.302362" elapsed="0.000302"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:39.302315" elapsed="0.000412"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:39.302815" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:19:39.248253" elapsed="0.054746">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:39.245590" elapsed="0.057545">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:39.245541" elapsed="0.057671">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:39.303467" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:39.303912" elapsed="0.000024"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:39.304262" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:39.304615" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:39.305075" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:39.305415" elapsed="0.000027"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:39.305813" elapsed="0.000022"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:39.306068" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:19:39.237516" elapsed="0.068657">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:39.306237" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:39.235590" elapsed="0.070739">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:39.306552" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:39.306411" elapsed="0.000191"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:39.306781" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:39.306624" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:39.307005" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:39.306852" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:39.306395" elapsed="0.000679"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:39.235222" elapsed="0.071890">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:39.234825" elapsed="0.072360">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:39.307235" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:39.226236" elapsed="0.081092">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:39.307503" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:39.307836" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:39.307582" elapsed="0.000304"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:39.307566" elapsed="0.000342"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:39.308049" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:39.308218" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:39.308276" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:39.224524" elapsed="0.083887">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:39.224057" elapsed="0.084419">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:39.223763" elapsed="0.084763">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:39.222847" elapsed="0.085763">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:39.308840" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:39.200909" elapsed="0.108038">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:40.328205" elapsed="0.000409"/>
</kw>
<msg time="2026-10-16T01:19:40.328761" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:40.326915" elapsed="0.001971"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:40.325971" elapsed="0.003098"/>
</kw>
<msg time="2026-10-16T01:19:40.329163" 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-10-16T01:19:40.319383" elapsed="0.009872"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:40.318425" elapsed="0.010983"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:40.330458" 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-10-16T01:19:40.329920" elapsed="0.000633"/>
</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-10-16T01:19:40.337174" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:40.336379" elapsed="0.000852"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:40.338221" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:40.337564" elapsed="0.000711"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:40.338370" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:19:40.338657" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:40.335538" elapsed="0.003199"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:40.339095" elapsed="0.000284"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:40.340520" 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-10-16T01:19:40.339773" elapsed="0.000810"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:40.341573" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:40.340966" elapsed="0.000661"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:40.342517" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:40.342010" elapsed="0.000560"/>
</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-10-16T01:19:40.351294" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:40.349872" elapsed="0.001618"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:40.351622" elapsed="0.000180"/>
</return>
<msg time="2026-10-16T01:19:40.352277" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:40.346582" elapsed="0.005822"/>
</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-10-16T01:19:40.375215" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:40.374765" elapsed="0.000487"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:40.376258" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:40.375932" elapsed="0.000425">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:40.376475" 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-10-16T01:19:40.375469" elapsed="0.001038"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:40.377266" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:40.376761" elapsed="0.000546"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:40.377612" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:40.377772" 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-10-16T01:19:40.377497" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:40.378222" 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-10-16T01:19:40.378001" elapsed="0.000262"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:40.379310" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:40.378922" elapsed="0.000430"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:40.379799" 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-10-16T01:19:40.379526" 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-10-16T01:19:40.380120" 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-10-16T01:19:40.380304" elapsed="0.000022"/>
</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-10-16T01:19:40.380483" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:40.379974" elapsed="0.000560"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:40.379866" elapsed="0.000698"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:40.380604" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:40.380748" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:40.378572" elapsed="0.002200"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:40.378323" elapsed="0.002478"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:40.380977" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:40.380828" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:40.378306" elapsed="0.002758"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:40.381607" 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-10-16T01:19:40.381218" elapsed="0.000414"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:40.381676" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:40.374034" elapsed="0.007759"/>
</kw>
<msg time="2026-10-16T01:19:40.381873" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:40.368270" elapsed="0.013652"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:40.385786" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:40.389570" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:40.393364" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:40.393541" elapsed="0.000020"/>
</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-10-16T01:19:40.393732" 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-10-16T01:19:40.394086" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:40.393932" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:40.393918" elapsed="0.000242"/>
</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-10-16T01:19:40.394311" elapsed="0.000019"/>
</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-10-16T01:19:40.394485" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:40.394645" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:40.393891" elapsed="0.000801"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:40.393802" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:40.394881" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:40.394948" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:40.395073" 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-10-16T01:19:40.367403" elapsed="0.027693"/>
</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-10-16T01:19:40.396211" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:40.396019" elapsed="0.000251">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:40.396352" 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-10-16T01:19:40.395651" elapsed="0.000723"/>
</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-10-16T01:19:40.396652" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:40.396438" elapsed="0.000317"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:40.397223" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:40.396943" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:40.396780" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:40.396421" elapsed="0.000879"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:40.397809" 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-10-16T01:19:40.397458" elapsed="0.000376"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:40.397880" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:40.398030" 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-manganese/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-10-16T01:19:40.395355" elapsed="0.002699"/>
</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-10-16T01:19:40.399153" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:40.398951" elapsed="0.000261">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:40.399295" 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-10-16T01:19:40.398608" elapsed="0.000710"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:40.399481" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:19:40.399382" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:40.399365" elapsed="0.000192"/>
</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-10-16T01:19:40.399723" 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-10-16T01:19:40.399897" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:40.399958" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:40.400099" 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-manganese/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-10-16T01:19:40.398298" elapsed="0.001825"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:40.401525" 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-10-16T01:19:40.401300" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:40.402006" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:40.401769" 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-10-16T01:19:40.406360" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:40.406414" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:40.406511" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:40.402332" elapsed="0.004560">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:40.402108" elapsed="0.004863">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:40.407175" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:40.407015" elapsed="0.000218"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:40.402091" elapsed="0.005165">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:40.407586" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:40.407755" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:40.407719" elapsed="0.000074"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:40.407686" elapsed="0.000127"/>
</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-10-16T01:19:40.407950" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:40.408035" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:19:40.400568" elapsed="0.007574">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:40.408210" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:19:40.357668" elapsed="0.050667">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:40.408740" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:40.408503" elapsed="0.000321"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:40.408456" elapsed="0.000408"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:40.408949" elapsed="0.000049"/>
</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="FAIL" start="2026-10-16T01:19:40.355515" elapsed="0.053621">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:40.353086" elapsed="0.056150">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:40.353035" elapsed="0.056274">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:40.409555" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:40.409926" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:40.410252" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:40.410596" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:40.411051" elapsed="0.000024"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:40.411366" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:40.411734" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:40.411976" elapsed="0.000029"/>
</return>
<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="FAIL" start="2026-10-16T01:19:40.345264" elapsed="0.066824">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:40.412150" elapsed="0.000014"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:40.343416" elapsed="0.068821">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:40.412455" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:40.412316" elapsed="0.000190"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:40.412717" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:40.412528" elapsed="0.000242"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:40.412935" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:40.412792" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:40.412300" elapsed="0.000720"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:40.343090" elapsed="0.069970">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:40.342663" elapsed="0.070449">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:40.413160" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:40.334182" elapsed="0.079067">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:40.413423" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:40.413643" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:40.413502" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:40.413487" elapsed="0.000339"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:40.413955" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:40.414141" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:40.414200" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:40.332552" elapsed="0.081740">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:40.332109" elapsed="0.082245">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:40.331827" elapsed="0.082575">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:40.331052" elapsed="0.083431">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:40.414690" elapsed="0.000036"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:40.309753" elapsed="0.105057">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:41.434100" elapsed="0.000406"/>
</kw>
<msg time="2026-10-16T01:19:41.434623" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:41.432821" elapsed="0.001950"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:41.431886" elapsed="0.003046"/>
</kw>
<msg time="2026-10-16T01:19:41.435047" 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-10-16T01:19:41.425364" elapsed="0.009778"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:41.424459" elapsed="0.010827"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:41.436453" 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-10-16T01:19:41.435908" elapsed="0.000638"/>
</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-10-16T01:19:41.443310" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:41.442515" elapsed="0.000853"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:41.444364" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:41.443733" elapsed="0.000685"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:41.444514" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:19:41.444836" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:41.441666" elapsed="0.003221"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:41.445243" elapsed="0.000284"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:41.446613" 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-10-16T01:19:41.445922" elapsed="0.000746"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:41.447552" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:41.447052" elapsed="0.000552"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:41.448460" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:41.447943" elapsed="0.000569"/>
</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-10-16T01:19:41.457475" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:41.456072" elapsed="0.001510"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:41.457747" elapsed="0.000139"/>
</return>
<msg time="2026-10-16T01:19:41.458313" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:41.452777" elapsed="0.005615"/>
</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-10-16T01:19:41.480689" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:41.480268" elapsed="0.000477"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:41.481732" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:41.481420" elapsed="0.000412">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:41.481950" 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-10-16T01:19:41.480962" elapsed="0.001020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:41.482665" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:41.482237" elapsed="0.000482"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:41.483156" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:41.483351" 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-10-16T01:19:41.482948" elapsed="0.000436"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:41.483974" 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-10-16T01:19:41.483647" elapsed="0.000402"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:41.485217" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:41.484978" elapsed="0.000280"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:41.485736" 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-10-16T01:19:41.485429" elapsed="0.000333"/>
</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-10-16T01:19:41.486055" 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-10-16T01:19:41.486243" elapsed="0.000022"/>
</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-10-16T01:19:41.486420" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:41.485913" elapsed="0.000559"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:41.485804" elapsed="0.000696"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:41.486540" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:41.486668" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:41.484628" elapsed="0.002063"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:41.484348" elapsed="0.002387"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:41.486912" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:41.486761" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:41.484126" elapsed="0.002856"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:41.487532" 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-10-16T01:19:41.487149" elapsed="0.000408"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:41.487600" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:41.479543" elapsed="0.008170"/>
</kw>
<msg time="2026-10-16T01:19:41.487762" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:41.473895" elapsed="0.013914"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:41.491632" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:41.495442" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:41.499278" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:41.499455" elapsed="0.000019"/>
</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-10-16T01:19:41.499631" elapsed="0.000019"/>
</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-10-16T01:19:41.499983" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:41.499842" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:41.499829" elapsed="0.000242"/>
</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-10-16T01:19:41.500221" elapsed="0.000019"/>
</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-10-16T01:19:41.500395" elapsed="0.000018"/>
</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-10-16T01:19:41.500589" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:41.499803" elapsed="0.000836"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:41.499712" elapsed="0.000950"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:41.500828" elapsed="0.000033"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:41.500911" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:19:41.501027" 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-10-16T01:19:41.473053" elapsed="0.027999"/>
</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-10-16T01:19:41.502151" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:41.501947" elapsed="0.000263">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:41.502292" 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-10-16T01:19:41.501609" elapsed="0.000705"/>
</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-10-16T01:19:41.502589" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:41.502377" elapsed="0.000263"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:41.503113" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:41.502835" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:41.502663" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:41.502360" elapsed="0.000828"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:41.503676" 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-10-16T01:19:41.503344" elapsed="0.000371"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:41.503762" elapsed="0.000036"/>
</return>
<msg time="2026-10-16T01:19:41.503896" 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-manganese/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-10-16T01:19:41.501313" elapsed="0.002605"/>
</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-10-16T01:19:41.506546" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:41.504804" elapsed="0.001802">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:41.506691" 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-10-16T01:19:41.504474" elapsed="0.002255"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:41.506893" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:19:41.506794" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:41.506777" elapsed="0.000192"/>
</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-10-16T01:19:41.507134" 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-10-16T01:19:41.507306" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:41.507365" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:19:41.507490" 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-manganese/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-10-16T01:19:41.504180" elapsed="0.003333"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:41.508740" 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-10-16T01:19:41.508501" elapsed="0.000281"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:41.509236" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:41.509014" elapsed="0.000263"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:19:41.513410" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:41.513463" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:41.513569" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:41.509559" elapsed="0.004392">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:41.509337" elapsed="0.004708">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:41.514229" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:41.514077" elapsed="0.000211"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:41.509320" elapsed="0.004990">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:41.514646" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:41.514784" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:41.514750" elapsed="0.000073"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:41.514733" elapsed="0.000111"/>
</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-10-16T01:19:41.514981" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:41.515057" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:19:41.507798" elapsed="0.007366">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:41.515232" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:19:41.463349" elapsed="0.052010">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:41.515769" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:41.515528" elapsed="0.000325"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:41.515480" elapsed="0.000415"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:41.515979" elapsed="0.000050"/>
</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="FAIL" start="2026-10-16T01:19:41.461209" elapsed="0.054957">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:41.458682" elapsed="0.057585">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:41.458655" elapsed="0.057688">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:41.516591" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:41.517032" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:41.517357" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:41.517724" elapsed="0.000024"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:41.518161" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:41.518473" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:41.518854" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:41.519104" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:19:41.451263" elapsed="0.067943">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:41.519267" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:41.449377" elapsed="0.069977">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:41.519573" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:41.519433" elapsed="0.000191"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:41.519804" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:41.519646" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:41.520029" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:41.519876" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:41.519417" elapsed="0.000682"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:41.449045" elapsed="0.071092">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:41.448603" elapsed="0.071586">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:41.520237" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:41.440183" elapsed="0.080144">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:41.520501" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:41.520834" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:41.520578" elapsed="0.000306"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:41.520563" elapsed="0.000342"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:41.521042" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:41.521210" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:41.521268" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:41.438553" elapsed="0.082807">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:41.438104" elapsed="0.083317">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:41.437824" elapsed="0.083681">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:41.437047" elapsed="0.084542">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:41.521815" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:41.415613" elapsed="0.106307">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:42.541263" elapsed="0.000396"/>
</kw>
<msg time="2026-10-16T01:19:42.541807" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:42.539951" elapsed="0.001973"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:42.539028" elapsed="0.003078"/>
</kw>
<msg time="2026-10-16T01:19:42.542199" 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-10-16T01:19:42.532431" elapsed="0.009859"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:42.531333" elapsed="0.011109"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:42.543492" 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-10-16T01:19:42.542951" elapsed="0.000635"/>
</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-10-16T01:19:42.550479" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:42.549644" elapsed="0.000893"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:42.551570" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:42.550939" elapsed="0.000687"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:42.551753" elapsed="0.000064"/>
</return>
<msg time="2026-10-16T01:19:42.552080" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:42.548629" elapsed="0.003505"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:42.552468" elapsed="0.000318"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:42.553891" 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-10-16T01:19:42.553184" elapsed="0.000764"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:42.554851" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:42.554309" elapsed="0.000596"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:42.555779" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:42.555241" elapsed="0.000595"/>
</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-10-16T01:19:42.564612" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:42.563224" elapsed="0.001537"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:42.564897" elapsed="0.000161"/>
</return>
<msg time="2026-10-16T01:19:42.565492" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:42.559941" elapsed="0.005676"/>
</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-10-16T01:19:42.589639" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:42.589208" elapsed="0.000469"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:42.590786" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:42.590455" elapsed="0.000428">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:42.591018" 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-10-16T01:19:42.589926" elapsed="0.001126"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:42.591767" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:42.591301" elapsed="0.000503"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:42.592217" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:42.592413" 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-10-16T01:19:42.592056" elapsed="0.000392"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:42.593060" 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-10-16T01:19:42.592733" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:42.594188" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:42.593942" elapsed="0.000288"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:42.594829" 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-10-16T01:19:42.594403" elapsed="0.000452"/>
</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-10-16T01:19:42.595167" 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-10-16T01:19:42.595351" 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-10-16T01:19:42.595533" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:42.595029" elapsed="0.000556"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:42.594901" elapsed="0.000713"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:42.595655" elapsed="0.000029"/>
</return>
<msg time="2026-10-16T01:19:42.595808" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:42.593587" elapsed="0.002245"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:42.593231" elapsed="0.002630"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:42.596046" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:42.595886" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:42.593198" elapsed="0.002921"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:42.596665" 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-10-16T01:19:42.596273" elapsed="0.000418"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:42.596752" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:42.588464" elapsed="0.008390"/>
</kw>
<msg time="2026-10-16T01:19:42.596901" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:42.582668" elapsed="0.014281"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:42.600831" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:42.604734" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:42.608574" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:42.608766" 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-10-16T01:19:42.608946" 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-10-16T01:19:42.609307" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:42.609163" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:42.609149" 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-10-16T01:19:42.609544" 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-10-16T01:19:42.609736" 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-10-16T01:19:42.609900" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:42.609123" elapsed="0.000826"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:42.609031" elapsed="0.000941"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:42.610137" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:42.610206" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:19:42.610316" 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-10-16T01:19:42.581816" elapsed="0.028524"/>
</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-10-16T01:19:42.611448" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:42.611256" elapsed="0.000253">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:42.611592" 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-10-16T01:19:42.610916" elapsed="0.000699"/>
</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-10-16T01:19:42.611911" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:42.611679" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:42.612691" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:42.612427" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:42.611987" elapsed="0.000779"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:42.611661" elapsed="0.001125"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:42.613295" 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-10-16T01:19:42.612943" elapsed="0.000406"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:42.613398" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:19:42.613524" 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-manganese/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-10-16T01:19:42.610601" elapsed="0.002947"/>
</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-10-16T01:19:42.614633" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:42.614444" elapsed="0.000249">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:42.614794" 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-10-16T01:19:42.614124" elapsed="0.000693"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:42.614979" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-10-16T01:19:42.614881" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:42.614865" elapsed="0.000207"/>
</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-10-16T01:19:42.615223" elapsed="0.000020"/>
</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-10-16T01:19:42.615400" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:42.615459" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:19:42.615584" 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-manganese/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-10-16T01:19:42.613810" elapsed="0.001798"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:42.617044" 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-10-16T01:19:42.616804" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:42.617494" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:42.617275" elapsed="0.000259"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:19:42.622083" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:42.622137" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:42.622246" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:42.617833" elapsed="0.004772">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:42.617594" elapsed="0.005090">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:42.622890" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:42.622737" elapsed="0.000212"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:42.617577" elapsed="0.005394">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:42.623325" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:42.623445" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:42.623412" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:42.623396" elapsed="0.000107"/>
</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-10-16T01:19:42.623639" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:42.623752" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:19:42.616089" elapsed="0.007770">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:42.623927" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:19:42.571875" elapsed="0.052194">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:42.624457" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:42.624239" elapsed="0.000300"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:42.624193" elapsed="0.000387"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:42.624663" 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="FAIL" start="2026-10-16T01:19:42.569608" elapsed="0.055251">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:42.566281" elapsed="0.058678">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:42.566237" elapsed="0.058809">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:42.625300" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:42.625651" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:42.625982" elapsed="0.000030"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:42.626342" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:42.626789" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:42.627114" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:42.627468" elapsed="0.000019"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:42.627736" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:19:42.558567" elapsed="0.069280">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:42.627910" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:42.556687" elapsed="0.071331">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:42.628242" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:42.628100" elapsed="0.000192"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:42.628453" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:42.628316" elapsed="0.000185"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:42.628666" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:42.628524" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:42.628084" elapsed="0.000704"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:42.556356" elapsed="0.072475">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:42.555933" elapsed="0.072952">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:42.628935" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:42.547217" elapsed="0.081825">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:42.629223" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:42.629444" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:42.629303" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:42.629287" elapsed="0.000225"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:42.629639" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:42.629918" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:42.629980" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:42.545580" elapsed="0.084508">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:42.545134" elapsed="0.085020">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:42.544864" elapsed="0.085342">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:42.544091" elapsed="0.086199">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:42.630502" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:42.522670" elapsed="0.107938">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:43.651055" elapsed="0.000430"/>
</kw>
<msg time="2026-10-16T01:19:43.651608" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:43.649658" elapsed="0.002102"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:43.648666" elapsed="0.003259"/>
</kw>
<msg time="2026-10-16T01:19:43.652037" 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-10-16T01:19:43.641601" elapsed="0.010531"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:43.640564" elapsed="0.011739"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:43.653401" 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-10-16T01:19:43.652830" elapsed="0.000663"/>
</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-10-16T01:19:43.660623" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:43.659859" elapsed="0.000823"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:43.661690" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:43.661075" elapsed="0.000701"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:43.661873" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:19:43.662202" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:43.659030" elapsed="0.003234"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:43.662616" elapsed="0.000329"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:43.664104" 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-10-16T01:19:43.663351" elapsed="0.000809"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:43.665081" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:43.664524" elapsed="0.000611"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:43.665978" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:43.665445" elapsed="0.000607"/>
</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-10-16T01:19:43.674740" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:43.673313" elapsed="0.001542"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:43.674991" elapsed="0.000160"/>
</return>
<msg time="2026-10-16T01:19:43.675589" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:43.670069" elapsed="0.005891"/>
</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-10-16T01:19:43.699747" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:43.699300" elapsed="0.000485"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:43.700779" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:43.700471" elapsed="0.000407">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:43.700994" 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-10-16T01:19:43.700024" elapsed="0.001019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:43.701727" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:43.701278" elapsed="0.000487"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:43.702165" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:43.702357" 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-10-16T01:19:43.701990" elapsed="0.000400"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:43.702984" 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-10-16T01:19:43.702654" elapsed="0.000403"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:43.704488" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:43.703972" elapsed="0.000594"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:43.705206" 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-10-16T01:19:43.704830" elapsed="0.000411"/>
</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-10-16T01:19:43.705599" 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-10-16T01:19:43.705798" elapsed="0.000022"/>
</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-10-16T01:19:43.706029" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:43.705459" elapsed="0.000623"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:43.705302" elapsed="0.000809"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:43.706152" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:43.706283" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:43.703486" elapsed="0.002820"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:43.703143" elapsed="0.003193"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:43.706506" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:43.706361" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:43.703119" elapsed="0.003457"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:43.707147" 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-10-16T01:19:43.706744" elapsed="0.000429"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:43.707217" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:43.698572" elapsed="0.008744"/>
</kw>
<msg time="2026-10-16T01:19:43.707362" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:43.692936" elapsed="0.014472"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:43.711208" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:43.714994" elapsed="0.000038"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:43.718781" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:43.718957" elapsed="0.000019"/>
</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-10-16T01:19:43.719146" 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-10-16T01:19:43.719484" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:43.719345" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:43.719332" elapsed="0.000224"/>
</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-10-16T01:19:43.719720" 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-10-16T01:19:43.719899" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:43.720073" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:43.719306" elapsed="0.000817"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:43.719215" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:43.720331" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:43.720399" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:19:43.720504" 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-10-16T01:19:43.692093" elapsed="0.028435"/>
</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-10-16T01:19:43.721631" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:43.721441" elapsed="0.000249">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:43.721789" 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-10-16T01:19:43.721121" elapsed="0.000691"/>
</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-10-16T01:19:43.722193" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:43.721874" elapsed="0.000372"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:43.722689" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:43.722428" elapsed="0.000300"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:43.722269" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:43.721858" elapsed="0.000923"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:43.723287" 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-10-16T01:19:43.722936" elapsed="0.000375"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:43.723356" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:43.723479" 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-manganese/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-10-16T01:19:43.720810" elapsed="0.002692"/>
</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-10-16T01:19:43.724575" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:43.724388" elapsed="0.000245">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:43.724739" 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-10-16T01:19:43.724072" elapsed="0.000692"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:43.724927" elapsed="0.000022"/>
</return>
<status status="PASS" start="2026-10-16T01:19:43.724828" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:43.724812" elapsed="0.000191"/>
</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-10-16T01:19:43.725173" elapsed="0.000019"/>
</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-10-16T01:19:43.725344" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:43.725402" elapsed="0.000013"/>
</return>
<msg time="2026-10-16T01:19:43.725525" 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-manganese/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-10-16T01:19:43.723759" elapsed="0.001789"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:43.726962" 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-10-16T01:19:43.726736" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:43.727425" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:43.727208" elapsed="0.000257"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:19:43.731621" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:43.731731" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:43.731840" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:43.727762" elapsed="0.004463">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:43.727524" elapsed="0.004779">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:43.732481" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:43.732333" elapsed="0.000206"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:43.727508" elapsed="0.005054">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:43.732915" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:43.733049" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:43.733002" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:43.732986" 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-10-16T01:19:43.733244" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:43.733306" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:19:43.726001" elapsed="0.007406">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:43.733475" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:19:43.682415" elapsed="0.051185">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:43.734025" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:43.733791" elapsed="0.000318"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:43.733742" elapsed="0.000408"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:43.734236" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:19:43.680268" elapsed="0.054136">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:43.676448" elapsed="0.058054">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:43.676405" elapsed="0.058170">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:43.734838" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:43.735208" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:43.735518" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:43.735878" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:43.736361" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:43.736673" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:43.737054" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:43.737291" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:19:43.668697" elapsed="0.068695">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:43.737454" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:43.666872" elapsed="0.070672">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:43.737785" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:43.737625" elapsed="0.000212"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:43.737995" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:43.737859" elapsed="0.000207"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:43.738228" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:43.738088" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:43.737609" elapsed="0.000687"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:43.666513" elapsed="0.071821">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:43.666146" elapsed="0.072240">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:43.738435" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:43.657390" elapsed="0.081137">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:43.738717" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:43.738936" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:43.738797" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:43.738782" elapsed="0.000235"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:43.739147" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:43.739312" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:43.739369" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:43.655675" elapsed="0.083784">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:43.655207" elapsed="0.084314">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:43.654877" elapsed="0.084692">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:43.653978" elapsed="0.085672">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:43.740079" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:43.631373" elapsed="0.108813">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:44.759373" elapsed="0.000457"/>
</kw>
<msg time="2026-10-16T01:19:44.759947" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:44.758108" elapsed="0.001976"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:44.757138" elapsed="0.003108"/>
</kw>
<msg time="2026-10-16T01:19:44.760337" 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-10-16T01:19:44.750482" elapsed="0.009946"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:44.749604" elapsed="0.010974"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:44.761645" 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-10-16T01:19:44.761129" elapsed="0.000639"/>
</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-10-16T01:19:44.768344" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:44.767545" elapsed="0.000857"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:44.769391" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:44.768763" elapsed="0.000681"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:44.769539" elapsed="0.000063"/>
</return>
<msg time="2026-10-16T01:19:44.769863" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:44.766742" elapsed="0.003172"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:44.770267" elapsed="0.000283"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:44.771633" 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-10-16T01:19:44.770946" elapsed="0.000741"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:44.772567" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:44.772065" elapsed="0.000555"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:44.773471" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:44.772954" elapsed="0.000570"/>
</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-10-16T01:19:44.782394" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:44.780791" elapsed="0.001722"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:44.782643" elapsed="0.000188"/>
</return>
<msg time="2026-10-16T01:19:44.783295" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:44.777506" elapsed="0.005916"/>
</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-10-16T01:19:44.807575" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:44.807150" elapsed="0.000461"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:44.808687" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:44.808390" elapsed="0.000416">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:44.808926" 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-10-16T01:19:44.807918" elapsed="0.001040"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:44.809646" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:44.809215" elapsed="0.000466"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:44.810105" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:44.810297" 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-10-16T01:19:44.809929" elapsed="0.000401"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:44.810927" 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-10-16T01:19:44.810595" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:44.812306" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:44.812074" elapsed="0.000273"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:44.812794" 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-10-16T01:19:44.812521" 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-10-16T01:19:44.813119" 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-10-16T01:19:44.813301" elapsed="0.000022"/>
</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-10-16T01:19:44.813479" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:44.812971" elapsed="0.000559"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:44.812862" elapsed="0.000697"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:44.813599" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:44.813747" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:44.811646" elapsed="0.002125"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:44.811252" elapsed="0.002549"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:44.813974" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:44.813830" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:44.811068" elapsed="0.002989"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:44.814604" 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-10-16T01:19:44.814214" elapsed="0.000415"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:44.814672" elapsed="0.000041"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:44.806419" elapsed="0.008370"/>
</kw>
<msg time="2026-10-16T01:19:44.814835" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:44.800739" elapsed="0.014143"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:44.818677" elapsed="0.000037"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:44.822456" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:44.826290" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:44.826467" elapsed="0.000020"/>
</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-10-16T01:19:44.826644" elapsed="0.000019"/>
</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-10-16T01:19:44.826996" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:44.826857" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:44.826843" elapsed="0.000242"/>
</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-10-16T01:19:44.827236" 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-10-16T01:19:44.827417" elapsed="0.000018"/>
</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-10-16T01:19:44.827576" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:44.826818" elapsed="0.000806"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:44.826727" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:44.827809" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:44.827877" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:44.827980" 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-10-16T01:19:44.799884" elapsed="0.028120"/>
</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-10-16T01:19:44.829107" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:44.828906" elapsed="0.000261">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:44.829249" 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-10-16T01:19:44.828572" elapsed="0.000700"/>
</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-10-16T01:19:44.829547" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:44.829334" elapsed="0.000264"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:44.830079" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:44.829794" elapsed="0.000310"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:44.829622" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:44.829317" elapsed="0.000839"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:44.830673" 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-10-16T01:19:44.830318" elapsed="0.000394"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:44.830759" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:44.830883" 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-manganese/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-10-16T01:19:44.828276" elapsed="0.002630"/>
</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-10-16T01:19:44.833486" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:44.831829" elapsed="0.001718">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:44.833633" 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-10-16T01:19:44.831499" elapsed="0.002158"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:44.833840" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:19:44.833738" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:44.833720" elapsed="0.000198"/>
</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-10-16T01:19:44.834087" 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-10-16T01:19:44.834262" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:44.834323" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:44.834450" 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-manganese/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-10-16T01:19:44.831199" elapsed="0.003274"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:44.835715" 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-10-16T01:19:44.835468" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:44.836189" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:44.835946" 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-10-16T01:19:44.840578" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:44.840632" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:44.840756" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:44.836522" elapsed="0.004612">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:44.836297" elapsed="0.004916">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:44.841400" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:44.841244" elapsed="0.000214"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:44.836279" elapsed="0.005201">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:44.841825" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:44.841945" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:44.841912" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:44.841896" elapsed="0.000106"/>
</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-10-16T01:19:44.842152" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:44.842213" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:19:44.834758" elapsed="0.007560">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:44.842418" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:19:44.790171" elapsed="0.052376">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:44.842956" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:44.842737" elapsed="0.000314"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:44.842668" elapsed="0.000424"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:44.843174" elapsed="0.000037"/>
</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="FAIL" start="2026-10-16T01:19:44.787757" elapsed="0.055580">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:44.784130" elapsed="0.059307">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:44.784086" elapsed="0.059427">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:44.843778" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:44.844142" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:44.844454" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:44.844825" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:44.845263" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:44.845576" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:44.845943" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:44.846201" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:19:44.776205" elapsed="0.070097">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:44.846363" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:44.774368" elapsed="0.072082">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:44.846668" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:44.846529" elapsed="0.000209"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:44.846898" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:44.846761" elapsed="0.000186"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:44.847130" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:44.846968" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:44.846513" elapsed="0.000686"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:44.774035" elapsed="0.073202">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:44.773616" elapsed="0.073673">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:44.847336" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:44.765362" elapsed="0.082103">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:44.847640" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:44.847983" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:44.847840" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:44.847821" elapsed="0.000243"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:44.848190" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:44.848356" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:44.848414" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:44.763767" elapsed="0.084739">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:44.763288" elapsed="0.085279">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:44.763040" elapsed="0.085574">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:44.762242" elapsed="0.086451">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:44.848923" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:44.740972" elapsed="0.108089">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:45.868789" elapsed="0.000425"/>
</kw>
<msg time="2026-10-16T01:19:45.869327" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:45.867478" elapsed="0.001963"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:45.866528" elapsed="0.003071"/>
</kw>
<msg time="2026-10-16T01:19:45.869690" 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-10-16T01:19:45.859730" elapsed="0.010085"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:45.858840" elapsed="0.011128"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:45.871048" 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-10-16T01:19:45.870469" elapsed="0.000676"/>
</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-10-16T01:19:45.877982" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:45.877207" elapsed="0.000856"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:45.879067" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:45.878399" elapsed="0.000726"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:45.879318" elapsed="0.000065"/>
</return>
<msg time="2026-10-16T01:19:45.879618" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:45.876348" elapsed="0.003323"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:45.880065" elapsed="0.000293"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:45.881466" 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-10-16T01:19:45.880757" elapsed="0.000766"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:45.882434" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:45.881890" elapsed="0.000598"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:45.883370" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:45.882832" elapsed="0.000591"/>
</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-10-16T01:19:45.892348" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:45.890948" elapsed="0.001511"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:45.892587" elapsed="0.000229"/>
</return>
<msg time="2026-10-16T01:19:45.893286" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:45.887554" elapsed="0.005859"/>
</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-10-16T01:19:45.917757" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:45.917291" elapsed="0.000506"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:45.918826" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:45.918493" elapsed="0.000431">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:45.919064" 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-10-16T01:19:45.918042" elapsed="0.001056"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:45.919800" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:45.919355" elapsed="0.000471"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:45.920123" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:45.920276" 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-10-16T01:19:45.919990" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:45.920736" 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-10-16T01:19:45.920493" 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-10-16T01:19:45.921717" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:45.921472" elapsed="0.000287"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:45.922364" 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-10-16T01:19:45.921932" elapsed="0.000457"/>
</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-10-16T01:19:45.922682" elapsed="0.000039"/>
</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-10-16T01:19:45.922895" elapsed="0.000022"/>
</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-10-16T01:19:45.923095" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:45.922551" elapsed="0.000596"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:45.922436" elapsed="0.000739"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:45.923219" elapsed="0.000028"/>
</return>
<msg time="2026-10-16T01:19:45.923408" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:45.921127" elapsed="0.002305"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:45.920850" elapsed="0.002611"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:45.923632" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:45.923486" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:45.920828" elapsed="0.002890"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:45.924288" 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-10-16T01:19:45.923877" elapsed="0.000441"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:45.924362" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:45.916546" elapsed="0.007916"/>
</kw>
<msg time="2026-10-16T01:19:45.924510" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:45.910724" elapsed="0.013833"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:45.928407" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:45.932212" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:45.936066" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:45.936243" elapsed="0.000020"/>
</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-10-16T01:19:45.936420" elapsed="0.000019"/>
</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-10-16T01:19:45.936777" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:45.936620" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:45.936606" elapsed="0.000245"/>
</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-10-16T01:19:45.937003" elapsed="0.000032"/>
</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-10-16T01:19:45.937195" elapsed="0.000018"/>
</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-10-16T01:19:45.937354" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:45.936580" elapsed="0.000822"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:45.936488" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:45.937575" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:45.937643" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:45.937763" 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-10-16T01:19:45.909834" elapsed="0.027953"/>
</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-10-16T01:19:45.938960" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:45.938766" elapsed="0.000266">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:45.939117" 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-10-16T01:19:45.938429" elapsed="0.000711"/>
</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-10-16T01:19:45.939417" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:45.939203" elapsed="0.000265"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:45.939942" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:45.939661" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:45.939491" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:45.939187" elapsed="0.000845"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:45.940531" 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-10-16T01:19:45.940191" elapsed="0.000364"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:45.940600" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:45.940741" 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-manganese/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-10-16T01:19:45.938126" elapsed="0.002638"/>
</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-10-16T01:19:45.941841" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:45.941635" elapsed="0.000264">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:45.941984" 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-10-16T01:19:45.941318" elapsed="0.000688"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:45.942185" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:19:45.942087" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:45.942070" elapsed="0.000193"/>
</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-10-16T01:19:45.942410" elapsed="0.000020"/>
</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-10-16T01:19:45.942580" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:45.942640" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:45.942781" 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-manganese/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-10-16T01:19:45.941008" elapsed="0.001796"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:45.944220" 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-10-16T01:19:45.943982" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:45.944663" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:45.944447" elapsed="0.000271"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:19:45.949149" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:45.949204" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:45.949331" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:45.945003" elapsed="0.004679">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:45.944780" elapsed="0.005001">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:45.949970" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:45.949813" elapsed="0.000230"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:45.944763" elapsed="0.005303">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:45.950410" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:45.950530" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:45.950497" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:45.950481" elapsed="0.000109"/>
</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-10-16T01:19:45.950742" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:45.950806" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:19:45.943273" elapsed="0.007636">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:45.950977" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:19:45.899794" elapsed="0.051324">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:45.951518" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:45.951291" elapsed="0.000309"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:45.951242" elapsed="0.000400"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:45.951747" elapsed="0.000039"/>
</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="FAIL" start="2026-10-16T01:19:45.897522" elapsed="0.054395">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:45.893974" elapsed="0.058044">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:45.893930" elapsed="0.058175">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:45.952353" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:45.952713" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:45.953040" elapsed="0.000028"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:45.953403" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:45.953854" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:45.954197" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:45.954547" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:45.954849" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:19:45.886214" elapsed="0.068740">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:45.955018" elapsed="0.000027"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:45.884280" elapsed="0.070843">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:45.955353" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:45.955206" elapsed="0.000198"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:45.955564" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:45.955427" elapsed="0.000187"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:45.955798" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:45.955636" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:45.955190" elapsed="0.000679"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:45.883926" elapsed="0.071983">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:45.883518" elapsed="0.072446">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:45.956013" elapsed="0.000027"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:45.874900" elapsed="0.081221">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:45.956298" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:45.956520" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:45.956379" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:45.956363" elapsed="0.000227"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:45.956828" elapsed="0.000021"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:45.957003" elapsed="0.000028"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:45.957072" elapsed="0.000015"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:45.873226" elapsed="0.083940">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:45.872748" elapsed="0.084481">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:45.872465" elapsed="0.084814">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:45.871628" elapsed="0.085736">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:45.957576" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:45.849850" elapsed="0.107830">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:46.976978" elapsed="0.000422"/>
</kw>
<msg time="2026-10-16T01:19:46.977516" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:46.975672" elapsed="0.001960"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:46.974648" elapsed="0.003174"/>
</kw>
<msg time="2026-10-16T01:19:46.977916" 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-10-16T01:19:46.967996" elapsed="0.010010"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:46.967125" elapsed="0.011058"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:46.979225" 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-10-16T01:19:46.978659" elapsed="0.000658"/>
</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-10-16T01:19:46.985961" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:46.985194" elapsed="0.000825"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:46.987008" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:46.986375" elapsed="0.000713"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:46.987183" elapsed="0.000063"/>
</return>
<msg time="2026-10-16T01:19:46.987472" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:46.984367" elapsed="0.003155"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:46.987879" elapsed="0.000308"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:46.989400" 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-10-16T01:19:46.988551" elapsed="0.000904"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:46.990338" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:46.989812" elapsed="0.000579"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:46.991256" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:46.990697" elapsed="0.000612"/>
</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-10-16T01:19:47.000194" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:46.998643" elapsed="0.001661"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:47.000447" elapsed="0.000155"/>
</return>
<msg time="2026-10-16T01:19:47.001103" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:46.995325" elapsed="0.005906"/>
</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-10-16T01:19:47.025861" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:47.025415" elapsed="0.000483"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:47.026889" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:47.026574" elapsed="0.000414">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:47.027122" 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-10-16T01:19:47.026131" elapsed="0.001023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:47.027934" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:47.027464" elapsed="0.000508"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:47.028376" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:47.028576" 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-10-16T01:19:47.028218" elapsed="0.000391"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:47.029229" 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-10-16T01:19:47.028897" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:47.030759" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:47.030238" elapsed="0.000580"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:47.031469" 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-10-16T01:19:47.031081" elapsed="0.000430"/>
</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-10-16T01:19:47.031885" elapsed="0.000020"/>
</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-10-16T01:19:47.032085" 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-10-16T01:19:47.032268" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:47.031754" elapsed="0.000565"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:47.031584" elapsed="0.000763"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:47.032388" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:47.032516" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:47.029744" elapsed="0.002795"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:47.029370" elapsed="0.003197"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:47.032752" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:47.032594" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:47.029347" elapsed="0.003477"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:47.033385" 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-10-16T01:19:47.032979" elapsed="0.000432"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:47.033454" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:47.024679" elapsed="0.008874"/>
</kw>
<msg time="2026-10-16T01:19:47.033601" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:47.018764" elapsed="0.014883"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:47.037444" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:47.041206" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:47.044967" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:47.045190" elapsed="0.000020"/>
</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-10-16T01:19:47.045367" elapsed="0.000019"/>
</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-10-16T01:19:47.045721" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:47.045568" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:47.045554" elapsed="0.000243"/>
</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-10-16T01:19:47.045948" elapsed="0.000018"/>
</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-10-16T01:19:47.046136" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:47.046298" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:47.045528" elapsed="0.000818"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:47.045436" elapsed="0.000934"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:47.046518" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:47.046585" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:47.046689" 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-10-16T01:19:47.017906" elapsed="0.028821"/>
</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-10-16T01:19:47.047827" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:47.047621" elapsed="0.000266">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:47.047968" 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-10-16T01:19:47.047304" elapsed="0.000687"/>
</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-10-16T01:19:47.048279" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:47.048068" elapsed="0.000263"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:47.048788" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:47.048510" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:47.048354" elapsed="0.000490"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:47.048051" elapsed="0.000813"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:47.049366" 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-10-16T01:19:47.049020" elapsed="0.000371"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:47.049435" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:47.049558" 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-manganese/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-10-16T01:19:47.046997" elapsed="0.002583"/>
</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-10-16T01:19:47.050649" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:47.050463" elapsed="0.000260">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:47.050806" 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-10-16T01:19:47.050149" elapsed="0.000680"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:47.051023" elapsed="0.000060"/>
</return>
<status status="PASS" start="2026-10-16T01:19:47.050925" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:47.050907" elapsed="0.000231"/>
</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-10-16T01:19:47.051288" elapsed="0.000020"/>
</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-10-16T01:19:47.051459" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:47.051520" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:47.051645" 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-manganese/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-10-16T01:19:47.049840" elapsed="0.001828"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:47.053096" 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-10-16T01:19:47.052856" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:47.053543" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:47.053325" elapsed="0.000258"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:19:47.058129" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:47.058182" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:47.058278" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:47.053880" elapsed="0.004755">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:47.053643" elapsed="0.005090">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:47.058919" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:47.058766" elapsed="0.000212"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:47.053627" elapsed="0.005373">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:47.059346" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:47.059466" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:47.059433" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:47.059417" elapsed="0.000107"/>
</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-10-16T01:19:47.059658" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:47.059738" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:19:47.052146" elapsed="0.007695">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:47.059910" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:19:47.008247" elapsed="0.051805">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:47.060438" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:47.060221" elapsed="0.000330"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:47.060174" elapsed="0.000418"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:47.060675" elapsed="0.000056"/>
</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="FAIL" start="2026-10-16T01:19:47.005788" elapsed="0.055076">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:47.001685" elapsed="0.059278">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:47.001642" elapsed="0.059404">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:47.061294" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:47.061645" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:47.061984" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:47.062352" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:47.062805" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:47.063130" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:47.063479" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:47.063751" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:19:46.993979" elapsed="0.069874">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:47.063914" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:46.992156" elapsed="0.071845">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:47.064232" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:47.064093" elapsed="0.000188"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:47.064439" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:47.064304" elapsed="0.000184"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:47.064649" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:47.064509" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:47.064078" elapsed="0.000658"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:46.991800" elapsed="0.072974">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:46.991401" elapsed="0.073425">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:47.064874" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:46.982983" elapsed="0.081982">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:47.065150" elapsed="0.000048"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:47.065407" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:47.065262" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:47.065246" elapsed="0.000231"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:47.065601" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:47.065887" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:47.065948" elapsed="0.000015"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:46.981357" elapsed="0.084696">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:46.980883" elapsed="0.085234">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:46.980550" elapsed="0.085615">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:46.979791" elapsed="0.086456">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:47.066456" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:46.958505" elapsed="0.108055">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:48.086795" elapsed="0.000427"/>
</kw>
<msg time="2026-10-16T01:19:48.087341" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:48.085496" elapsed="0.001961"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:48.084552" elapsed="0.003059"/>
</kw>
<msg time="2026-10-16T01:19:48.087737" 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-10-16T01:19:48.077686" elapsed="0.010145"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:48.076810" elapsed="0.011170"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:48.089114" 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-10-16T01:19:48.088482" elapsed="0.000726"/>
</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-10-16T01:19:48.095836" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:48.094972" elapsed="0.000926"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:48.096938" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:48.096267" elapsed="0.000725"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:48.097112" elapsed="0.000063"/>
</return>
<msg time="2026-10-16T01:19:48.097399" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:48.094167" elapsed="0.003282"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:48.097809" elapsed="0.000309"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:48.099331" 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-10-16T01:19:48.098483" elapsed="0.000910"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:48.100366" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:48.099815" elapsed="0.000605"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:48.101294" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:48.100764" elapsed="0.000584"/>
</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-10-16T01:19:48.110384" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:48.108886" elapsed="0.001606"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:48.110618" elapsed="0.000172"/>
</return>
<msg time="2026-10-16T01:19:48.111241" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:48.105414" elapsed="0.005953"/>
</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-10-16T01:19:48.135261" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:48.134808" elapsed="0.000489"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:48.136290" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:48.135970" elapsed="0.000419">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:48.136507" 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-10-16T01:19:48.135511" elapsed="0.001027"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:48.137244" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:48.136791" elapsed="0.000488"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:48.137658" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:48.137871" 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-10-16T01:19:48.137502" elapsed="0.000403"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:48.138491" 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-10-16T01:19:48.138186" elapsed="0.000361"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:48.140023" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:48.139682" elapsed="0.000426"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:48.140769" 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-10-16T01:19:48.140349" elapsed="0.000463"/>
</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-10-16T01:19:48.141132" 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-10-16T01:19:48.141317" elapsed="0.000022"/>
</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-10-16T01:19:48.141496" elapsed="0.000018"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:48.140988" elapsed="0.000557"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:48.140868" elapsed="0.000706"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:48.141614" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:19:48.141758" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:48.139215" elapsed="0.002567"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:48.138808" elapsed="0.003002"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:48.141980" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:48.141836" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:48.138607" elapsed="0.003459"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:48.142610" 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-10-16T01:19:48.142220" elapsed="0.000447"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:48.142729" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:48.134093" elapsed="0.008738"/>
</kw>
<msg time="2026-10-16T01:19:48.142877" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:48.128298" elapsed="0.014625"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:48.146770" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:48.150535" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:48.154400" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:48.154584" 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-10-16T01:19:48.154790" 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-10-16T01:19:48.155152" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:48.154994" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:48.154981" 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-10-16T01:19:48.155381" 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-10-16T01:19:48.155557" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:48.155732" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:48.154954" elapsed="0.000848"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:48.154864" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:48.155984" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:48.156080" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:19:48.156187" 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-10-16T01:19:48.127437" elapsed="0.028774"/>
</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-10-16T01:19:48.157373" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:48.157182" elapsed="0.000251">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:48.157514" 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-10-16T01:19:48.156832" elapsed="0.000705"/>
</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-10-16T01:19:48.157830" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:48.157599" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:48.158344" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:48.158080" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:48.157905" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:48.157583" elapsed="0.000837"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:48.158927" 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-10-16T01:19:48.158575" elapsed="0.000376"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:48.158996" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:48.159134" 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-manganese/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-10-16T01:19:48.156474" elapsed="0.002683"/>
</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-10-16T01:19:48.161774" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:48.160029" elapsed="0.001806">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:48.161921" 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-10-16T01:19:48.159710" elapsed="0.002235"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:48.162124" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:19:48.162010" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:48.161993" elapsed="0.000209"/>
</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-10-16T01:19:48.162355" elapsed="0.000020"/>
</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-10-16T01:19:48.162532" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:48.162594" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:48.162736" 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-manganese/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-10-16T01:19:48.159399" elapsed="0.003361"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:48.163996" 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-10-16T01:19:48.163759" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:48.164470" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:48.164242" elapsed="0.000269"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:19:48.168777" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:48.168833" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:48.168941" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:48.164809" elapsed="0.004507">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:48.164571" elapsed="0.004876">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:48.169643" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:48.169483" elapsed="0.000248"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:48.164554" elapsed="0.005204">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:48.170124" elapsed="0.000031"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:48.170251" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:48.170218" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:48.170202" elapsed="0.000107"/>
</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-10-16T01:19:48.170448" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:48.170511" elapsed="0.000013"/>
</return>
<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="FAIL" start="2026-10-16T01:19:48.163031" elapsed="0.007580">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:48.170677" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:19:48.117678" elapsed="0.053149">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:48.171225" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:48.170993" elapsed="0.000314"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:48.170946" elapsed="0.000402"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:48.171436" elapsed="0.000037"/>
</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="FAIL" start="2026-10-16T01:19:48.115499" elapsed="0.056101">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:48.111893" elapsed="0.059825">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:48.111847" elapsed="0.059960">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:48.172077" elapsed="0.000026"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:48.172437" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:48.172777" elapsed="0.000022"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:48.173158" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:48.173784" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:48.174156" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:48.174522" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:48.174827" elapsed="0.000019"/>
</return>
<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="FAIL" start="2026-10-16T01:19:48.104021" elapsed="0.070911">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:48.175056" elapsed="0.000019"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:48.102199" elapsed="0.072956">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:48.175378" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:48.175234" elapsed="0.000194"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:48.175589" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:48.175450" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:48.175836" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:48.175660" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:48.175219" elapsed="0.000690"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:48.101848" elapsed="0.074099">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:48.101444" elapsed="0.074557">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:48.176064" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:48.092792" elapsed="0.083367">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:48.176337" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:48.176558" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:48.176417" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:48.176401" elapsed="0.000226"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:48.176881" elapsed="0.000023"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:48.177076" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:48.177138" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:48.091193" elapsed="0.086038">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:48.090693" elapsed="0.086600">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:48.090448" elapsed="0.086893">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:48.089651" elapsed="0.087770">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:48.177631" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:48.067370" elapsed="0.110390">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:49.198266" elapsed="0.000413"/>
</kw>
<msg time="2026-10-16T01:19:49.198827" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:49.196976" elapsed="0.002095"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:49.196019" elapsed="0.003221"/>
</kw>
<msg time="2026-10-16T01:19:49.199338" 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-10-16T01:19:49.189388" elapsed="0.010044"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:49.188498" elapsed="0.011086"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:49.200647" 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-10-16T01:19:49.200118" elapsed="0.000653"/>
</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-10-16T01:19:49.207382" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:49.206569" elapsed="0.000872"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:49.208581" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:49.207862" elapsed="0.000778"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:49.208777" elapsed="0.000064"/>
</return>
<msg time="2026-10-16T01:19:49.209131" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:49.205759" elapsed="0.003427"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:49.209526" elapsed="0.000322"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:49.210958" 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-10-16T01:19:49.210245" elapsed="0.000770"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:49.211918" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:49.211378" elapsed="0.000593"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:49.212849" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:49.212312" elapsed="0.000590"/>
</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-10-16T01:19:49.221694" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:49.220260" elapsed="0.001589"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:49.221978" elapsed="0.000164"/>
</return>
<msg time="2026-10-16T01:19:49.222585" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:49.216952" elapsed="0.005727"/>
</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-10-16T01:19:49.245504" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:49.245064" elapsed="0.000478"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:49.246559" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:49.246257" elapsed="0.000398">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:49.246798" 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-10-16T01:19:49.245787" elapsed="0.001043"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:49.247521" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:49.247083" elapsed="0.000473"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:49.247969" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:49.248258" 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-10-16T01:19:49.247804" elapsed="0.000489"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:49.248931" 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-10-16T01:19:49.248597" elapsed="0.000377"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:49.249905" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:49.249653" elapsed="0.000294"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:49.250550" 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-10-16T01:19:49.250133" elapsed="0.000443"/>
</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-10-16T01:19:49.250892" 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-10-16T01:19:49.251091" elapsed="0.000022"/>
</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-10-16T01:19:49.251275" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:49.250758" elapsed="0.000569"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:49.250623" elapsed="0.000733"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:49.251398" elapsed="0.000029"/>
</return>
<msg time="2026-10-16T01:19:49.251533" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:49.249318" elapsed="0.002239"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:49.249058" elapsed="0.002527"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:49.251771" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:49.251610" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:49.249023" elapsed="0.002820"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:49.252414" 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-10-16T01:19:49.252001" elapsed="0.000439"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:49.252484" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:49.244327" elapsed="0.008257"/>
</kw>
<msg time="2026-10-16T01:19:49.252632" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:49.238518" elapsed="0.014160"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:49.256511" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:49.260319" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:49.264122" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:49.264335" elapsed="0.000020"/>
</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-10-16T01:19:49.264517" 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-10-16T01:19:49.264881" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:49.264735" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:49.264719" 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-10-16T01:19:49.265129" 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-10-16T01:19:49.265309" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:49.265471" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:49.264678" elapsed="0.000845"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:49.264587" elapsed="0.000959"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:49.265722" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:49.265791" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:19:49.265897" 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-10-16T01:19:49.237637" elapsed="0.028283"/>
</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-10-16T01:19:49.267028" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:49.266836" elapsed="0.000270">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:49.267189" 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-10-16T01:19:49.266495" elapsed="0.000717"/>
</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-10-16T01:19:49.267494" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:49.267275" elapsed="0.000271"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:49.268024" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:49.267758" elapsed="0.000310"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:49.267569" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:49.267258" elapsed="0.000864"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:49.268623" 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-10-16T01:19:49.268283" elapsed="0.000364"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:49.268692" elapsed="0.000042"/>
</return>
<msg time="2026-10-16T01:19:49.268833" 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-manganese/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-10-16T01:19:49.266200" elapsed="0.002655"/>
</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-10-16T01:19:49.270062" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:49.269857" elapsed="0.000265">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:49.270206" 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-10-16T01:19:49.269523" elapsed="0.000705"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:49.270389" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:19:49.270292" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:49.270275" elapsed="0.000191"/>
</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-10-16T01:19:49.270617" elapsed="0.000020"/>
</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-10-16T01:19:49.270844" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:49.270907" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:19:49.271034" 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-manganese/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-10-16T01:19:49.269223" elapsed="0.001849"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:49.272486" 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-10-16T01:19:49.272254" elapsed="0.000275"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:49.272957" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:49.272734" elapsed="0.000263"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:19:49.277494" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:49.277547" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:49.277645" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:49.273298" elapsed="0.004717">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:49.273072" elapsed="0.005040">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:49.278294" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:49.278143" elapsed="0.000211"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:49.273041" elapsed="0.005335">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:49.278737" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:49.278860" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:49.278826" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:49.278810" elapsed="0.000109"/>
</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-10-16T01:19:49.279073" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:49.279139" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:19:49.271521" elapsed="0.007720">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:49.279310" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:19:49.227911" elapsed="0.051528">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:49.279852" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:49.279609" elapsed="0.000327"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:49.279561" elapsed="0.000418"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:49.280079" elapsed="0.000037"/>
</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="FAIL" start="2026-10-16T01:19:49.225620" elapsed="0.054665">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:49.223134" elapsed="0.057253">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:49.223107" elapsed="0.057355">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:49.280734" elapsed="0.000025"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:49.281096" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:49.281417" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:49.281787" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:49.282231" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:49.282545" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:49.282920" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:49.283175" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:19:49.215586" elapsed="0.067693">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:49.283342" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:49.213751" elapsed="0.069680">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:49.283652" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:49.283510" elapsed="0.000212"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:49.283886" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:49.283747" elapsed="0.000188"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:49.284147" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:49.283957" elapsed="0.000238"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:49.283494" elapsed="0.000723"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:49.213393" elapsed="0.070862">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:49.212997" elapsed="0.071315">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:49.284360" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:49.204370" elapsed="0.080081">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:49.284633" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:49.284972" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:49.284828" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:49.284696" elapsed="0.000356"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:49.285214" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:49.285386" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:49.285445" elapsed="0.000015"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:49.202765" elapsed="0.082777">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:49.202285" elapsed="0.083321">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:49.202019" elapsed="0.083636">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:49.201241" elapsed="0.084513">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:49.285967" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:49.178860" elapsed="0.107224">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:50.308491" elapsed="0.000547"/>
</kw>
<msg time="2026-10-16T01:19:50.309187" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:50.306974" elapsed="0.002367"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:50.305845" elapsed="0.003682"/>
</kw>
<msg time="2026-10-16T01:19:50.309650" 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-10-16T01:19:50.298134" elapsed="0.011670"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:50.297106" elapsed="0.012861"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:50.311270" 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-10-16T01:19:50.310580" elapsed="0.000805"/>
</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-10-16T01:19:50.319250" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:50.318314" elapsed="0.000996"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:50.320462" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:50.319688" elapsed="0.000842"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:50.320658" elapsed="0.000112"/>
</return>
<msg time="2026-10-16T01:19:50.321083" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:50.317345" elapsed="0.003809"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:50.321526" elapsed="0.000379"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:50.323233" 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-10-16T01:19:50.322366" elapsed="0.000925"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:50.324434" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:50.323792" elapsed="0.000709"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:50.325694" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:50.324930" elapsed="0.000860"/>
</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-10-16T01:19:50.334195" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:50.333219" elapsed="0.001053"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:50.334353" elapsed="0.000102"/>
</return>
<msg time="2026-10-16T01:19:50.334792" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:50.330744" elapsed="0.004151"/>
</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-10-16T01:19:50.358963" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:50.358606" elapsed="0.000389"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:50.359804" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:50.359536" elapsed="0.000352">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:50.359993" 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-10-16T01:19:50.359178" elapsed="0.000846"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:50.360573" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:50.360212" elapsed="0.000390"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:50.360936" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:50.361118" 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-10-16T01:19:50.360798" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:50.361603" 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-10-16T01:19:50.361362" elapsed="0.000294"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:50.362834" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:50.362413" elapsed="0.000474"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:50.363382" 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-10-16T01:19:50.363102" elapsed="0.000313"/>
</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-10-16T01:19:50.363757" elapsed="0.000028"/>
</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-10-16T01:19:50.363964" elapsed="0.000022"/>
</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-10-16T01:19:50.364186" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:50.363595" elapsed="0.000647"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:50.363468" elapsed="0.000804"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:50.364326" elapsed="0.000029"/>
</return>
<msg time="2026-10-16T01:19:50.364473" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:50.362027" elapsed="0.002472"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:50.361738" elapsed="0.002791"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:50.364715" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:50.364554" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:50.361719" elapsed="0.003069"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:50.365413" 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-10-16T01:19:50.364960" elapsed="0.000487"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:50.365492" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:50.358029" elapsed="0.007565"/>
</kw>
<msg time="2026-10-16T01:19:50.365684" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:50.352174" elapsed="0.013574"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:50.369864" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:50.373934" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:50.378047" elapsed="0.000045"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:50.378250" 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-10-16T01:19:50.378430" 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-10-16T01:19:50.378802" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:50.378639" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:50.378625" 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-10-16T01:19:50.379031" elapsed="0.000042"/>
</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-10-16T01:19:50.379234" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:50.379392" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:50.378597" elapsed="0.000843"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:50.378502" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:50.379613" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:50.379680" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:50.379804" 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-10-16T01:19:50.351207" elapsed="0.028621"/>
</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-10-16T01:19:50.380953" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:50.380754" elapsed="0.000262">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:50.381154" 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-10-16T01:19:50.380413" elapsed="0.000765"/>
</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-10-16T01:19:50.381460" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:50.381243" elapsed="0.000269"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:50.381988" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:50.381722" elapsed="0.000290"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:50.381536" elapsed="0.000509"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:50.381226" elapsed="0.000854"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:50.382573" 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-10-16T01:19:50.382238" elapsed="0.000359"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:50.382642" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:19:50.382783" 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-manganese/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-10-16T01:19:50.380112" elapsed="0.002694"/>
</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-10-16T01:19:50.383886" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:50.383680" elapsed="0.000264">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:50.384027" 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-10-16T01:19:50.383366" elapsed="0.000696"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:50.384225" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:19:50.384127" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:50.384110" elapsed="0.000192"/>
</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-10-16T01:19:50.384450" elapsed="0.000020"/>
</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-10-16T01:19:50.384621" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:50.384679" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:50.384819" 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-manganese/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-10-16T01:19:50.383070" elapsed="0.001772"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:50.386347" 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-10-16T01:19:50.386119" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:50.386822" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:50.386573" 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-10-16T01:19:50.391233" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:50.391285" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:50.391382" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:50.387173" elapsed="0.004597">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:50.386926" elapsed="0.004927">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:50.392035" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:50.391884" elapsed="0.000258"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:50.386910" elapsed="0.005259">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:50.392513" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:50.392635" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:50.392602" elapsed="0.000073"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:50.392585" elapsed="0.000127"/>
</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-10-16T01:19:50.392853" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:50.392919" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:19:50.385299" elapsed="0.007730">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:50.393116" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:19:50.340499" elapsed="0.052756">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:50.393682" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:50.393428" elapsed="0.000376"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:50.393379" elapsed="0.000469"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:50.393936" elapsed="0.000038"/>
</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="FAIL" start="2026-10-16T01:19:50.338090" elapsed="0.056036">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:50.335243" elapsed="0.058988">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:50.335214" elapsed="0.059094">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:50.394569" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:50.394952" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:50.395287" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:50.395645" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:50.396137" elapsed="0.000024"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:50.396462" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:50.396858" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:50.397149" elapsed="0.000024"/>
</return>
<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="FAIL" start="2026-10-16T01:19:50.329145" elapsed="0.068129">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:50.397339" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:50.326817" elapsed="0.070615">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:50.397739" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:50.397568" elapsed="0.000230"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:50.397962" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:50.397822" elapsed="0.000190"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:50.398194" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:50.398034" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:50.397550" elapsed="0.000713"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:50.326407" elapsed="0.071896">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:50.325895" elapsed="0.072463">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:50.398407" elapsed="0.000016"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:50.315666" elapsed="0.082834">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:50.398677" elapsed="0.000269"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:50.399203" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:50.399028" elapsed="0.000226"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:50.399009" elapsed="0.000268"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:50.399404" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:50.399574" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:50.399634" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:50.313804" elapsed="0.085953">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:50.313205" elapsed="0.086620">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:50.312902" elapsed="0.086972">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:50.311930" elapsed="0.088026">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:50.400184" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:50.286981" elapsed="0.113310">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:51.419987" elapsed="0.000486"/>
</kw>
<msg time="2026-10-16T01:19:51.420588" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:51.418737" elapsed="0.002000"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:51.417786" elapsed="0.003111"/>
</kw>
<msg time="2026-10-16T01:19:51.421320" 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-10-16T01:19:51.410826" elapsed="0.010607"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:51.409872" elapsed="0.011722"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:51.422750" 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-10-16T01:19:51.422192" elapsed="0.000653"/>
</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-10-16T01:19:51.429420" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:51.428627" elapsed="0.000851"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:51.430469" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:51.429839" elapsed="0.000683"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:51.430617" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:19:51.430939" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:51.427830" elapsed="0.003159"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:51.431346" elapsed="0.000283"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:51.432738" 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-10-16T01:19:51.432024" elapsed="0.000771"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:51.433649" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:51.433144" elapsed="0.000585"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:51.434569" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:51.434037" elapsed="0.000584"/>
</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-10-16T01:19:51.443614" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:51.442171" elapsed="0.001613"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:51.443938" elapsed="0.000262"/>
</return>
<msg time="2026-10-16T01:19:51.444661" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:51.438658" elapsed="0.006429"/>
</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-10-16T01:19:51.468943" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:51.468500" elapsed="0.000479"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:51.469971" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:51.469660" elapsed="0.000426">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:51.470209" 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-10-16T01:19:51.469218" elapsed="0.001022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:51.471099" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:51.470532" elapsed="0.000611"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:51.471559" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:51.471803" 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-10-16T01:19:51.471394" elapsed="0.000445"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:51.472509" 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-10-16T01:19:51.472138" elapsed="0.000448"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:51.474196" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:51.473855" elapsed="0.000400"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:51.474925" 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-10-16T01:19:51.474496" elapsed="0.000460"/>
</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-10-16T01:19:51.475257" 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-10-16T01:19:51.475438" elapsed="0.000022"/>
</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-10-16T01:19:51.475622" elapsed="0.000025"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:51.475128" elapsed="0.000551"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:51.475001" elapsed="0.000720"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:51.475763" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:51.475891" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:51.473338" elapsed="0.002576"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:51.472948" elapsed="0.002994"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:51.476123" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:51.475966" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:51.472665" elapsed="0.003528"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:51.476741" 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-10-16T01:19:51.476344" elapsed="0.000423"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:51.476810" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:51.467777" elapsed="0.009131"/>
</kw>
<msg time="2026-10-16T01:19:51.476954" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:51.462052" elapsed="0.014947"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:51.480821" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:51.484588" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:51.488322" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:51.488496" elapsed="0.000019"/>
</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-10-16T01:19:51.488669" elapsed="0.000019"/>
</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-10-16T01:19:51.489050" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:51.488879" elapsed="0.000239"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:51.488866" elapsed="0.000275"/>
</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-10-16T01:19:51.489291" elapsed="0.000019"/>
</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-10-16T01:19:51.489471" elapsed="0.000018"/>
</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-10-16T01:19:51.489635" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:51.488840" elapsed="0.000843"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:51.488751" elapsed="0.000971"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:51.489879" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:51.489946" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:19:51.490050" 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-10-16T01:19:51.461215" elapsed="0.028873"/>
</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-10-16T01:19:51.491221" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:51.490980" elapsed="0.000310">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:51.491384" 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-10-16T01:19:51.490646" elapsed="0.000762"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:51.491685" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:51.491472" elapsed="0.000281"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:51.492213" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:51.491932" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:51.491776" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:51.491455" elapsed="0.000834"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:51.492793" 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-10-16T01:19:51.492442" elapsed="0.000375"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:51.492862" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:19:51.492985" 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-manganese/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-10-16T01:19:51.490352" elapsed="0.002655"/>
</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-10-16T01:19:51.495545" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:51.493900" elapsed="0.001706">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:51.495692" 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-10-16T01:19:51.493565" elapsed="0.002166"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:51.495898" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:19:51.495798" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:51.495780" elapsed="0.000196"/>
</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-10-16T01:19:51.496146" 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-10-16T01:19:51.496320" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:51.496390" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:51.496519" 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-manganese/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-10-16T01:19:51.493267" elapsed="0.003305"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:51.497827" 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-10-16T01:19:51.497580" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:51.498293" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:51.498069" elapsed="0.000264"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:19:51.502479" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:51.502533" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:51.502637" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:51.498615" elapsed="0.004416">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:51.498393" elapsed="0.004737">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:51.503309" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:51.503160" elapsed="0.000208"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:51.498376" elapsed="0.005013">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:51.503738" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:51.503871" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:51.503837" elapsed="0.000075"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:51.503821" elapsed="0.000111"/>
</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-10-16T01:19:51.504085" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:51.504151" elapsed="0.000013"/>
</return>
<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="FAIL" start="2026-10-16T01:19:51.496873" elapsed="0.007379">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:51.504319" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:19:51.451561" elapsed="0.052884">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:51.504863" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:51.504611" elapsed="0.000339"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:51.504563" elapsed="0.000431"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:51.505099" elapsed="0.000039"/>
</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="FAIL" start="2026-10-16T01:19:51.449279" elapsed="0.055991">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:51.445576" elapsed="0.059837">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:51.445530" elapsed="0.059958">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:51.505766" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:51.506139" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:51.506471" elapsed="0.000023"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:51.506893" elapsed="0.000031"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:51.507367" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:51.507690" elapsed="0.000055"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:51.508177" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:51.508422" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:19:51.437296" elapsed="0.071228">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:51.508584" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:51.435466" elapsed="0.073205">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:51.508929" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:51.508786" elapsed="0.000195"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:51.509154" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:51.509004" elapsed="0.000201"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:51.509366" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:51.509226" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:51.508768" elapsed="0.000665"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:51.435139" elapsed="0.074331">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:51.434745" elapsed="0.074779">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:51.509572" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:51.426447" elapsed="0.083215">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:51.509976" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:51.510213" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:51.510056" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:51.510041" elapsed="0.000241"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:51.510405" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:51.510570" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:51.510628" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:51.424838" elapsed="0.085949">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:51.424361" elapsed="0.086491">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:51.424113" elapsed="0.086787">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:51.423310" elapsed="0.087675">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:51.511215" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:51.401168" elapsed="0.110154">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:52.531275" elapsed="0.000409"/>
</kw>
<msg time="2026-10-16T01:19:52.531835" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:52.529652" elapsed="0.002303"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:52.528571" elapsed="0.003573"/>
</kw>
<msg time="2026-10-16T01:19:52.532238" 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-10-16T01:19:52.521951" elapsed="0.010378"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:52.521062" elapsed="0.011414"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:52.533552" 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-10-16T01:19:52.533014" elapsed="0.000647"/>
</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-10-16T01:19:52.540563" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:52.539737" elapsed="0.000884"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:52.541635" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:52.540995" elapsed="0.000695"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:52.541819" elapsed="0.000064"/>
</return>
<msg time="2026-10-16T01:19:52.542138" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:52.538851" elapsed="0.003340"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:52.542522" elapsed="0.000323"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:52.543944" 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-10-16T01:19:52.543236" elapsed="0.000764"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:52.544901" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:52.544359" elapsed="0.000596"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:52.545893" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:52.545286" elapsed="0.000667"/>
</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-10-16T01:19:52.555003" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:52.553468" elapsed="0.001777"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:52.555385" elapsed="0.000139"/>
</return>
<msg time="2026-10-16T01:19:52.556047" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:52.550010" elapsed="0.006198"/>
</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-10-16T01:19:52.580389" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:52.579940" elapsed="0.000486"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:52.581426" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:52.581129" elapsed="0.000397">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:52.581642" 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-10-16T01:19:52.580644" elapsed="0.001030"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:52.582455" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:52.581939" elapsed="0.000553"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:52.582929" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:52.583139" 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-10-16T01:19:52.582744" elapsed="0.000429"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:52.583793" 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-10-16T01:19:52.583446" elapsed="0.000405"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:52.585226" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:52.584853" elapsed="0.000430"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:52.585980" 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-10-16T01:19:52.585525" elapsed="0.000481"/>
</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-10-16T01:19:52.586316" elapsed="0.000020"/>
</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-10-16T01:19:52.586498" elapsed="0.000022"/>
</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-10-16T01:19:52.586678" elapsed="0.000033"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:52.586184" elapsed="0.000562"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:52.586053" elapsed="0.000722"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:52.586815" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:52.586945" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:52.584305" elapsed="0.002663"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:52.583938" elapsed="0.003058"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:52.587175" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:52.587020" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:52.583914" elapsed="0.003332"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:52.587845" 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-10-16T01:19:52.587400" elapsed="0.000471"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:52.587915" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:52.579211" elapsed="0.008804"/>
</kw>
<msg time="2026-10-16T01:19:52.588112" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:52.573440" elapsed="0.014721"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:52.591983" elapsed="0.000032"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:52.595812" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:52.599714" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:52.599897" elapsed="0.000020"/>
</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-10-16T01:19:52.600088" 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-10-16T01:19:52.600434" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:52.600288" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:52.600274" 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-10-16T01:19:52.600662" elapsed="0.000019"/>
</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-10-16T01:19:52.600853" elapsed="0.000018"/>
</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-10-16T01:19:52.601010" elapsed="0.000023"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:52.600248" elapsed="0.000815"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:52.600157" elapsed="0.000943"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:52.601249" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:52.601315" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:19:52.601420" 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-10-16T01:19:52.572565" elapsed="0.028878"/>
</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-10-16T01:19:52.602550" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:52.602355" elapsed="0.000255">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:52.602692" 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-10-16T01:19:52.602022" elapsed="0.000709"/>
</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-10-16T01:19:52.603010" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:52.602796" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:52.603570" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:52.603304" elapsed="0.000291"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:52.603132" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:52.602779" elapsed="0.000869"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:52.604175" 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-10-16T01:19:52.603821" elapsed="0.000379"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:52.604245" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:52.604369" 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-manganese/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-10-16T01:19:52.601724" elapsed="0.002668"/>
</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-10-16T01:19:52.605485" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:52.605296" elapsed="0.000248">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:52.605632" 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-10-16T01:19:52.604953" elapsed="0.000701"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:52.605833" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:19:52.605734" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:52.605717" elapsed="0.000197"/>
</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-10-16T01:19:52.606064" 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-10-16T01:19:52.606250" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:52.606310" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:52.606433" 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-manganese/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-10-16T01:19:52.604633" elapsed="0.001823"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:52.607939" 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-10-16T01:19:52.607713" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:52.608399" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:52.608181" elapsed="0.000259"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:19:52.612956" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:52.613009" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:52.613120" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:52.608740" elapsed="0.004732">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:52.608500" elapsed="0.005049">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:52.613749" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:52.613580" elapsed="0.000230"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:52.608483" elapsed="0.005348">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:52.614187" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:52.614344" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:52.614309" elapsed="0.000074"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:52.614291" 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-10-16T01:19:52.614542" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:52.614608" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:19:52.606931" elapsed="0.007799">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:52.614800" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:19:52.562727" elapsed="0.052202">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:52.615343" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:52.615120" elapsed="0.000306"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:52.615052" elapsed="0.000418"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:52.615556" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:19:52.560475" elapsed="0.055272">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:52.556992" elapsed="0.058859">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:52.556671" elapsed="0.059254">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:52.616195" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:52.616545" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:52.616875" elapsed="0.000023"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:52.617242" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:52.617671" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:52.618013" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:52.618403" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:52.618657" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:19:52.548645" elapsed="0.070151">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:52.618860" elapsed="0.000017"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:52.546822" elapsed="0.072130">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:52.619190" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:52.619034" elapsed="0.000206"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:52.619443" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:52.619263" elapsed="0.000232"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:52.619660" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:52.619518" elapsed="0.000236"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:52.619017" elapsed="0.000760"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:52.546454" elapsed="0.073362">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:52.546049" elapsed="0.073820">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:52.619919" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:52.537450" elapsed="0.082562">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:52.620207" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:52.620445" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:52.620287" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:52.620272" elapsed="0.000244"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:52.620647" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:52.620921" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:52.620982" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:52.535856" elapsed="0.085232">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:52.535357" elapsed="0.085796">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:52.535033" elapsed="0.086169">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:52.534208" elapsed="0.087076">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:52.621502" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:52.512199" elapsed="0.109408">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:53.641245" elapsed="0.000397"/>
</kw>
<msg time="2026-10-16T01:19:53.641787" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:53.639861" elapsed="0.002043"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:53.638790" elapsed="0.003270"/>
</kw>
<msg time="2026-10-16T01:19:53.642178" 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-10-16T01:19:53.632043" elapsed="0.010228"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:53.631175" elapsed="0.011246"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:53.643645" 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-10-16T01:19:53.643111" elapsed="0.000677"/>
</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-10-16T01:19:53.650572" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:53.649752" elapsed="0.000880"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:53.651633" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:53.651003" elapsed="0.000693"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:53.651843" elapsed="0.000069"/>
</return>
<msg time="2026-10-16T01:19:53.652164" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:53.648890" elapsed="0.003327"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:53.652566" elapsed="0.000362"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:53.654030" 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-10-16T01:19:53.653330" elapsed="0.000778"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:53.654972" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:53.654436" elapsed="0.000589"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:53.655883" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:53.655358" elapsed="0.000577"/>
</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-10-16T01:19:53.664993" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:53.663569" elapsed="0.001557"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:53.665255" elapsed="0.000135"/>
</return>
<msg time="2026-10-16T01:19:53.665957" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:53.660127" elapsed="0.005981"/>
</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-10-16T01:19:53.689860" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:53.689416" elapsed="0.000480"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:53.690922" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:53.690593" elapsed="0.000425">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:53.691156" 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-10-16T01:19:53.690124" elapsed="0.001064"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:53.691882" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:53.691420" elapsed="0.000498"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:53.692335" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:53.692527" 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-10-16T01:19:53.692168" elapsed="0.000392"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:53.693175" 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-10-16T01:19:53.692849" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:53.694721" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:53.694176" elapsed="0.000621"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:53.695361" 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-10-16T01:19:53.695052" elapsed="0.000334"/>
</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-10-16T01:19:53.695670" 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-10-16T01:19:53.695870" 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-10-16T01:19:53.696049" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:53.695542" elapsed="0.000575"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:53.695430" elapsed="0.000715"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:53.696186" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:19:53.696315" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:53.693663" elapsed="0.002675"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:53.693319" elapsed="0.003048"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:53.696533" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:53.696391" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:53.693294" elapsed="0.003309"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:53.697201" 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-10-16T01:19:53.696770" elapsed="0.000457"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:53.697276" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:53.688683" elapsed="0.008693"/>
</kw>
<msg time="2026-10-16T01:19:53.697422" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:53.683065" elapsed="0.014403"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:53.701309" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:53.705092" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:53.708849" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:53.709025" elapsed="0.000020"/>
</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-10-16T01:19:53.709218" 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-10-16T01:19:53.709591" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:53.709423" elapsed="0.000232"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:53.709409" elapsed="0.000269"/>
</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-10-16T01:19:53.709850" 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-10-16T01:19:53.710027" elapsed="0.000018"/>
</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-10-16T01:19:53.710236" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:53.709383" elapsed="0.000903"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:53.709286" elapsed="0.001024"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:53.710459" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:53.710527" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:19:53.710632" 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-10-16T01:19:53.682164" elapsed="0.028492"/>
</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-10-16T01:19:53.711780" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:53.711570" elapsed="0.000271">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:53.711923" 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-10-16T01:19:53.711244" elapsed="0.000701"/>
</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-10-16T01:19:53.712237" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:53.712008" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:53.712748" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:53.712471" elapsed="0.000301"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:53.712313" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:53.711991" elapsed="0.000834"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:53.713331" 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-10-16T01:19:53.712981" elapsed="0.000374"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:53.713400" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:53.713523" 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-manganese/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-10-16T01:19:53.710932" elapsed="0.002613"/>
</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-10-16T01:19:53.714621" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:53.714434" elapsed="0.000244">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:53.714778" 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-10-16T01:19:53.714121" elapsed="0.000680"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:53.714972" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:19:53.714870" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:53.714848" elapsed="0.000205"/>
</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-10-16T01:19:53.715223" 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-10-16T01:19:53.715394" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:53.715454" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:53.715577" 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-manganese/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-10-16T01:19:53.713804" elapsed="0.001795"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:53.717005" 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-10-16T01:19:53.716780" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:53.717507" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:53.717285" elapsed="0.000263"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:19:53.721822" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:53.721875" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:53.721972" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:53.717847" elapsed="0.004492">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:53.717609" elapsed="0.004807">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:53.722597" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:53.722447" elapsed="0.000209"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:53.717592" elapsed="0.005086">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:53.723027" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:53.723164" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:53.723130" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:53.723114" elapsed="0.000109"/>
</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-10-16T01:19:53.723357" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:53.723420" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:19:53.716047" elapsed="0.007474">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:53.723589" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:19:53.672008" elapsed="0.051735">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:53.724146" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:53.723914" elapsed="0.000315"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:53.723866" elapsed="0.000406"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:53.724356" elapsed="0.000037"/>
</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="FAIL" start="2026-10-16T01:19:53.669882" elapsed="0.054640">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:53.666576" elapsed="0.058046">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:53.666532" elapsed="0.058163">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:53.724958" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:53.725350" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:53.725661" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:53.726033" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:53.726482" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:53.726811" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:53.727170" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:53.727407" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:19:53.658782" elapsed="0.068726">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:53.727568" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:53.656798" elapsed="0.070858">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:53.727901" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:53.727755" elapsed="0.000197"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:53.728125" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:53.727974" elapsed="0.000205"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:53.728342" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:53.728202" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:53.727739" elapsed="0.000670"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:53.656416" elapsed="0.072031">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:53.656026" elapsed="0.072473">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:53.728547" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:53.647454" elapsed="0.081183">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:53.728879" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:53.729117" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:53.728959" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:53.728944" elapsed="0.000244"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:53.729312" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:53.729477" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:53.729535" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:53.645817" elapsed="0.083808">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:53.645341" elapsed="0.084345">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:53.645095" elapsed="0.084765">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:53.644299" elapsed="0.085665">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:53.730213" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:53.622381" elapsed="0.107940">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:54.749697" elapsed="0.000460"/>
</kw>
<msg time="2026-10-16T01:19:54.750274" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:54.748417" elapsed="0.001975"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:54.747241" elapsed="0.003308"/>
</kw>
<msg time="2026-10-16T01:19:54.750640" 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-10-16T01:19:54.740530" elapsed="0.010233"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:54.739621" elapsed="0.011296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:54.751982" 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-10-16T01:19:54.751421" elapsed="0.000728"/>
</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-10-16T01:19:54.758782" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:54.757994" elapsed="0.000848"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:54.759984" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:54.759209" elapsed="0.000833"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:54.760164" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:19:54.760453" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:54.757174" elapsed="0.003329"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:54.760877" elapsed="0.000314"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:54.762355" 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-10-16T01:19:54.761556" elapsed="0.000854"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:54.763299" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:54.762766" elapsed="0.000585"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:54.764243" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:54.763654" elapsed="0.000642"/>
</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-10-16T01:19:54.773425" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:54.771828" elapsed="0.001706"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:54.773662" elapsed="0.000167"/>
</return>
<msg time="2026-10-16T01:19:54.774291" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:54.768339" elapsed="0.006079"/>
</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-10-16T01:19:54.797982" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:54.797539" elapsed="0.000479"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:54.798998" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:54.798688" elapsed="0.000424">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:54.799237" 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-10-16T01:19:54.798251" elapsed="0.001018"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:54.799951" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:54.799502" elapsed="0.000484"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:54.800392" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:54.800584" 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-10-16T01:19:54.800236" elapsed="0.000380"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:54.801242" 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-10-16T01:19:54.800908" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:54.802744" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:54.802400" elapsed="0.000417"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:54.803362" 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-10-16T01:19:54.803103" 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-10-16T01:19:54.803662" 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-10-16T01:19:54.803860" elapsed="0.000022"/>
</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-10-16T01:19:54.804038" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:54.803535" elapsed="0.000569"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:54.803428" elapsed="0.000706"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:54.804174" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:54.804303" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:54.801916" elapsed="0.002410"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:54.801540" elapsed="0.002815"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:54.804524" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:54.804380" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:54.801360" elapsed="0.003234"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:54.805187" 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-10-16T01:19:54.804773" elapsed="0.000440"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:54.805256" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:54.796817" elapsed="0.008538"/>
</kw>
<msg time="2026-10-16T01:19:54.805400" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:54.791028" elapsed="0.014418"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:54.809244" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:54.813152" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:54.816920" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:54.817113" 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-10-16T01:19:54.817293" 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-10-16T01:19:54.817633" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:54.817493" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:54.817479" elapsed="0.000244"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:54.817875" 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-10-16T01:19:54.818053" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:54.818229" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:54.817453" elapsed="0.000825"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:54.817362" elapsed="0.000939"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:54.818450" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:54.818517" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:54.818621" 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-10-16T01:19:54.790188" elapsed="0.028457"/>
</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-10-16T01:19:54.819768" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:54.819559" elapsed="0.000268">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:54.819910" 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-10-16T01:19:54.819240" elapsed="0.000692"/>
</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-10-16T01:19:54.820229" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:54.819995" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:54.820747" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:54.820462" elapsed="0.000310"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:54.820305" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:54.819979" elapsed="0.000845"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:54.821328" 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-10-16T01:19:54.820979" elapsed="0.000400"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:54.821427" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:54.821565" 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-manganese/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-10-16T01:19:54.818929" elapsed="0.002659"/>
</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-10-16T01:19:54.824116" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:54.822473" elapsed="0.001705">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:54.824265" 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-10-16T01:19:54.822159" elapsed="0.002130"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:54.824453" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:19:54.824354" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:54.824337" elapsed="0.000194"/>
</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-10-16T01:19:54.824683" elapsed="0.000036"/>
</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-10-16T01:19:54.824876" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:54.824937" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:54.825064" 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-manganese/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-10-16T01:19:54.821847" elapsed="0.003254"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:54.826345" 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-10-16T01:19:54.826114" elapsed="0.000274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:54.826812" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:54.826575" 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-10-16T01:19:54.830984" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:54.831036" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:54.831154" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:54.827165" elapsed="0.004351">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:54.826916" elapsed="0.004678">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:54.831792" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:54.831625" elapsed="0.000226"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:54.826898" elapsed="0.004976">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:54.832227" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:54.832348" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:54.832315" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:54.832298" elapsed="0.000110"/>
</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-10-16T01:19:54.832543" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:54.832638" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:19:54.825373" elapsed="0.007386">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:54.832827" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:19:54.780456" elapsed="0.052498">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:54.833361" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:54.833141" elapsed="0.000301"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:54.833076" elapsed="0.000409"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:54.833568" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:19:54.778285" elapsed="0.055470">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:54.774915" elapsed="0.058942">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:54.774871" elapsed="0.059065">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:54.834205" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:54.834550" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:54.834880" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:54.835241" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:54.835667" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:54.835999" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:54.836364" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:54.836604" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:19:54.766990" elapsed="0.069750">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:54.836803" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:54.765187" elapsed="0.071706">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:54.837127" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:54.836973" elapsed="0.000205"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:54.837338" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:54.837201" elapsed="0.000186"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:54.837550" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:54.837409" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:54.836958" elapsed="0.000691"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:54.764807" elapsed="0.072883">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:54.764391" elapsed="0.073375">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:54.837815" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:54.755790" elapsed="0.082117">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:54.838093" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:54.838316" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:54.838174" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:54.838158" elapsed="0.000226"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:54.838510" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:54.838678" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:54.838848" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:54.754138" elapsed="0.084803">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:54.753639" elapsed="0.085364">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:54.753395" elapsed="0.085658">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:54.752599" elapsed="0.086552">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:54.839362" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:54.731154" elapsed="0.108312">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:55.858741" elapsed="0.000422"/>
</kw>
<msg time="2026-10-16T01:19:55.859278" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:55.857407" elapsed="0.001987"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:55.856361" elapsed="0.003195"/>
</kw>
<msg time="2026-10-16T01:19:55.859648" 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-10-16T01:19:55.849754" elapsed="0.010016"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:55.848874" elapsed="0.011050"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:55.860972" 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-10-16T01:19:55.860423" elapsed="0.000643"/>
</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-10-16T01:19:55.867960" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:55.867161" elapsed="0.000859"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:55.869027" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:55.868382" elapsed="0.000701"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:55.869203" elapsed="0.000063"/>
</return>
<msg time="2026-10-16T01:19:55.869496" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:55.866318" elapsed="0.003231"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:55.869913" elapsed="0.000314"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:55.871338" 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-10-16T01:19:55.870600" elapsed="0.000795"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:55.872298" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:55.871759" elapsed="0.000594"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:55.873239" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:55.872663" elapsed="0.000630"/>
</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-10-16T01:19:55.882421" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:55.880908" elapsed="0.001626"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:55.882667" elapsed="0.000322"/>
</return>
<msg time="2026-10-16T01:19:55.883461" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:55.877383" elapsed="0.006205"/>
</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-10-16T01:19:55.907188" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:55.906729" elapsed="0.000496"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:55.908233" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:55.907917" elapsed="0.000414">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:55.908449" 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-10-16T01:19:55.907441" elapsed="0.001039"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:55.909194" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:55.908743" elapsed="0.000487"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:55.909618" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:55.909839" 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-10-16T01:19:55.909458" elapsed="0.000414"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:55.910475" 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-10-16T01:19:55.910162" elapsed="0.000370"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:55.911813" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:55.911474" elapsed="0.000415"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:55.912694" 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-10-16T01:19:55.912146" elapsed="0.000604"/>
</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-10-16T01:19:55.913061" 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-10-16T01:19:55.913260" elapsed="0.000022"/>
</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-10-16T01:19:55.913493" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:55.912929" elapsed="0.000617"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:55.912814" elapsed="0.000761"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:55.913616" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:55.913762" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:55.910989" elapsed="0.002798"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:55.910616" elapsed="0.003200"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:55.913984" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:55.913840" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:55.910592" elapsed="0.003463"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:55.914613" 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-10-16T01:19:55.914221" elapsed="0.000417"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:55.914682" elapsed="0.000041"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:55.905998" elapsed="0.008802"/>
</kw>
<msg time="2026-10-16T01:19:55.914852" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:55.900344" elapsed="0.014554"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:55.918694" elapsed="0.000037"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:55.922494" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:55.926280" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:55.926458" elapsed="0.000019"/>
</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-10-16T01:19:55.926635" elapsed="0.000019"/>
</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-10-16T01:19:55.926996" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:55.926849" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:55.926835" 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-10-16T01:19:55.927240" elapsed="0.000019"/>
</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-10-16T01:19:55.927418" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:55.927582" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:55.926808" elapsed="0.000822"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:55.926716" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:55.927856" elapsed="0.000025"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:55.927932" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:19:55.928039" 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-10-16T01:19:55.899476" elapsed="0.028588"/>
</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-10-16T01:19:55.929203" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:55.928987" elapsed="0.000276">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:55.929346" 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-10-16T01:19:55.928642" elapsed="0.000728"/>
</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-10-16T01:19:55.929655" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:55.929434" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:55.930200" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:55.929918" elapsed="0.000308"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:55.929748" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:55.929417" elapsed="0.000863"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:55.930794" 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-10-16T01:19:55.930437" elapsed="0.000385"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:55.930870" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:19:55.930994" 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-manganese/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-10-16T01:19:55.928343" elapsed="0.002675"/>
</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-10-16T01:19:55.932116" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:55.931912" elapsed="0.000264">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:55.932261" 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-10-16T01:19:55.931575" elapsed="0.000710"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:55.932462" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:19:55.932362" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:55.932332" elapsed="0.000213"/>
</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-10-16T01:19:55.932710" 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-10-16T01:19:55.932886" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:55.932946" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:19:55.933072" 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-manganese/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-10-16T01:19:55.931278" elapsed="0.001831"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:55.934527" 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-10-16T01:19:55.934302" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:55.934997" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:55.934770" elapsed="0.000268"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:19:55.939313" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:55.939402" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:55.939501" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:55.935338" elapsed="0.004538">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:55.935112" elapsed="0.004842">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:55.940149" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:55.939985" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:55.935081" elapsed="0.005150">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:55.940567" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:55.940688" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:55.940654" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:55.940638" 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-10-16T01:19:55.940906" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:55.940970" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:19:55.933564" elapsed="0.007508">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:55.941153" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:19:55.889839" elapsed="0.051443">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:55.941671" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:55.941452" elapsed="0.000324"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:55.941404" elapsed="0.000415"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:55.941904" elapsed="0.000038"/>
</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="FAIL" start="2026-10-16T01:19:55.887546" elapsed="0.054527">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:55.884131" elapsed="0.058059">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:55.884065" elapsed="0.058199">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:55.942516" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:55.942891" elapsed="0.000025"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:55.943225" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:55.943577" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:55.944065" elapsed="0.000034"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:55.944395" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:55.944770" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:55.945010" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:19:55.876036" elapsed="0.069088">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:55.945198" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:55.874158" elapsed="0.071132">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:55.945516" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:55.945373" elapsed="0.000195"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:55.945751" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:55.945591" elapsed="0.000211"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:55.945969" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:55.945825" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:55.945356" elapsed="0.000684"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:55.873803" elapsed="0.072276">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:55.873389" elapsed="0.072757">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:55.946196" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:55.864833" elapsed="0.081458">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:55.946468" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:55.946816" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:55.946554" elapsed="0.000315"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:55.946538" elapsed="0.000354"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:55.947021" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:55.947201" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:55.947262" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:55.863214" elapsed="0.084148">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:55.862688" elapsed="0.084738">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:55.862436" elapsed="0.085041">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:55.861530" elapsed="0.086031">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:55.947835" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:55.840281" elapsed="0.107662">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:56.968149" elapsed="0.000392"/>
</kw>
<msg time="2026-10-16T01:19:56.968657" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:56.966692" elapsed="0.002111"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:56.965643" elapsed="0.003316"/>
</kw>
<msg time="2026-10-16T01:19:56.969049" 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-10-16T01:19:56.958760" elapsed="0.010398"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:56.957815" elapsed="0.011492"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:56.970461" 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-10-16T01:19:56.969807" elapsed="0.000746"/>
</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-10-16T01:19:56.977450" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:56.976597" elapsed="0.000911"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:56.978533" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:56.977880" elapsed="0.000707"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:56.978681" elapsed="0.000090"/>
</return>
<msg time="2026-10-16T01:19:56.979012" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:56.975777" elapsed="0.003289"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:56.979438" elapsed="0.000333"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:56.980946" 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-10-16T01:19:56.980189" elapsed="0.000822"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:56.981895" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:56.981367" elapsed="0.000580"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:56.982797" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:56.982274" elapsed="0.000577"/>
</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-10-16T01:19:56.992064" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:56.990519" elapsed="0.001681"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:56.992334" elapsed="0.000145"/>
</return>
<msg time="2026-10-16T01:19:56.993196" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:56.986968" elapsed="0.006368"/>
</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-10-16T01:19:57.019522" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:57.019084" elapsed="0.000474"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:57.020613" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:57.020326" elapsed="0.000402">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:57.020848" 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-10-16T01:19:57.019866" elapsed="0.001013"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:57.021557" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:57.021128" elapsed="0.000464"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:57.022000" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:57.022233" 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-10-16T01:19:57.021837" elapsed="0.000430"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:57.022885" 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-10-16T01:19:57.022541" elapsed="0.000402"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:57.024414" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:57.023888" elapsed="0.000586"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:57.025117" 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-10-16T01:19:57.024735" elapsed="0.000418"/>
</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-10-16T01:19:57.025544" elapsed="0.000029"/>
</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-10-16T01:19:57.025822" 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-10-16T01:19:57.026073" elapsed="0.000044"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:57.025364" elapsed="0.000800"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:57.025213" elapsed="0.000991"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:57.026260" elapsed="0.000036"/>
</return>
<msg time="2026-10-16T01:19:57.026440" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:57.023398" elapsed="0.003074"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:57.023027" elapsed="0.003486"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:57.026768" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:57.026547" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:57.023004" elapsed="0.003878"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:57.027573" 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-10-16T01:19:57.027170" elapsed="0.000428"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:57.027641" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:57.018369" elapsed="0.009387"/>
</kw>
<msg time="2026-10-16T01:19:57.027803" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:57.012601" elapsed="0.015248"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:57.031614" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:57.035401" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:57.039252" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:57.039425" elapsed="0.000020"/>
</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-10-16T01:19:57.039600" elapsed="0.000019"/>
</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-10-16T01:19:57.039959" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:57.039814" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:57.039800" 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-10-16T01:19:57.040194" elapsed="0.000019"/>
</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-10-16T01:19:57.040369" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:57.040534" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:57.039773" elapsed="0.000809"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:57.039667" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:57.040767" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:57.040835" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:57.040938" 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-10-16T01:19:57.011771" elapsed="0.029190"/>
</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-10-16T01:19:57.042064" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:57.041876" elapsed="0.000263">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:57.042222" 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-10-16T01:19:57.041542" elapsed="0.000703"/>
</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-10-16T01:19:57.042520" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:57.042307" elapsed="0.000265"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:57.043050" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:57.042768" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:57.042595" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:57.042290" elapsed="0.000851"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:57.043634" 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-10-16T01:19:57.043298" elapsed="0.000360"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:57.043718" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:19:57.043849" 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-manganese/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-10-16T01:19:57.041248" elapsed="0.002629"/>
</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-10-16T01:19:57.045007" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:57.044815" elapsed="0.000250">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:57.045168" 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-10-16T01:19:57.044482" elapsed="0.000709"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:57.045352" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:19:57.045254" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:57.045238" elapsed="0.000190"/>
</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-10-16T01:19:57.045582" 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-10-16T01:19:57.045768" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:57.045835" elapsed="0.000018"/>
</return>
<msg time="2026-10-16T01:19:57.045987" 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-manganese/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-10-16T01:19:57.044188" elapsed="0.001828"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:57.047405" 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-10-16T01:19:57.047182" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:57.047869" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:57.047631" elapsed="0.000278"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:19:57.052172" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:57.052224" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:57.052322" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:57.048207" elapsed="0.004465">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:57.047969" elapsed="0.004799">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:57.052955" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:57.052800" elapsed="0.000213"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:57.047953" elapsed="0.005083">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:57.053387" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:57.053507" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:57.053474" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:57.053458" elapsed="0.000107"/>
</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-10-16T01:19:57.053715" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:57.053780" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:19:57.046463" elapsed="0.007424">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:57.053984" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:19:57.001973" elapsed="0.052156">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:57.054518" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:57.054299" elapsed="0.000302"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:57.054252" elapsed="0.000392"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:57.054750" elapsed="0.000038"/>
</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="FAIL" start="2026-10-16T01:19:56.998050" elapsed="0.056896">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:56.993861" elapsed="0.061203">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:56.993815" elapsed="0.061334">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:57.055396" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:57.055765" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:57.056083" elapsed="0.000031"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:57.056445" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:57.056896" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:57.057223" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:57.057576" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:57.057853" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:19:56.985586" elapsed="0.072368">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:57.058016" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:56.983654" elapsed="0.074469">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:57.058344" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:57.058203" elapsed="0.000192"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:57.058554" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:57.058417" elapsed="0.000186"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:57.058785" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:57.058625" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:57.058187" elapsed="0.000671"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:56.983330" elapsed="0.075568">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:56.982944" elapsed="0.076006">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:57.058997" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:56.974406" elapsed="0.084729">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:57.059311" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:57.059528" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:57.059389" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:57.059373" elapsed="0.000223"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:57.059833" elapsed="0.000021"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:57.060004" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:57.060062" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:56.972745" elapsed="0.087419">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:56.972238" elapsed="0.087988">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:56.971947" elapsed="0.088327">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:56.971066" elapsed="0.089287">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:57.060558" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:56.948751" elapsed="0.111910">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:58.080150" elapsed="0.000413"/>
</kw>
<msg time="2026-10-16T01:19:58.080681" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:58.078869" elapsed="0.001969"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:58.077537" elapsed="0.003462"/>
</kw>
<msg time="2026-10-16T01:19:58.081088" 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-10-16T01:19:58.070933" elapsed="0.010371"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:58.070044" elapsed="0.011409"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:58.082541" 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-10-16T01:19:58.081968" elapsed="0.000664"/>
</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-10-16T01:19:58.089244" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:58.088451" elapsed="0.000853"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:58.090352" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:58.089634" elapsed="0.000780"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:58.090616" elapsed="0.000067"/>
</return>
<msg time="2026-10-16T01:19:58.090953" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:58.087623" elapsed="0.003381"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:58.091365" elapsed="0.000286"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:58.092776" 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-10-16T01:19:58.092049" elapsed="0.000785"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:58.093689" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:58.093183" elapsed="0.000592"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:58.094612" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:58.094087" elapsed="0.000578"/>
</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-10-16T01:19:58.103444" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:58.102060" elapsed="0.001492"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:58.103680" elapsed="0.000221"/>
</return>
<msg time="2026-10-16T01:19:58.104352" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:58.098657" elapsed="0.005820"/>
</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-10-16T01:19:58.128222" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:58.127776" elapsed="0.000482"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:58.129253" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:58.128938" elapsed="0.000416">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:58.129471" 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-10-16T01:19:58.128475" elapsed="0.001028"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:58.130202" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:58.129755" elapsed="0.000482"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:58.130618" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:58.130834" 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-10-16T01:19:58.130461" elapsed="0.000406"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:58.131465" 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-10-16T01:19:58.131158" elapsed="0.000363"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:58.132976" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:58.132631" elapsed="0.000401"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:58.133643" 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-10-16T01:19:58.133291" elapsed="0.000386"/>
</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-10-16T01:19:58.134156" elapsed="0.000036"/>
</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-10-16T01:19:58.134374" elapsed="0.000022"/>
</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-10-16T01:19:58.134554" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:58.133921" elapsed="0.000683"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:58.133758" elapsed="0.000876"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:58.134675" elapsed="0.000040"/>
</return>
<msg time="2026-10-16T01:19:58.134856" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:58.132167" elapsed="0.002713"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:58.131783" elapsed="0.003125"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:58.135080" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:58.134934" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:58.131581" elapsed="0.003587"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:58.135758" 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-10-16T01:19:58.135323" elapsed="0.000461"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:58.135829" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:58.127042" elapsed="0.008886"/>
</kw>
<msg time="2026-10-16T01:19:58.135976" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:58.121435" elapsed="0.014588"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:58.139818" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:58.143578" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:58.147340" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:58.147539" 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-10-16T01:19:58.147732" 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-10-16T01:19:58.148076" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:58.147936" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:58.147922" elapsed="0.000243"/>
</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-10-16T01:19:58.148316" elapsed="0.000019"/>
</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-10-16T01:19:58.148491" elapsed="0.000018"/>
</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-10-16T01:19:58.148651" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:58.147897" elapsed="0.000815"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:58.147807" elapsed="0.000930"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:58.148886" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:58.148953" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:58.149056" 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-10-16T01:19:58.120579" elapsed="0.028501"/>
</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-10-16T01:19:58.150227" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:58.150021" elapsed="0.000265">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:58.150368" 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-10-16T01:19:58.149685" elapsed="0.000706"/>
</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-10-16T01:19:58.150669" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:58.150454" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:58.151232" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:58.150922" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:58.150760" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:58.150437" elapsed="0.000873"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:58.151821" 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-10-16T01:19:58.151468" elapsed="0.000377"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:58.151890" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:19:58.152013" 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-manganese/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-10-16T01:19:58.149389" elapsed="0.002646"/>
</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-10-16T01:19:58.154624" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:58.152922" elapsed="0.001762">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:58.154787" 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-10-16T01:19:58.152589" elapsed="0.002221"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:58.154977" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-10-16T01:19:58.154875" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:58.154858" elapsed="0.000215"/>
</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-10-16T01:19:58.155242" 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-10-16T01:19:58.155417" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:58.155478" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:58.155604" 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-manganese/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-10-16T01:19:58.152293" elapsed="0.003334"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:58.156877" 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-10-16T01:19:58.156621" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:58.157348" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:58.157126" elapsed="0.000262"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:19:58.161515" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:58.161568" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:58.161725" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:58.157669" elapsed="0.004417">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:58.157447" elapsed="0.004735">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:58.162365" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:58.162214" elapsed="0.000211"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:58.157431" elapsed="0.005015">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:58.162803" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:58.162926" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:58.162891" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:58.162875" 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-10-16T01:19:58.163140" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:58.163208" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:19:58.155913" elapsed="0.007397">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:58.163378" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:19:58.110849" elapsed="0.052655">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:58.163915" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:58.163672" elapsed="0.000324"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:58.163624" elapsed="0.000414"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:58.164133" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:19:58.108683" elapsed="0.055616">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:58.104979" elapsed="0.059418">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:58.104936" elapsed="0.059533">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:58.164728" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:58.165082" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:58.165412" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:58.165779" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:58.166231" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:58.166548" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:58.166922" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:58.167206" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:19:58.097345" elapsed="0.069963">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:58.167369" elapsed="0.000014"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:58.095506" elapsed="0.071950">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:58.167675" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:58.167535" elapsed="0.000209"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:58.167904" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:58.167767" elapsed="0.000186"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:58.168126" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:58.167974" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:58.167520" elapsed="0.000677"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:58.095181" elapsed="0.073054">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:58.094792" elapsed="0.073497">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:58.168338" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:58.086268" elapsed="0.082162">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:58.168620" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:58.168946" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:58.168797" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:58.168693" elapsed="0.000323"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:58.169155" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:58.169324" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:58.169383" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:58.084621" elapsed="0.084856">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:58.084172" elapsed="0.085368">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:58.083902" elapsed="0.085687">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:58.083129" elapsed="0.086542">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:58.169988" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:58.061446" elapsed="0.108649">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:19:59.247759" elapsed="0.000257"/>
</kw>
<msg time="2026-10-16T01:19:59.248092" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:59.246954" elapsed="0.001232"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:19:59.246373" elapsed="0.001913"/>
</kw>
<msg time="2026-10-16T01:19:59.248343" 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-10-16T01:19:59.242312" elapsed="0.006088"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:19:59.241635" elapsed="0.006859"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:59.249149" 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-10-16T01:19:59.248806" elapsed="0.000402"/>
</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-10-16T01:19:59.253353" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:19:59.252875" elapsed="0.000514"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:59.254004" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:59.253597" elapsed="0.000441"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:19:59.254098" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:19:59.254300" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:19:59.252366" elapsed="0.001966"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:19:59.254538" elapsed="0.000201"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:59.255409" 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-10-16T01:19:59.254969" elapsed="0.000475"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:59.255990" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:59.255648" elapsed="0.000376"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:19:59.256765" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:19:59.256235" elapsed="0.000566"/>
</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-10-16T01:19:59.261938" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:19:59.261079" elapsed="0.000929"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:19:59.262089" elapsed="0.000101"/>
</return>
<msg time="2026-10-16T01:19:59.262462" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:19:59.259084" elapsed="0.003458"/>
</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-10-16T01:19:59.279337" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:59.279017" elapsed="0.000347"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:19:59.280066" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:19:59.279851" elapsed="0.000300">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:59.280235" 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-10-16T01:19:59.279518" elapsed="0.000740"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:59.280814" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:59.280481" elapsed="0.000360"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:19:59.281137" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:19:59.281281" 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-10-16T01:19:59.281009" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:59.281736" 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-10-16T01:19:59.281496" 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-10-16T01:19:59.282669" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:59.282436" elapsed="0.000292"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:19:59.283173" 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-10-16T01:19:59.282902" 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-10-16T01:19:59.283479" elapsed="0.000020"/>
</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-10-16T01:19:59.283660" elapsed="0.000022"/>
</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-10-16T01:19:59.283858" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:19:59.283350" elapsed="0.000560"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:19:59.283241" elapsed="0.000697"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:19:59.283978" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:19:59.284109" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:19:59.282087" elapsed="0.002059"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:59.281840" elapsed="0.002336"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:59.284350" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:59.284201" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:59.281823" elapsed="0.002598"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:19:59.284989" 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-10-16T01:19:59.284574" elapsed="0.000442"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:19:59.285061" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:19:59.278500" elapsed="0.006679"/>
</kw>
<msg time="2026-10-16T01:19:59.285228" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:19:59.274353" elapsed="0.010921"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:59.289068" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:59.293023" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:59.296831" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:59.297042" elapsed="0.000020"/>
</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-10-16T01:19:59.297238" 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-10-16T01:19:59.297581" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:59.297440" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:59.297426" 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-10-16T01:19:59.297824" 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-10-16T01:19:59.298003" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:59.298182" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:19:59.297399" elapsed="0.000833"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:19:59.297308" elapsed="0.000948"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:59.298407" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:59.298475" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:19:59.298581" 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-10-16T01:19:59.273743" elapsed="0.024862"/>
</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-10-16T01:19:59.299730" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:59.299521" elapsed="0.000270">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:59.299875" 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-10-16T01:19:59.299195" elapsed="0.000703"/>
</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-10-16T01:19:59.300192" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:59.299961" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:19:59.300713" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:19:59.300430" elapsed="0.000309"/>
</kw>
<status status="PASS" start="2026-10-16T01:19:59.300269" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:59.299945" elapsed="0.000847"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:19:59.301316" 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-10-16T01:19:59.300951" elapsed="0.000390"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:19:59.301386" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:19:59.301512" 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-manganese/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-10-16T01:19:59.298882" elapsed="0.002654"/>
</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-10-16T01:19:59.302621" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:19:59.302431" elapsed="0.000249">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:19:59.302779" 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-10-16T01:19:59.302100" elapsed="0.000702"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:19:59.303000" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:19:59.302900" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-16T01:19:59.302882" elapsed="0.000197"/>
</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-10-16T01:19:59.303243" 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-10-16T01:19:59.303417" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:59.303477" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:19:59.303603" 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-manganese/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-10-16T01:19:59.301801" elapsed="0.001825"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:59.304877" 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-10-16T01:19:59.304624" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:19:59.305340" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:19:59.305104" elapsed="0.000276"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:19:59.309664" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:19:59.309734" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:19:59.309850" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:59.305661" elapsed="0.004563">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:59.305441" elapsed="0.004861">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:59.310483" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:59.310333" elapsed="0.000209"/>
</branch>
<status status="FAIL" start="2026-10-16T01:19:59.305424" elapsed="0.005141">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:19:59.310921" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:59.311043" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:19:59.311009" elapsed="0.000074"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:59.310993" elapsed="0.000110"/>
</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-10-16T01:19:59.311252" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:19:59.311315" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:19:59.303912" elapsed="0.007506">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:59.311487" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:19:59.266812" elapsed="0.044803">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:19:59.312029" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:59.311808" elapsed="0.000348"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:59.311759" elapsed="0.000440"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:19:59.312285" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:19:59.265275" elapsed="0.047179">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:19:59.262865" elapsed="0.049690">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:19:59.262838" elapsed="0.049790">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:59.312907" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:19:59.313271" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:59.313585" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:19:59.313956" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:19:59.314401" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:59.314734" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:19:59.315086" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:19:59.315336" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:19:59.258273" elapsed="0.057165">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:19:59.315501" elapsed="0.000014"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:19:59.257326" elapsed="0.058265">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:59.315835" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:59.315672" elapsed="0.000215"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:59.316049" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:59.315910" elapsed="0.000190"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:59.316393" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:59.316246" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:59.315656" elapsed="0.000807"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:19:59.257101" elapsed="0.059401">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:19:59.256862" elapsed="0.059694">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:59.316604" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:19:59.251410" elapsed="0.065285">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:59.316994" elapsed="0.000050"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:59.317269" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:19:59.317108" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:19:59.317092" elapsed="0.000247"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:59.317464" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:59.317633" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:19:59.317692" elapsed="0.000030"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:19:59.250423" elapsed="0.067385">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:19:59.250144" elapsed="0.067726">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:19:59.249974" elapsed="0.067946">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:19:59.249488" elapsed="0.068513">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:19:59.318226" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:19:59.170953" elapsed="0.147377">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:20:00.336628" elapsed="0.000441"/>
</kw>
<msg time="2026-10-16T01:20:00.337209" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:00.335357" elapsed="0.001968"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:20:00.334400" elapsed="0.003084"/>
</kw>
<msg time="2026-10-16T01:20:00.337575" 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-10-16T01:20:00.327909" elapsed="0.009758"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:20:00.327033" elapsed="0.010817"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:00.338912" 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-10-16T01:20:00.338361" elapsed="0.000645"/>
</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-10-16T01:20:00.346469" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:00.345484" elapsed="0.001045"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:00.347552" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:00.346901" elapsed="0.000706"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:00.347733" elapsed="0.000065"/>
</return>
<msg time="2026-10-16T01:20:00.348030" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:00.344639" elapsed="0.003442"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:20:00.348443" elapsed="0.000319"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:00.350036" 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-10-16T01:20:00.349153" elapsed="0.000939"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:00.351010" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:00.350457" elapsed="0.000607"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:00.351947" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:00.351403" elapsed="0.000598"/>
</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-10-16T01:20:00.360626" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:20:00.359034" elapsed="0.001747"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:20:00.360916" elapsed="0.000135"/>
</return>
<msg time="2026-10-16T01:20:00.361514" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:20:00.355697" elapsed="0.005946"/>
</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-10-16T01:20:00.388065" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:20:00.387608" elapsed="0.000495"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:20:00.389101" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:20:00.388803" elapsed="0.000415">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:00.389338" 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-10-16T01:20:00.388339" elapsed="0.001030"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:00.390058" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:00.389605" elapsed="0.000489"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:20:00.390496" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:20:00.390689" 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-10-16T01:20:00.390339" elapsed="0.000403"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:00.391337" 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-10-16T01:20:00.391011" elapsed="0.000395"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:00.392748" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:00.392402" elapsed="0.000405"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:20:00.393424" 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-10-16T01:20:00.393050" elapsed="0.000408"/>
</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-10-16T01:20:00.393872" elapsed="0.000030"/>
</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-10-16T01:20:00.394141" elapsed="0.000032"/>
</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-10-16T01:20:00.394393" elapsed="0.000027"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:20:00.393672" elapsed="0.000792"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:20:00.393519" elapsed="0.000985"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:20:00.394561" elapsed="0.000036"/>
</return>
<msg time="2026-10-16T01:20:00.394763" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:20:00.391909" elapsed="0.002887"/>
</kw>
<status status="PASS" start="2026-10-16T01:20:00.391523" elapsed="0.003314"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:00.395073" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:00.394873" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:00.391496" elapsed="0.003697"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:20:00.395973" 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-10-16T01:20:00.395409" elapsed="0.000674"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:20:00.396185" elapsed="0.000047"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:20:00.386892" elapsed="0.009457"/>
</kw>
<msg time="2026-10-16T01:20:00.396408" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:00.381164" elapsed="0.015297"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:00.400427" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:00.404458" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:00.408286" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:00.408467" elapsed="0.000019"/>
</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-10-16T01:20:00.408644" elapsed="0.000019"/>
</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-10-16T01:20:00.409001" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:00.408859" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:00.408845" 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-10-16T01:20:00.409243" 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-10-16T01:20:00.409430" 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-10-16T01:20:00.409591" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:20:00.408819" elapsed="0.000820"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:20:00.408726" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:00.409830" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:00.409899" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:20:00.410004" 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-10-16T01:20:00.380294" elapsed="0.029734"/>
</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-10-16T01:20:00.411200" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:00.410989" elapsed="0.000274">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:00.411346" 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-10-16T01:20:00.410646" elapsed="0.000723"/>
</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-10-16T01:20:00.411648" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:00.411432" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:20:00.412204" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:20:00.411914" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-10-16T01:20:00.411739" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:00.411416" elapsed="0.000865"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:00.412795" 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-10-16T01:20:00.412439" elapsed="0.000381"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:20:00.412866" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:20:00.412992" 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-manganese/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-10-16T01:20:00.410311" elapsed="0.002704"/>
</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-10-16T01:20:00.414102" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:00.413913" elapsed="0.000262">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:00.414259" 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-10-16T01:20:00.413579" elapsed="0.000702"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:20:00.414443" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:20:00.414345" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:00.414328" elapsed="0.000192"/>
</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-10-16T01:20:00.414671" elapsed="0.000019"/>
</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-10-16T01:20:00.414862" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:00.414924" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:20:00.415049" 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-manganese/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-10-16T01:20:00.413283" elapsed="0.001790"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:00.416340" 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-10-16T01:20:00.416093" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:00.416803" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:00.416567" elapsed="0.000277"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:20:00.421209" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:20:00.421264" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:20:00.421363" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:00.417146" elapsed="0.004600">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:00.416905" elapsed="0.004959">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:00.422046" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:00.421896" elapsed="0.000209"/>
</branch>
<status status="FAIL" start="2026-10-16T01:20:00.416887" elapsed="0.005253">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:00.422486" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:00.422607" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:00.422574" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:00.422558" elapsed="0.000109"/>
</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-10-16T01:20:00.422819" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:20:00.422883" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:20:00.415368" elapsed="0.007619">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:00.423059" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:20:00.370274" elapsed="0.052930">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:20:00.423595" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:00.423375" elapsed="0.000307"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:00.423327" elapsed="0.000423"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:00.423838" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:20:00.366679" elapsed="0.057327">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:00.362437" elapsed="0.061669">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:20:00.362391" elapsed="0.061805">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:00.424446" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:20:00.424810" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:00.425141" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:20:00.425494" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:20:00.425950" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:20:00.426281" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:20:00.426633" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:20:00.426898" elapsed="0.000019"/>
</return>
<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="FAIL" start="2026-10-16T01:20:00.354378" elapsed="0.072625">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:20:00.427097" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:20:00.352874" elapsed="0.074333">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:00.427429" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:00.427288" elapsed="0.000191"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:00.427641" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:00.427501" elapsed="0.000190"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:00.427878" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:00.427734" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:00.427272" elapsed="0.000675"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:20:00.352500" elapsed="0.075485">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:20:00.352097" elapsed="0.075942">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:00.428087" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:20:00.343273" elapsed="0.084930">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:00.428380" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:00.428599" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:00.428458" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:00.428442" elapsed="0.000226"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:00.428910" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:00.429084" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:00.429156" elapsed="0.000015"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:20:00.341624" elapsed="0.087627">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:20:00.341157" elapsed="0.088157">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:20:00.340277" elapsed="0.089087">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:20:00.339477" elapsed="0.089970">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:00.429659" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:20:00.319109" elapsed="0.110677">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:20:01.449048" elapsed="0.000444"/>
</kw>
<msg time="2026-10-16T01:20:01.449608" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:01.447623" elapsed="0.002294"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:20:01.446677" elapsed="0.003413"/>
</kw>
<msg time="2026-10-16T01:20:01.450209" 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-10-16T01:20:01.439620" elapsed="0.010684"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:20:01.438770" elapsed="0.011686"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:01.451528" 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-10-16T01:20:01.450976" elapsed="0.000646"/>
</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-10-16T01:20:01.458366" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:01.457522" elapsed="0.000902"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:01.459462" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:01.458793" elapsed="0.000725"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:01.459615" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:20:01.459942" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:01.456683" elapsed="0.003312"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:20:01.460360" elapsed="0.000289"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:01.461806" 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-10-16T01:20:01.461057" elapsed="0.000808"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:01.462773" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:01.462227" elapsed="0.000602"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:01.463677" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:01.463166" elapsed="0.000596"/>
</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-10-16T01:20:01.472689" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:20:01.471257" elapsed="0.001587"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:20:01.472972" elapsed="0.000136"/>
</return>
<msg time="2026-10-16T01:20:01.473572" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:20:01.467874" elapsed="0.005823"/>
</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-10-16T01:20:01.497034" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:20:01.496526" elapsed="0.000547"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:20:01.498155" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:20:01.497812" elapsed="0.000442">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:01.498375" 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-10-16T01:20:01.497317" elapsed="0.001090"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:01.499115" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:01.498645" elapsed="0.000531"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:20:01.499570" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:20:01.499892" 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-10-16T01:20:01.499408" elapsed="0.000518"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:01.500568" 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-10-16T01:20:01.500222" elapsed="0.000404"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:01.501746" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:01.501498" elapsed="0.000289"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:20:01.502432" 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-10-16T01:20:01.501966" elapsed="0.000491"/>
</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-10-16T01:20:01.502767" 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-10-16T01:20:01.502956" elapsed="0.000022"/>
</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-10-16T01:20:01.503265" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:20:01.502619" elapsed="0.000700"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:20:01.502504" elapsed="0.000844"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:20:01.503391" elapsed="0.000028"/>
</return>
<msg time="2026-10-16T01:20:01.503527" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:20:01.501121" elapsed="0.002431"/>
</kw>
<status status="PASS" start="2026-10-16T01:20:01.500741" elapsed="0.002840"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:01.503770" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:01.503607" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:01.500693" elapsed="0.003159"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:20:01.504437" 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-10-16T01:20:01.504014" elapsed="0.000449"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:20:01.504507" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:20:01.495800" elapsed="0.008806"/>
</kw>
<msg time="2026-10-16T01:20:01.504654" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:01.490034" elapsed="0.014682"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:01.508525" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:01.512464" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:01.516258" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:01.516468" elapsed="0.000020"/>
</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-10-16T01:20:01.516658" 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-10-16T01:20:01.517019" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:01.516875" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:01.516861" 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-10-16T01:20:01.517263" 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-10-16T01:20:01.517445" elapsed="0.000018"/>
</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-10-16T01:20:01.517605" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:20:01.516834" elapsed="0.000819"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:20:01.516743" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:01.517844" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:01.517911" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:20:01.518016" 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-10-16T01:20:01.489184" elapsed="0.028855"/>
</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-10-16T01:20:01.519203" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:01.518954" elapsed="0.000309">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:01.519357" 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-10-16T01:20:01.518617" 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-10-16T01:20:01.519658" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:01.519442" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:20:01.520207" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:20:01.519925" elapsed="0.000308"/>
</kw>
<status status="PASS" start="2026-10-16T01:20:01.519749" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:01.519425" elapsed="0.000860"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:01.520799" 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-10-16T01:20:01.520443" elapsed="0.000381"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:20:01.520868" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:20:01.520991" 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-manganese/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-10-16T01:20:01.518320" elapsed="0.002693"/>
</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-10-16T01:20:01.522102" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:01.521909" elapsed="0.000268">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:01.522260" 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-10-16T01:20:01.521576" elapsed="0.000707"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:20:01.522447" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:20:01.522348" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:01.522329" elapsed="0.000196"/>
</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-10-16T01:20:01.522676" 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-10-16T01:20:01.522905" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:01.522967" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:20:01.523098" 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-manganese/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-10-16T01:20:01.521278" elapsed="0.001844"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:01.526049" 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-10-16T01:20:01.525814" elapsed="0.000278"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:01.526519" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:01.526295" elapsed="0.000266"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:20:01.530669" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:20:01.530744" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:20:01.530859" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:01.526867" elapsed="0.004394">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:01.526623" elapsed="0.004716">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:01.531526" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:01.531370" elapsed="0.000215"/>
</branch>
<status status="FAIL" start="2026-10-16T01:20:01.526606" elapsed="0.005001">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:01.531962" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:01.532087" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:01.532051" elapsed="0.000074"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:01.532033" elapsed="0.000133"/>
</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-10-16T01:20:01.532302" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:20:01.532364" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:20:01.525021" elapsed="0.007444">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:01.532532" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:20:01.479382" elapsed="0.053291">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:20:01.533090" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:01.532869" elapsed="0.000325"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:01.532820" elapsed="0.000417"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:01.533322" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:20:01.477079" elapsed="0.056446">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:01.474425" elapsed="0.059203">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:20:01.474380" elapsed="0.059338">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:01.533976" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:20:01.534341" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:01.534661" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:20:01.535041" elapsed="0.000029"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:20:01.535519" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:20:01.535861" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:20:01.536238" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:20:01.536481" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:20:01.466211" elapsed="0.070372">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:20:01.536645" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:20:01.464642" elapsed="0.072113">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:01.536982" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:01.536836" elapsed="0.000196"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:01.537206" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:01.537054" elapsed="0.000203"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:01.537420" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:01.537279" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:01.536820" elapsed="0.000669"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:20:01.464301" elapsed="0.073225">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:20:01.463860" elapsed="0.073718">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:01.537626" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:20:01.455283" elapsed="0.082559">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:01.538019" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:01.538252" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:01.538097" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:01.538082" elapsed="0.000241"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:01.538483" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:01.538653" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:01.538727" elapsed="0.000015"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:20:01.453631" elapsed="0.085190">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:20:01.453172" elapsed="0.085711">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:20:01.452910" elapsed="0.086022">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:20:01.452106" elapsed="0.086908">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:01.539288" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:20:01.430594" elapsed="0.108800">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:20:02.560210" elapsed="0.000422"/>
</kw>
<msg time="2026-10-16T01:20:02.560780" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:02.558862" elapsed="0.002036"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:20:02.557851" elapsed="0.003208"/>
</kw>
<msg time="2026-10-16T01:20:02.561212" 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-10-16T01:20:02.549867" elapsed="0.011454"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:20:02.548986" elapsed="0.012507"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:02.562555" 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-10-16T01:20:02.562005" elapsed="0.000646"/>
</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-10-16T01:20:02.569431" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:02.568637" elapsed="0.000852"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:02.570531" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:02.569860" elapsed="0.000726"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:02.570682" elapsed="0.000096"/>
</return>
<msg time="2026-10-16T01:20:02.571012" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:02.567821" elapsed="0.003244"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:20:02.571422" elapsed="0.000323"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:02.572892" 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-10-16T01:20:02.572119" elapsed="0.000831"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:02.573856" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:02.573307" elapsed="0.000604"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:02.574920" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:02.574251" elapsed="0.000725"/>
</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-10-16T01:20:02.584163" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:20:02.582605" elapsed="0.001693"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:20:02.584449" elapsed="0.000141"/>
</return>
<msg time="2026-10-16T01:20:02.585224" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:20:02.579114" elapsed="0.006243"/>
</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-10-16T01:20:02.609219" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:20:02.608763" elapsed="0.000492"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:20:02.610270" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:20:02.609938" elapsed="0.000439">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:02.610494" 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-10-16T01:20:02.609473" elapsed="0.001053"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:02.611234" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:02.610783" elapsed="0.000487"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:20:02.611655" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:20:02.611877" 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-10-16T01:20:02.611498" elapsed="0.000413"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:02.612522" 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-10-16T01:20:02.612218" elapsed="0.000344"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:02.613598" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:02.613237" elapsed="0.000404"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:20:02.614094" 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-10-16T01:20:02.613833" 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-10-16T01:20:02.614416" 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-10-16T01:20:02.614596" 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-10-16T01:20:02.614792" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:20:02.614288" elapsed="0.000556"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:20:02.614178" elapsed="0.000693"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:20:02.614912" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:20:02.615041" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:20:02.612889" elapsed="0.002175"/>
</kw>
<status status="PASS" start="2026-10-16T01:20:02.612624" elapsed="0.002468"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:02.615277" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:02.615116" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:02.612607" elapsed="0.002743"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:20:02.615907" 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-10-16T01:20:02.615504" elapsed="0.000430"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:20:02.615978" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:20:02.607945" elapsed="0.008134"/>
</kw>
<msg time="2026-10-16T01:20:02.616207" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:02.602177" elapsed="0.014079"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:02.620070" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:02.623885" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:02.627661" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:02.627865" 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-10-16T01:20:02.628045" elapsed="0.000019"/>
</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-10-16T01:20:02.628491" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:02.628348" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:02.628334" 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-10-16T01:20:02.628732" 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-10-16T01:20:02.628909" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:02.629070" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:20:02.628307" elapsed="0.000817"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:20:02.628112" elapsed="0.001050"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:02.629312" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:02.629379" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:20:02.629484" 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-10-16T01:20:02.601269" elapsed="0.028239"/>
</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-10-16T01:20:02.630615" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:02.630421" elapsed="0.000254">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:02.630807" 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-10-16T01:20:02.630084" elapsed="0.000747"/>
</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-10-16T01:20:02.631112" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:02.630896" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:20:02.631635" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:20:02.631366" elapsed="0.000294"/>
</kw>
<status status="PASS" start="2026-10-16T01:20:02.631203" elapsed="0.000490"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:02.630879" elapsed="0.000852"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:02.632247" 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-10-16T01:20:02.631890" elapsed="0.000382"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:20:02.632318" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:20:02.632444" 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-manganese/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-10-16T01:20:02.629785" elapsed="0.002683"/>
</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-10-16T01:20:02.633548" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:02.633359" elapsed="0.000248">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:02.633691" 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-10-16T01:20:02.633024" elapsed="0.000707"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:20:02.633895" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:20:02.633796" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:02.633779" elapsed="0.000194"/>
</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-10-16T01:20:02.634124" elapsed="0.000033"/>
</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-10-16T01:20:02.634310" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:02.634371" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:20:02.634498" 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-manganese/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-10-16T01:20:02.632726" elapsed="0.001795"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:02.635958" 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-10-16T01:20:02.635728" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:02.636424" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:02.636201" elapsed="0.000264"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:20:02.640666" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:20:02.640739" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:20:02.640843" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:02.636767" elapsed="0.004441">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:02.636525" elapsed="0.004760">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:02.641465" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:02.641316" elapsed="0.000238"/>
</branch>
<status status="FAIL" start="2026-10-16T01:20:02.636508" elapsed="0.005071">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:02.641943" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:02.642066" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:02.642031" elapsed="0.000073"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:02.642015" elapsed="0.000110"/>
</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-10-16T01:20:02.642273" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:20:02.642337" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:20:02.634992" elapsed="0.007447">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:02.642507" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:20:02.591120" elapsed="0.051516">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:20:02.643049" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:02.642828" elapsed="0.000303"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:02.642780" elapsed="0.000409"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:02.643274" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:20:02.588834" elapsed="0.054606">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:02.585890" elapsed="0.057648">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:20:02.585847" elapsed="0.057766">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:02.643880" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:20:02.644243" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:02.644558" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:20:02.644929" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:20:02.645375" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:20:02.645689" elapsed="0.000038"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:20:02.646059" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:20:02.646311" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:20:02.577774" elapsed="0.068639">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:20:02.646477" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:20:02.575853" elapsed="0.070714">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:02.646847" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:02.646682" elapsed="0.000217"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:02.647061" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:02.646923" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:02.647297" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:02.647134" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:02.646664" elapsed="0.000704"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:20:02.575483" elapsed="0.071924">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:20:02.575075" elapsed="0.072386">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:02.647511" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:20:02.566390" elapsed="0.081213">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:02.647907" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:02.648132" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:02.647989" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:02.647974" elapsed="0.000242"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:02.648344" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:02.648514" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:02.648574" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:20:02.564683" elapsed="0.083984">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:20:02.564218" elapsed="0.084529">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:20:02.563931" elapsed="0.084876">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:20:02.563132" elapsed="0.085760">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:02.649107" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:20:02.540207" elapsed="0.109019">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:20:03.668637" elapsed="0.000434"/>
</kw>
<msg time="2026-10-16T01:20:03.669211" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:03.667364" elapsed="0.001967"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:20:03.666421" elapsed="0.003066"/>
</kw>
<msg time="2026-10-16T01:20:03.669683" 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-10-16T01:20:03.659574" elapsed="0.010236"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:20:03.658583" elapsed="0.011380"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:03.671237" 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-10-16T01:20:03.670549" elapsed="0.000804"/>
</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-10-16T01:20:03.678022" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:03.677254" elapsed="0.000827"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:03.679204" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:03.678487" elapsed="0.000774"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:03.679363" elapsed="0.000064"/>
</return>
<msg time="2026-10-16T01:20:03.679657" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:03.676416" elapsed="0.003327"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:20:03.680077" elapsed="0.000310"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:03.681468" 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-10-16T01:20:03.680781" elapsed="0.000743"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:03.682411" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:03.681879" elapsed="0.000585"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:03.683334" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:03.682803" elapsed="0.000585"/>
</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-10-16T01:20:03.692396" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:20:03.690910" elapsed="0.001595"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:20:03.692633" elapsed="0.000197"/>
</return>
<msg time="2026-10-16T01:20:03.693316" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:20:03.687502" elapsed="0.005951"/>
</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-10-16T01:20:03.717461" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:20:03.717011" elapsed="0.000486"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:20:03.718489" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:20:03.718195" elapsed="0.000396">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:03.718728" 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-10-16T01:20:03.717732" elapsed="0.001030"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:03.719451" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:03.718998" elapsed="0.000488"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:20:03.719992" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:20:03.720243" 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-10-16T01:20:03.719815" elapsed="0.000463"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:03.720939" 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-10-16T01:20:03.720549" elapsed="0.000449"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:03.722474" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:03.722132" elapsed="0.000399"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:20:03.723167" 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-10-16T01:20:03.722795" elapsed="0.000405"/>
</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-10-16T01:20:03.723482" elapsed="0.000020"/>
</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-10-16T01:20:03.723662" elapsed="0.000022"/>
</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-10-16T01:20:03.723874" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:20:03.723354" elapsed="0.000573"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:20:03.723243" elapsed="0.000713"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:20:03.723997" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:20:03.724127" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:20:03.721636" elapsed="0.002527"/>
</kw>
<status status="PASS" start="2026-10-16T01:20:03.721086" elapsed="0.003107"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:03.724362" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:03.724219" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:03.721061" elapsed="0.003370"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:20:03.724991" 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-10-16T01:20:03.724586" elapsed="0.000430"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:20:03.725060" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:20:03.716297" elapsed="0.008875"/>
</kw>
<msg time="2026-10-16T01:20:03.725220" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:03.710659" elapsed="0.014608"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:03.729060" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:03.732851" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:03.736634" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:03.736823" elapsed="0.000020"/>
</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-10-16T01:20:03.737001" elapsed="0.000019"/>
</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-10-16T01:20:03.737393" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:03.737215" elapsed="0.000232"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:03.737201" 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-10-16T01:20:03.737621" elapsed="0.000019"/>
</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-10-16T01:20:03.737813" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:03.737976" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:20:03.737173" elapsed="0.000851"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:20:03.737068" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:03.738210" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:03.738279" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:20:03.738383" 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-10-16T01:20:03.709814" elapsed="0.028593"/>
</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-10-16T01:20:03.739514" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:03.739319" elapsed="0.000256">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:03.739659" 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-10-16T01:20:03.738984" elapsed="0.000697"/>
</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-10-16T01:20:03.739980" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:03.739761" elapsed="0.000271"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:20:03.740509" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:20:03.740242" elapsed="0.000292"/>
</kw>
<status status="PASS" start="2026-10-16T01:20:03.740055" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:03.739743" elapsed="0.000843"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:03.741096" 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-10-16T01:20:03.740758" elapsed="0.000362"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:20:03.741180" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:20:03.741304" 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-manganese/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-10-16T01:20:03.738669" elapsed="0.002658"/>
</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-10-16T01:20:03.742444" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:03.742234" elapsed="0.000269">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:03.742585" 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-10-16T01:20:03.741883" elapsed="0.000725"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:20:03.742951" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:20:03.742847" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:03.742654" elapsed="0.000376"/>
</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-10-16T01:20:03.743197" 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-10-16T01:20:03.743371" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:03.743431" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:20:03.743556" 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-manganese/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-10-16T01:20:03.741571" elapsed="0.002040"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:03.744858" 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-10-16T01:20:03.744617" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:03.745318" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:03.745084" elapsed="0.000274"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:20:03.749573" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:20:03.749626" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:20:03.749752" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:03.745641" elapsed="0.004475">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:03.745418" elapsed="0.004794">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:03.750392" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:03.750243" elapsed="0.000206"/>
</branch>
<status status="FAIL" start="2026-10-16T01:20:03.745401" elapsed="0.005070">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:03.750825" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:03.750946" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:03.750912" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:03.750896" elapsed="0.000108"/>
</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-10-16T01:20:03.751139" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:20:03.751216" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:20:03.743906" elapsed="0.007412">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:03.751384" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:20:03.700043" elapsed="0.051473">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:20:03.751949" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:03.751683" elapsed="0.000351"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:03.751636" elapsed="0.000443"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:03.752180" elapsed="0.000037"/>
</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="FAIL" start="2026-10-16T01:20:03.697851" elapsed="0.054501">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:03.694215" elapsed="0.058276">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:20:03.694139" elapsed="0.058429">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:03.752858" elapsed="0.000025"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:20:03.753230" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:03.753549" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:20:03.753927" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:20:03.754378" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:20:03.754717" elapsed="0.000029"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:20:03.755088" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:20:03.755349" elapsed="0.000019"/>
</return>
<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="FAIL" start="2026-10-16T01:20:03.686095" elapsed="0.069359">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:20:03.755518" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:20:03.684242" elapsed="0.071369">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:03.755874" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:03.755694" elapsed="0.000233"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:03.756089" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:03.755950" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:03.756322" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:03.756176" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:03.755678" elapsed="0.000715"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:20:03.683887" elapsed="0.072546">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:20:03.683486" elapsed="0.073004">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:03.756541" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:20:03.675046" elapsed="0.081587">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:03.756844" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:03.757070" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:03.756927" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:03.756911" elapsed="0.000228"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:03.757286" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:03.757458" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:03.757518" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:20:03.673444" elapsed="0.084209">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:20:03.672969" elapsed="0.084890">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:20:03.672661" elapsed="0.085260">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:20:03.671876" elapsed="0.086132">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:03.758244" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:20:03.650043" elapsed="0.108310">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:20:04.778192" elapsed="0.000413"/>
</kw>
<msg time="2026-10-16T01:20:04.778754" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:04.776909" elapsed="0.001969"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:20:04.775969" elapsed="0.003067"/>
</kw>
<msg time="2026-10-16T01:20:04.779126" 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-10-16T01:20:04.768905" elapsed="0.010337"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:20:04.768009" elapsed="0.011383"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:04.780486" 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-10-16T01:20:04.779947" elapsed="0.000631"/>
</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-10-16T01:20:04.787225" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:04.786433" elapsed="0.000851"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:04.788274" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:04.787616" elapsed="0.000713"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:04.788427" elapsed="0.000063"/>
</return>
<msg time="2026-10-16T01:20:04.788749" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:04.785595" elapsed="0.003207"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:20:04.789132" elapsed="0.000314"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:04.790530" 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-10-16T01:20:04.789840" elapsed="0.000746"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:04.791474" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:04.790944" elapsed="0.000584"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:04.792405" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:04.791878" elapsed="0.000579"/>
</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-10-16T01:20:04.801596" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:20:04.800067" elapsed="0.001802"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:20:04.802020" elapsed="0.000169"/>
</return>
<msg time="2026-10-16T01:20:04.802688" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:20:04.796591" elapsed="0.006499"/>
</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-10-16T01:20:04.827008" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:20:04.826530" elapsed="0.000518"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:20:04.828065" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:20:04.827761" elapsed="0.000433">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:04.828316" 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-10-16T01:20:04.827292" elapsed="0.001057"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:04.829046" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:04.828585" elapsed="0.000497"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:20:04.829512" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:20:04.829733" 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-10-16T01:20:04.829349" elapsed="0.000419"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:04.830366" 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-10-16T01:20:04.830035" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:04.831757" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:04.831507" elapsed="0.000292"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:20:04.832250" 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-10-16T01:20:04.831973" 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-10-16T01:20:04.832573" 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-10-16T01:20:04.832772" 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-10-16T01:20:04.832951" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:20:04.832443" elapsed="0.000559"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:20:04.832324" elapsed="0.000708"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:20:04.833075" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:20:04.833232" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:20:04.831129" elapsed="0.002127"/>
</kw>
<status status="PASS" start="2026-10-16T01:20:04.830519" elapsed="0.002766"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:04.833453" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:04.833310" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:04.830491" elapsed="0.003032"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:20:04.834078" 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-10-16T01:20:04.833674" elapsed="0.000429"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:20:04.834147" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:20:04.825757" elapsed="0.008507"/>
</kw>
<msg time="2026-10-16T01:20:04.834362" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:04.819899" elapsed="0.014512"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:04.838901" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:04.843141" elapsed="0.000048"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:04.847104" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:04.847307" 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-10-16T01:20:04.847486" elapsed="0.000019"/>
</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-10-16T01:20:04.847903" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:04.847739" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:04.847693" elapsed="0.000289"/>
</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-10-16T01:20:04.848137" elapsed="0.000034"/>
</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-10-16T01:20:04.848332" elapsed="0.000018"/>
</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-10-16T01:20:04.848494" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:20:04.847662" elapsed="0.000881"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:20:04.847556" elapsed="0.001011"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:04.848747" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:04.848823" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:20:04.848935" 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-10-16T01:20:04.819037" elapsed="0.029923"/>
</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-10-16T01:20:04.850129" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:04.849899" elapsed="0.000314">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:04.850299" 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-10-16T01:20:04.849554" elapsed="0.000768"/>
</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-10-16T01:20:04.850609" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:04.850387" elapsed="0.000327"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:20:04.851243" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:20:04.850941" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-10-16T01:20:04.850742" elapsed="0.000590"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:04.850370" elapsed="0.000986"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:04.851957" 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-10-16T01:20:04.851531" elapsed="0.000451"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:20:04.852030" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:20:04.852176" 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-manganese/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-10-16T01:20:04.849249" elapsed="0.002958"/>
</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-10-16T01:20:04.853395" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:04.853180" elapsed="0.000279">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:04.853545" 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-10-16T01:20:04.852781" elapsed="0.000788"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:20:04.855640" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-10-16T01:20:04.855517" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:04.853617" elapsed="0.002131"/>
</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-10-16T01:20:04.855922" elapsed="0.000027"/>
</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-10-16T01:20:04.856119" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:04.856198" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:20:04.856328" 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-manganese/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-10-16T01:20:04.852462" elapsed="0.003890"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:04.857602" 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-10-16T01:20:04.857375" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:04.858065" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:04.857846" elapsed="0.000259"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:20:04.862673" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:20:04.862765" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:20:04.862885" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:04.858415" elapsed="0.004957">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:04.858181" elapsed="0.005278">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:04.863662" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:04.863495" elapsed="0.000247"/>
</branch>
<status status="FAIL" start="2026-10-16T01:20:04.858148" elapsed="0.005617">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:04.864109" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:04.864292" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:04.864257" elapsed="0.000073"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:04.864238" 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-10-16T01:20:04.864490" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:20:04.864555" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:20:04.856647" elapsed="0.008013">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:04.864748" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:20:04.809343" elapsed="0.055560">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:20:04.865320" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:04.865079" elapsed="0.000327"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:04.865028" elapsed="0.000422"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:04.865532" elapsed="0.000037"/>
</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="FAIL" start="2026-10-16T01:20:04.807083" elapsed="0.058643">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:04.803616" elapsed="0.062246">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:20:04.803571" elapsed="0.062368">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:04.866215" elapsed="0.000025"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:20:04.866571" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:04.866915" elapsed="0.000022"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:20:04.867297" elapsed="0.000024"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:20:04.867803" elapsed="0.000026"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:20:04.868138" elapsed="0.000038"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:20:04.868511" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:20:04.868800" elapsed="0.000020"/>
</return>
<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="FAIL" start="2026-10-16T01:20:04.795231" elapsed="0.073676">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:20:04.868971" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:20:04.793363" elapsed="0.075698">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:04.869301" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:04.869143" elapsed="0.000210"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:04.869548" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:04.869375" elapsed="0.000225"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:04.869800" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:04.869624" elapsed="0.000251"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:04.869127" elapsed="0.000781"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:20:04.792999" elapsed="0.076953">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:20:04.792553" elapsed="0.077456">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:04.870061" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:20:04.784240" elapsed="0.085948">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:04.870413" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:04.870697" elapsed="0.000116"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:04.870519" elapsed="0.000330"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:04.870500" elapsed="0.000376"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:04.871034" elapsed="0.000022"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:04.871262" elapsed="0.000025"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:04.871330" elapsed="0.000015"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:20:04.782575" elapsed="0.088854">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:20:04.782104" elapsed="0.089391">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:20:04.781854" elapsed="0.089700">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:20:04.781054" elapsed="0.090609">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:04.871965" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:20:04.759213" elapsed="0.112862">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:20:05.899148" elapsed="0.000435"/>
</kw>
<msg time="2026-10-16T01:20:05.899737" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:05.897831" elapsed="0.002034"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:20:05.896797" elapsed="0.003233"/>
</kw>
<msg time="2026-10-16T01:20:05.900122" 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-10-16T01:20:05.889255" elapsed="0.010983"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:20:05.887782" elapsed="0.012632"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:05.901605" 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-10-16T01:20:05.901052" elapsed="0.000677"/>
</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-10-16T01:20:05.908579" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:05.907649" elapsed="0.000990"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:05.909648" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:05.909008" elapsed="0.000734"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:05.909866" elapsed="0.000068"/>
</return>
<msg time="2026-10-16T01:20:05.910201" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:05.906838" elapsed="0.003418"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:20:05.910590" elapsed="0.000325"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:05.912023" 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-10-16T01:20:05.911307" elapsed="0.000772"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:05.913037" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:05.912458" elapsed="0.000634"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:05.914015" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:05.913459" elapsed="0.000610"/>
</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-10-16T01:20:05.921751" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:20:05.920887" elapsed="0.000949"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:20:05.921920" elapsed="0.000088"/>
</return>
<msg time="2026-10-16T01:20:05.922310" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:20:05.918373" elapsed="0.004021"/>
</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-10-16T01:20:05.945222" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:20:05.944886" elapsed="0.000366"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:20:05.945982" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:20:05.945753" elapsed="0.000300">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:05.946140" 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-10-16T01:20:05.945414" elapsed="0.000764"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:05.946678" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:05.946356" elapsed="0.000363"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:20:05.947007" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:20:05.947159" 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-10-16T01:20:05.946886" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:05.947624" 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-10-16T01:20:05.947394" elapsed="0.000272"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:05.948607" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:05.948373" elapsed="0.000276"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:20:05.949361" 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-10-16T01:20:05.948838" elapsed="0.000550"/>
</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-10-16T01:20:05.949692" elapsed="0.000037"/>
</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-10-16T01:20:05.949896" 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-10-16T01:20:05.950078" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:20:05.949555" elapsed="0.000576"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:20:05.949436" elapsed="0.000723"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:20:05.950218" elapsed="0.000030"/>
</return>
<msg time="2026-10-16T01:20:05.950356" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:20:05.948019" elapsed="0.002361"/>
</kw>
<status status="PASS" start="2026-10-16T01:20:05.947753" elapsed="0.002656"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:05.950578" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:05.950433" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:05.947731" elapsed="0.002917"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:20:05.951230" 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-10-16T01:20:05.950818" elapsed="0.000438"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:20:05.951300" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:20:05.944236" elapsed="0.007166"/>
</kw>
<msg time="2026-10-16T01:20:05.951450" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:05.938444" elapsed="0.013054"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:05.955449" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:05.959271" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:05.965839" elapsed="0.000081"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:05.966192" 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-10-16T01:20:05.966394" 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-10-16T01:20:05.966850" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:05.966680" elapsed="0.000223"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:05.966663" 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-10-16T01:20:05.967088" 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-10-16T01:20:05.967276" 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-10-16T01:20:05.967539" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:20:05.966623" elapsed="0.000967"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:20:05.966476" elapsed="0.001141"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:05.967787" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:05.967865" elapsed="0.000017"/>
</return>
<msg time="2026-10-16T01:20:05.968030" 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-10-16T01:20:05.937564" elapsed="0.030494"/>
</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-10-16T01:20:05.969466" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:05.969193" elapsed="0.000352">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:05.969632" 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-10-16T01:20:05.968768" elapsed="0.000887"/>
</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-10-16T01:20:05.969979" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:05.969736" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:20:05.970517" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:20:05.970246" elapsed="0.000297"/>
</kw>
<status status="PASS" start="2026-10-16T01:20:05.970054" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:05.969718" elapsed="0.000878"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:05.971117" 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-10-16T01:20:05.970769" elapsed="0.000372"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:20:05.971199" elapsed="0.000031"/>
</return>
<msg time="2026-10-16T01:20:05.971331" 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-manganese/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-10-16T01:20:05.968394" elapsed="0.002960"/>
</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-10-16T01:20:05.972440" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:05.972251" elapsed="0.000248">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:05.972582" 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-10-16T01:20:05.971920" elapsed="0.000685"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:20:05.972789" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:20:05.972670" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:05.972653" elapsed="0.000216"/>
</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-10-16T01:20:05.973020" elapsed="0.000020"/>
</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-10-16T01:20:05.973207" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:05.973270" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:20:05.973395" 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-manganese/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-10-16T01:20:05.971603" elapsed="0.001815"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:05.974939" 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-10-16T01:20:05.974685" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:05.975446" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:05.975221" elapsed="0.000266"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:20:05.979969" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:20:05.980022" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:20:05.980119" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:05.975803" elapsed="0.004721">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:05.975548" elapsed="0.005055">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:05.980804" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:05.980633" elapsed="0.000231"/>
</branch>
<status status="FAIL" start="2026-10-16T01:20:05.975531" elapsed="0.005355">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:05.981250" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:05.981371" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:05.981338" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:05.981322" elapsed="0.000108"/>
</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-10-16T01:20:05.981567" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:20:05.981629" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:20:05.973957" elapsed="0.007792">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:05.981820" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:20:05.927676" elapsed="0.054302">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:20:05.982403" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:05.982158" elapsed="0.000329"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:05.982106" elapsed="0.000424"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:05.982616" elapsed="0.000038"/>
</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="FAIL" start="2026-10-16T01:20:05.925384" elapsed="0.057430">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:05.922692" elapsed="0.060229">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:20:05.922663" elapsed="0.060334">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:05.983273" elapsed="0.000027"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:20:05.983798" elapsed="0.000023"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:05.984122" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:20:05.984500" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:20:05.984963" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:20:05.985301" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:20:05.985664" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:20:05.985942" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:20:05.916893" elapsed="0.069156">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:20:05.986114" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:20:05.914948" elapsed="0.071272">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:05.986455" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:05.986307" elapsed="0.000199"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:05.986667" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:05.986529" elapsed="0.000211"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:05.986908" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:05.986763" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:05.986289" elapsed="0.000688"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:20:05.914579" elapsed="0.072437">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:20:05.914188" elapsed="0.072882">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:05.987122" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:20:05.905441" elapsed="0.081788">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:05.987409" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:05.987630" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:05.987488" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:05.987472" elapsed="0.000341"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:05.987948" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:05.988118" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:05.988191" elapsed="0.000015"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:20:05.903785" elapsed="0.084503">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:20:05.903271" elapsed="0.085082">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:20:05.902992" elapsed="0.085448">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:20:05.902204" elapsed="0.086325">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:05.988766" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:20:05.873147" elapsed="0.115727">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:20:07.007981" elapsed="0.000443"/>
</kw>
<msg time="2026-10-16T01:20:07.008545" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:07.006682" elapsed="0.001986"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:20:07.005776" elapsed="0.003091"/>
</kw>
<msg time="2026-10-16T01:20:07.008961" 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-10-16T01:20:06.999227" elapsed="0.009826"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:20:06.998330" elapsed="0.010898"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:07.010290" 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-10-16T01:20:07.009741" elapsed="0.000642"/>
</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-10-16T01:20:07.017014" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:07.016244" elapsed="0.000828"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:07.018088" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:07.017447" elapsed="0.000695"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:07.018264" elapsed="0.000065"/>
</return>
<msg time="2026-10-16T01:20:07.018559" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:07.015415" elapsed="0.003194"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:20:07.018970" elapsed="0.000309"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:07.020368" 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-10-16T01:20:07.019644" elapsed="0.000779"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:07.021306" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:07.020777" elapsed="0.000583"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:07.022230" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:07.021666" elapsed="0.000617"/>
</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-10-16T01:20:07.030989" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:20:07.029577" elapsed="0.001522"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:20:07.031251" elapsed="0.000134"/>
</return>
<msg time="2026-10-16T01:20:07.031985" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:20:07.026327" elapsed="0.005784"/>
</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-10-16T01:20:07.055622" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:20:07.055196" elapsed="0.000463"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:20:07.056664" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:20:07.056366" elapsed="0.000424">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:07.056911" 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-10-16T01:20:07.055904" elapsed="0.001039"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:07.057628" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:07.057195" elapsed="0.000468"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:20:07.058072" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:20:07.058287" 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-10-16T01:20:07.057915" elapsed="0.000406"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:07.058919" 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-10-16T01:20:07.058585" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:07.060555" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:07.059980" elapsed="0.000642"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:20:07.061112" 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-10-16T01:20:07.060850" 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-10-16T01:20:07.061550" 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-10-16T01:20:07.061751" 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-10-16T01:20:07.061933" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:20:07.061420" elapsed="0.000564"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:20:07.061307" elapsed="0.000707"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:20:07.062057" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:20:07.062209" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:20:07.059489" elapsed="0.002745"/>
</kw>
<status status="PASS" start="2026-10-16T01:20:07.059061" elapsed="0.003202"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:07.062437" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:07.062290" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:07.059037" elapsed="0.003470"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:20:07.063074" 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-10-16T01:20:07.062663" elapsed="0.000437"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:20:07.063144" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:20:07.054465" elapsed="0.008795"/>
</kw>
<msg time="2026-10-16T01:20:07.063308" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:07.048749" elapsed="0.014606"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:07.067191" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:07.071064" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:07.074867" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:07.075044" elapsed="0.000020"/>
</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-10-16T01:20:07.075238" 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-10-16T01:20:07.075580" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:07.075438" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:07.075425" elapsed="0.000228"/>
</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-10-16T01:20:07.075821" 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-10-16T01:20:07.076001" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:07.076163" elapsed="0.000032"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:20:07.075398" elapsed="0.000829"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:20:07.075308" elapsed="0.000943"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:07.076404" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:07.076473" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:20:07.076577" 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-10-16T01:20:07.047882" elapsed="0.028718"/>
</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-10-16T01:20:07.077719" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:07.077511" elapsed="0.000269">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:07.077863" 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-10-16T01:20:07.077189" elapsed="0.000697"/>
</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-10-16T01:20:07.078166" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:07.077948" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:20:07.078679" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:20:07.078415" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-16T01:20:07.078255" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:07.077931" elapsed="0.000840"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:07.079283" 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-10-16T01:20:07.078931" elapsed="0.000410"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:20:07.079389" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:20:07.079515" 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-manganese/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-10-16T01:20:07.076878" elapsed="0.002660"/>
</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-10-16T01:20:07.080713" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:07.080508" elapsed="0.000266">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:07.080859" 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-10-16T01:20:07.080187" elapsed="0.000695"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:20:07.081045" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:20:07.080946" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:07.080929" elapsed="0.000194"/>
</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-10-16T01:20:07.081288" 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-10-16T01:20:07.081462" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:07.081522" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:20:07.081651" 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-manganese/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-10-16T01:20:07.079872" elapsed="0.001811"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:07.083154" 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-10-16T01:20:07.082921" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:07.083618" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:07.083398" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:20:07.088155" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:20:07.088228" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:20:07.088331" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:07.083958" elapsed="0.004768">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:07.083734" elapsed="0.005074">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:07.088991" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:07.088839" elapsed="0.000210"/>
</branch>
<status status="FAIL" start="2026-10-16T01:20:07.083716" elapsed="0.005355">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:07.089427" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:07.089547" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:07.089514" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:07.089498" elapsed="0.000107"/>
</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-10-16T01:20:07.089762" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:20:07.089868" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:20:07.082186" elapsed="0.007788">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:07.090040" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:20:07.038143" elapsed="0.052045">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:20:07.090591" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:07.090365" elapsed="0.000309"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:07.090315" elapsed="0.000426"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:07.090830" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:20:07.035910" elapsed="0.055087">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:07.032602" elapsed="0.058495">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:20:07.032555" elapsed="0.058629">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:07.091440" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:20:07.091814" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:07.092130" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:20:07.092505" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:20:07.092966" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:20:07.093300" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:20:07.093654" elapsed="0.000019"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:20:07.093926" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:20:07.024985" elapsed="0.069044">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:20:07.094091" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:20:07.023123" elapsed="0.071070">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:07.094418" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:07.094276" elapsed="0.000193"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:07.094628" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:07.094492" elapsed="0.000184"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:07.094866" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:07.094720" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:07.094260" elapsed="0.000705"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:20:07.022793" elapsed="0.072214">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:20:07.022379" elapsed="0.072685">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:07.095116" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:20:07.014035" elapsed="0.081186">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:07.095402" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:07.095622" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:07.095482" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:07.095466" elapsed="0.000224"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:07.095962" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:07.096134" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:07.096259" elapsed="0.000015"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:20:07.012420" elapsed="0.083935">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:20:07.011945" elapsed="0.084476">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:20:07.011650" elapsed="0.084820">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:20:07.010863" elapsed="0.085690">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:07.096785" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:20:06.989672" elapsed="0.107221">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:20:08.115945" elapsed="0.000415"/>
</kw>
<msg time="2026-10-16T01:20:08.116459" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:08.114671" elapsed="0.001894"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:20:08.113764" elapsed="0.002982"/>
</kw>
<msg time="2026-10-16T01:20:08.116838" 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-10-16T01:20:08.107198" elapsed="0.009730"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:20:08.106272" elapsed="0.010807"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:08.118111" 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-10-16T01:20:08.117570" elapsed="0.000656"/>
</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-10-16T01:20:08.125069" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:08.124306" elapsed="0.000821"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:08.126128" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:08.125488" elapsed="0.000714"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:08.126298" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:20:08.126582" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:08.123466" elapsed="0.003167"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:20:08.126996" elapsed="0.000311"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:08.128401" 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-10-16T01:20:08.127678" elapsed="0.000779"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:08.129348" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:08.128819" elapsed="0.000582"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:08.130266" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:08.129740" elapsed="0.000580"/>
</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-10-16T01:20:08.139108" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:20:08.137636" elapsed="0.001604"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:20:08.139368" elapsed="0.000134"/>
</return>
<msg time="2026-10-16T01:20:08.140099" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:20:08.134295" elapsed="0.005954"/>
</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-10-16T01:20:08.164140" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:20:08.163673" elapsed="0.000525"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:20:08.165233" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:20:08.164922" elapsed="0.000407">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:08.165448" 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-10-16T01:20:08.164423" elapsed="0.001058"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:08.166244" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:08.165771" elapsed="0.000511"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:20:08.166727" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:20:08.166926" 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-10-16T01:20:08.166523" elapsed="0.000438"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:08.167608" 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-10-16T01:20:08.167274" elapsed="0.000404"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:08.168991" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:08.168755" elapsed="0.000277"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:20:08.169488" 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-10-16T01:20:08.169230" elapsed="0.000282"/>
</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-10-16T01:20:08.169812" 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-10-16T01:20:08.169995" elapsed="0.000022"/>
</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-10-16T01:20:08.170234" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:20:08.169665" elapsed="0.000623"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:20:08.169556" elapsed="0.000760"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:20:08.170357" elapsed="0.000029"/>
</return>
<msg time="2026-10-16T01:20:08.170492" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:20:08.168335" elapsed="0.002180"/>
</kw>
<status status="PASS" start="2026-10-16T01:20:08.167953" elapsed="0.002591"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:08.170725" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:08.170567" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:08.167765" elapsed="0.003033"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:20:08.171390" 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-10-16T01:20:08.170971" elapsed="0.000445"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:20:08.171462" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:20:08.162836" elapsed="0.008727"/>
</kw>
<msg time="2026-10-16T01:20:08.171620" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:08.157098" elapsed="0.014573"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:08.175476" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:08.179356" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:08.183136" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:08.183326" 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-10-16T01:20:08.183541" elapsed="0.000019"/>
</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-10-16T01:20:08.183906" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:08.183766" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:08.183751" elapsed="0.000229"/>
</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-10-16T01:20:08.184130" elapsed="0.000019"/>
</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-10-16T01:20:08.184321" 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-10-16T01:20:08.184517" elapsed="0.000023"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:20:08.183722" elapsed="0.000851"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:20:08.183607" elapsed="0.001023"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:08.184799" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:08.184868" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:20:08.184971" 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-10-16T01:20:08.156219" elapsed="0.028776"/>
</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-10-16T01:20:08.186097" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:08.185906" elapsed="0.000250">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:08.186255" 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-10-16T01:20:08.185564" elapsed="0.000714"/>
</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-10-16T01:20:08.186563" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:08.186341" elapsed="0.000274"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:20:08.187074" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:20:08.186812" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-16T01:20:08.186638" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:08.186324" elapsed="0.000826"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:08.187655" 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-10-16T01:20:08.187321" elapsed="0.000358"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:20:08.187741" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:20:08.187865" 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-manganese/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-10-16T01:20:08.185268" elapsed="0.002620"/>
</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-10-16T01:20:08.190601" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:08.188778" elapsed="0.001884">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:08.190764" 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-10-16T01:20:08.188444" elapsed="0.002344"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:20:08.190952" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:20:08.190853" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:08.190836" elapsed="0.000193"/>
</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-10-16T01:20:08.191194" 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-10-16T01:20:08.191369" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:08.191429" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:20:08.191554" 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-manganese/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-10-16T01:20:08.188129" elapsed="0.003448"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:08.192823" 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-10-16T01:20:08.192573" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:08.193286" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:08.193052" elapsed="0.000274"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:20:08.197910" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:20:08.197994" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:20:08.198101" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:08.193607" elapsed="0.004861">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:08.193386" elapsed="0.005159">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:08.198741" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:08.198575" elapsed="0.000225"/>
</branch>
<status status="FAIL" start="2026-10-16T01:20:08.193370" elapsed="0.005453">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:08.199154" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:08.199291" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:08.199258" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:08.199242" elapsed="0.000107"/>
</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-10-16T01:20:08.199489" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:20:08.199551" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:20:08.191867" elapsed="0.007784">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:08.199793" elapsed="0.000020"/>
</return>
<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="FAIL" start="2026-10-16T01:20:08.146364" elapsed="0.053574">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:20:08.200343" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:08.200108" elapsed="0.000318"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:08.200060" elapsed="0.000407"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:08.200553" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:20:08.144166" elapsed="0.056576">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:08.140759" elapsed="0.060087">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:20:08.140658" elapsed="0.060262">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:08.201167" elapsed="0.000038"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:20:08.201532" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:08.201863" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:20:08.202229" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:20:08.202697" elapsed="0.000046"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:20:08.203038" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:20:08.203401" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:20:08.203644" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:20:08.132961" elapsed="0.070821">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:20:08.203844" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:20:08.131153" elapsed="0.072780">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:08.204154" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:08.204014" elapsed="0.000207"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:08.204382" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:08.204243" elapsed="0.000188"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:08.204593" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:08.204452" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:08.203998" elapsed="0.000664"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:20:08.130819" elapsed="0.073902">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:20:08.130415" elapsed="0.074362">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:08.204826" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:20:08.121992" elapsed="0.082923">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:08.205089" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:08.205320" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:08.205167" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:08.205152" elapsed="0.000237"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:08.205513" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:08.205680" elapsed="0.000128"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:08.205853" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:20:08.120247" elapsed="0.085698">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:20:08.119782" elapsed="0.086224">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:20:08.119471" elapsed="0.086583">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:20:08.118667" elapsed="0.087466">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:08.206390" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:20:08.097816" elapsed="0.108679">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:20:09.225069" elapsed="0.000419"/>
</kw>
<msg time="2026-10-16T01:20:09.225591" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:09.223675" elapsed="0.002076"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:20:09.222742" elapsed="0.003175"/>
</kw>
<msg time="2026-10-16T01:20:09.226009" 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-10-16T01:20:09.216229" elapsed="0.009871"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:20:09.215365" elapsed="0.010908"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:09.227305" 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-10-16T01:20:09.226763" elapsed="0.000635"/>
</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-10-16T01:20:09.233925" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:09.233138" elapsed="0.000845"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:09.234983" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:09.234338" elapsed="0.000699"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:09.235130" elapsed="0.000084"/>
</return>
<msg time="2026-10-16T01:20:09.235444" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:09.232321" elapsed="0.003175"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:20:09.235855" elapsed="0.000289"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:09.237273" 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-10-16T01:20:09.236539" elapsed="0.000792"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:09.238229" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:09.237662" elapsed="0.000622"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:09.239137" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:09.238596" elapsed="0.000621"/>
</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-10-16T01:20:09.247883" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:20:09.246466" elapsed="0.001526"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:20:09.248118" elapsed="0.000158"/>
</return>
<msg time="2026-10-16T01:20:09.248936" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:20:09.243246" elapsed="0.005826"/>
</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-10-16T01:20:09.271816" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:20:09.271366" elapsed="0.000487"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:20:09.272887" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:20:09.272593" elapsed="0.000383">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:09.273094" 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-10-16T01:20:09.272122" elapsed="0.001004"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:09.273838" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:09.273381" elapsed="0.000497"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:20:09.274317" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:20:09.274498" 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-10-16T01:20:09.274134" elapsed="0.000399"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:09.275173" 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-10-16T01:20:09.274848" elapsed="0.000413"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:09.276581" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:09.276213" elapsed="0.000437"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:20:09.277308" 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-10-16T01:20:09.276901" elapsed="0.000432"/>
</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-10-16T01:20:09.277617" elapsed="0.000020"/>
</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-10-16T01:20:09.277817" 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-10-16T01:20:09.277999" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:20:09.277487" elapsed="0.000563"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:20:09.277377" elapsed="0.000701"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:20:09.278117" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:20:09.278261" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:20:09.275720" elapsed="0.002564"/>
</kw>
<status status="PASS" start="2026-10-16T01:20:09.275349" elapsed="0.002964"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:09.278482" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:09.278337" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:09.275324" elapsed="0.003228"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:20:09.279109" 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-10-16T01:20:09.278725" elapsed="0.000410"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:20:09.279179" elapsed="0.000041"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:20:09.270629" elapsed="0.008666"/>
</kw>
<msg time="2026-10-16T01:20:09.279342" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:09.264961" elapsed="0.014427"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:09.283212" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:09.287014" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:09.290865" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:09.291042" elapsed="0.000020"/>
</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-10-16T01:20:09.291231" elapsed="0.000019"/>
</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-10-16T01:20:09.291569" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:09.291430" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:09.291416" elapsed="0.000227"/>
</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-10-16T01:20:09.291808" 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-10-16T01:20:09.291986" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:09.292146" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:20:09.291390" elapsed="0.000816"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:20:09.291298" elapsed="0.000932"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:09.292378" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:09.292447" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:20:09.292556" 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-10-16T01:20:09.264100" elapsed="0.028479"/>
</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-10-16T01:20:09.293681" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:09.293490" elapsed="0.000267">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:09.293840" 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-10-16T01:20:09.293154" elapsed="0.000709"/>
</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-10-16T01:20:09.294142" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:09.293925" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:20:09.294654" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:20:09.294390" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-16T01:20:09.294232" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:09.293909" elapsed="0.000838"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:09.295261" 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-10-16T01:20:09.294906" elapsed="0.000380"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:20:09.295332" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:20:09.295456" 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-manganese/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-10-16T01:20:09.292856" elapsed="0.002623"/>
</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-10-16T01:20:09.296636" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:09.296427" elapsed="0.000285">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:09.296799" 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-10-16T01:20:09.296074" elapsed="0.000748"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:20:09.296985" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:20:09.296886" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:09.296870" elapsed="0.000193"/>
</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-10-16T01:20:09.297228" 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-10-16T01:20:09.297400" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:09.297460" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:20:09.297585" 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-manganese/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-10-16T01:20:09.295777" elapsed="0.001831"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:09.299039" 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-10-16T01:20:09.298811" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:09.299501" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:09.299281" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:20:09.304368" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:20:09.304421" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:20:09.304514" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:09.299839" elapsed="0.005032">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:09.299602" elapsed="0.005345">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:09.305127" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:09.304977" elapsed="0.000219"/>
</branch>
<status status="FAIL" start="2026-10-16T01:20:09.299586" elapsed="0.005634">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:09.305554" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:09.305672" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:09.305640" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:09.305624" 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-10-16T01:20:09.305885" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:20:09.305948" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:20:09.298083" elapsed="0.007967">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:09.306150" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:20:09.254419" elapsed="0.051873">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:20:09.306686" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:09.306468" elapsed="0.000325"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:09.306415" elapsed="0.000421"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:09.306920" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:20:09.252251" elapsed="0.054835">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:09.249547" elapsed="0.057652">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:20:09.249504" elapsed="0.057770">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:09.307522" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:20:09.307885" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:09.308208" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:20:09.308560" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:20:09.309014" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:20:09.309342" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:20:09.309690" elapsed="0.000047"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:20:09.309956" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:20:09.241903" elapsed="0.068154">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:20:09.310119" elapsed="0.000014"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:20:09.240054" elapsed="0.070166">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:09.310443" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:09.310301" elapsed="0.000192"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:09.310650" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:09.310515" elapsed="0.000205"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:09.310888" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:09.310744" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:09.310285" elapsed="0.000671"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:20:09.239691" elapsed="0.071304">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:20:09.239315" elapsed="0.071732">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:09.311095" elapsed="0.000013"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:20:09.230947" elapsed="0.080287">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:09.311415" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:09.311643" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:09.311495" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:09.311479" elapsed="0.000352"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:09.311961" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:09.312132" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:09.312201" elapsed="0.000015"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:20:09.229350" elapsed="0.082946">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:20:09.228890" elapsed="0.083467">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:20:09.228621" elapsed="0.083785">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:20:09.227867" elapsed="0.084620">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:09.312694" elapsed="0.000038"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:20:09.207101" elapsed="0.105714">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:20:10.331402" elapsed="0.000420"/>
</kw>
<msg time="2026-10-16T01:20:10.331926" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:10.330132" elapsed="0.001900"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:20:10.329191" elapsed="0.002994"/>
</kw>
<msg time="2026-10-16T01:20:10.332299" 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-10-16T01:20:10.322531" elapsed="0.009859"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:20:10.321658" elapsed="0.010881"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:10.333577" 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-10-16T01:20:10.333031" elapsed="0.000639"/>
</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-10-16T01:20:10.340232" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:10.339446" elapsed="0.000845"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:10.341282" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:10.340620" elapsed="0.000718"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:10.341514" elapsed="0.000066"/>
</return>
<msg time="2026-10-16T01:20:10.341847" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:10.338611" elapsed="0.003289"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:20:10.342254" elapsed="0.000290"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:10.343646" 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-10-16T01:20:10.342945" elapsed="0.000787"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:10.344609" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:10.344069" elapsed="0.000594"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:10.345535" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:10.345006" elapsed="0.000581"/>
</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-10-16T01:20:10.354531" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:20:10.353046" elapsed="0.001594"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:20:10.354815" elapsed="0.000135"/>
</return>
<msg time="2026-10-16T01:20:10.355404" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:20:10.349736" elapsed="0.005793"/>
</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-10-16T01:20:10.378741" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:20:10.378296" elapsed="0.000483"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:20:10.379743" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:20:10.379453" elapsed="0.000382">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:10.379953" 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-10-16T01:20:10.378995" elapsed="0.000990"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:10.380668" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:10.380236" elapsed="0.000488"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:20:10.381107" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:20:10.381303" 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-10-16T01:20:10.380953" elapsed="0.000383"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:10.381928" 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-10-16T01:20:10.381599" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:10.383433" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:10.382912" elapsed="0.000581"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:20:10.384102" 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-10-16T01:20:10.383817" elapsed="0.000310"/>
</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-10-16T01:20:10.384422" elapsed="0.000020"/>
</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-10-16T01:20:10.384603" elapsed="0.000022"/>
</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-10-16T01:20:10.384799" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:20:10.384293" elapsed="0.000559"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:20:10.384170" elapsed="0.000710"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:20:10.384920" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:20:10.385088" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:20:10.382427" elapsed="0.002684"/>
</kw>
<status status="PASS" start="2026-10-16T01:20:10.382069" elapsed="0.003071"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:10.385324" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:10.385164" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:10.382046" elapsed="0.003350"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:20:10.385953" 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-10-16T01:20:10.385551" elapsed="0.000428"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:20:10.386023" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:20:10.377543" elapsed="0.008580"/>
</kw>
<msg time="2026-10-16T01:20:10.386171" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:10.371820" elapsed="0.014412"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:10.390076" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:10.393876" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:10.397663" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:10.397851" 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-10-16T01:20:10.398029" elapsed="0.000019"/>
</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-10-16T01:20:10.398381" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:10.398238" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:10.398224" 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-10-16T01:20:10.398611" elapsed="0.000018"/>
</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-10-16T01:20:10.398807" 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-10-16T01:20:10.398971" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:20:10.398184" elapsed="0.000835"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:20:10.398094" elapsed="0.000948"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:10.399206" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:10.399275" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:20:10.399379" 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-10-16T01:20:10.370965" elapsed="0.028438"/>
</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-10-16T01:20:10.400539" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:10.400348" elapsed="0.000250">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:10.400681" 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-10-16T01:20:10.400013" elapsed="0.000712"/>
</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-10-16T01:20:10.401006" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:10.400791" elapsed="0.000267"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:20:10.401516" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:20:10.401252" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-16T01:20:10.401081" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:10.400774" elapsed="0.000818"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:10.402103" 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-10-16T01:20:10.401767" elapsed="0.000360"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:20:10.402172" elapsed="0.000039"/>
</return>
<msg time="2026-10-16T01:20:10.402311" 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-manganese/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-10-16T01:20:10.399713" elapsed="0.002621"/>
</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-10-16T01:20:10.403401" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:10.403210" elapsed="0.000250">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:10.403542" 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-10-16T01:20:10.402886" elapsed="0.000679"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:20:10.403754" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:20:10.403628" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:10.403611" elapsed="0.000220"/>
</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-10-16T01:20:10.403986" elapsed="0.000020"/>
</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-10-16T01:20:10.404160" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:10.404235" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:20:10.404359" 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-manganese/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-10-16T01:20:10.402575" elapsed="0.001806"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:10.405816" 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-10-16T01:20:10.405567" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:10.406294" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:10.406057" elapsed="0.000278"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:20:10.410763" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:20:10.410814" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:20:10.410937" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:10.406619" elapsed="0.004665">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:10.406395" elapsed="0.004966">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:10.411540" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:10.411391" elapsed="0.000208"/>
</branch>
<status status="FAIL" start="2026-10-16T01:20:10.406378" elapsed="0.005242">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:10.411971" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:10.412091" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:10.412058" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:10.412042" elapsed="0.000108"/>
</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-10-16T01:20:10.412298" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:20:10.412361" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:20:10.404845" elapsed="0.007617">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:10.412529" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:20:10.361320" elapsed="0.051339">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:20:10.413070" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:10.412854" elapsed="0.000298"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:10.412806" elapsed="0.000400"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:10.413293" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:20:10.359168" elapsed="0.054289">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:10.356236" elapsed="0.057319">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:20:10.356173" elapsed="0.057454">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:10.413892" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:20:10.414245" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:10.414557" elapsed="0.000023"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:20:10.414937" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:20:10.415377" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:20:10.415693" elapsed="0.000039"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:20:10.416056" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:20:10.416343" elapsed="0.000019"/>
</return>
<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="FAIL" start="2026-10-16T01:20:10.348270" elapsed="0.068177">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:20:10.416509" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:20:10.346434" elapsed="0.070164">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:10.416845" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:10.416678" elapsed="0.000218"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:10.417055" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:10.416919" elapsed="0.000185"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:10.417287" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:10.417126" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:10.416662" elapsed="0.000694"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:20:10.346082" elapsed="0.071312">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:20:10.345682" elapsed="0.071764">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:10.417494" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:20:10.337263" elapsed="0.080320">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:10.417884" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:10.418103" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:10.417964" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:10.417949" elapsed="0.000222"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:10.418308" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:10.418472" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:10.418529" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:20:10.335633" elapsed="0.082987">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:20:10.335172" elapsed="0.083509">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:20:10.334934" elapsed="0.083814">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:20:10.334144" elapsed="0.084688">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:10.419072" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:20:10.313434" elapsed="0.105751">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:20:11.437730" elapsed="0.000390"/>
</kw>
<msg time="2026-10-16T01:20:11.438242" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:11.436457" elapsed="0.001893"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:20:11.435522" elapsed="0.002984"/>
</kw>
<msg time="2026-10-16T01:20:11.438597" 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-10-16T01:20:11.429013" elapsed="0.009675"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:20:11.428150" elapsed="0.010722"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:11.439892" 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-10-16T01:20:11.439351" elapsed="0.000636"/>
</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-10-16T01:20:11.446565" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:11.445811" elapsed="0.000812"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:11.447618" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:11.446988" elapsed="0.000684"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:11.447796" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:20:11.448084" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:11.444909" elapsed="0.003226"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:20:11.448487" elapsed="0.000318"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:11.449917" 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-10-16T01:20:11.449173" elapsed="0.000801"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:11.450881" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:11.450328" elapsed="0.000608"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:11.451802" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:11.451268" elapsed="0.000589"/>
</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-10-16T01:20:11.460525" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:20:11.459102" elapsed="0.001532"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:20:11.460808" elapsed="0.000136"/>
</return>
<msg time="2026-10-16T01:20:11.461401" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:20:11.455866" elapsed="0.005662"/>
</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-10-16T01:20:11.485049" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:20:11.484601" elapsed="0.000484"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:20:11.486054" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:20:11.485776" elapsed="0.000366">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:11.486278" 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-10-16T01:20:11.485315" elapsed="0.000995"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:11.487083" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:11.486621" elapsed="0.000487"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:20:11.487395" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:20:11.487529" 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-10-16T01:20:11.487282" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:11.487981" 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-10-16T01:20:11.487758" elapsed="0.000264"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:11.489049" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:11.488818" elapsed="0.000272"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:20:11.489531" 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-10-16T01:20:11.489276" elapsed="0.000279"/>
</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-10-16T01:20:11.489850" 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-10-16T01:20:11.490029" elapsed="0.000022"/>
</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-10-16T01:20:11.490216" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:20:11.489720" elapsed="0.000548"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:20:11.489598" elapsed="0.000697"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:20:11.490334" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:20:11.490462" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:20:11.488467" elapsed="0.002018"/>
</kw>
<status status="PASS" start="2026-10-16T01:20:11.488212" elapsed="0.002302"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:11.490685" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:11.490537" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:11.488066" elapsed="0.002705"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:20:11.491319" 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-10-16T01:20:11.490925" elapsed="0.000420"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:20:11.491388" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:20:11.483802" elapsed="0.007684"/>
</kw>
<msg time="2026-10-16T01:20:11.491533" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:11.477945" elapsed="0.013634"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:11.495354" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:11.499130" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:11.502884" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:11.503094" 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-10-16T01:20:11.503287" 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-10-16T01:20:11.503628" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:11.503487" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:11.503473" elapsed="0.000243"/>
</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-10-16T01:20:11.503879" 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-10-16T01:20:11.504066" elapsed="0.000018"/>
</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-10-16T01:20:11.504238" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:20:11.503447" elapsed="0.000841"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:20:11.503355" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:11.504463" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:11.504531" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:20:11.504635" 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-10-16T01:20:11.477077" elapsed="0.027581"/>
</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-10-16T01:20:11.505778" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:11.505567" elapsed="0.000271">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:11.505920" 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-10-16T01:20:11.505246" elapsed="0.000697"/>
</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-10-16T01:20:11.506236" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:11.506006" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:20:11.506751" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:20:11.506471" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-16T01:20:11.506313" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:11.505989" elapsed="0.000839"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:11.507363" 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-10-16T01:20:11.506985" elapsed="0.000403"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:20:11.507433" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:20:11.507556" 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-manganese/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-10-16T01:20:11.504935" elapsed="0.002644"/>
</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-10-16T01:20:11.510154" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:11.508468" elapsed="0.001759">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:11.510328" 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-10-16T01:20:11.508134" elapsed="0.002218"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:20:11.510549" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:20:11.510449" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:11.510431" elapsed="0.000194"/>
</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-10-16T01:20:11.510793" 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-10-16T01:20:11.510966" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:11.511026" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:20:11.511153" 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-manganese/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-10-16T01:20:11.507839" elapsed="0.003337"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:11.512413" 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-10-16T01:20:11.512170" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:11.512882" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:11.512643" 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-10-16T01:20:11.517180" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:20:11.517249" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:20:11.517352" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:11.513220" elapsed="0.004475">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:11.512983" elapsed="0.004810">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:11.517973" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:11.517824" elapsed="0.000208"/>
</branch>
<status status="FAIL" start="2026-10-16T01:20:11.512967" elapsed="0.005086">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:11.518421" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:11.518543" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:11.518509" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:11.518494" elapsed="0.000106"/>
</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-10-16T01:20:11.518753" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:20:11.518816" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:20:11.511460" elapsed="0.007457">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:11.518984" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:20:11.467367" elapsed="0.051744">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:20:11.519516" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:11.519298" elapsed="0.000337"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:11.519249" elapsed="0.000429"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:11.519791" elapsed="0.000037"/>
</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="FAIL" start="2026-10-16T01:20:11.465168" elapsed="0.054790">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:11.462237" elapsed="0.057823">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:20:11.462176" elapsed="0.057959">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:11.520398" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:20:11.520763" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:11.521076" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:20:11.521439" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:20:11.521887" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:20:11.522197" elapsed="0.000034"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:20:11.522559" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:20:11.522813" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:20:11.454508" elapsed="0.068407">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:20:11.522975" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:20:11.452672" elapsed="0.070392">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:11.523298" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:11.523144" elapsed="0.000205"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:11.523514" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:11.523372" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:11.523743" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:11.523584" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:11.523127" elapsed="0.000686"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:20:11.452342" elapsed="0.071510">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:20:11.451951" elapsed="0.071953">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:11.523951" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:20:11.443530" elapsed="0.080511">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:11.524227" elapsed="0.000055"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:11.524486" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:11.524345" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:11.524329" elapsed="0.000226"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:11.524679" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:11.524879" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:11.524938" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:20:11.441945" elapsed="0.083085">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:20:11.441477" elapsed="0.083615">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:20:11.441236" elapsed="0.083904">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:20:11.440447" elapsed="0.084786">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:11.525442" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:20:11.419863" elapsed="0.105683">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:20:12.544197" elapsed="0.000412"/>
</kw>
<msg time="2026-10-16T01:20:12.544740" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:12.542951" elapsed="0.001897"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:20:12.542009" elapsed="0.002997"/>
</kw>
<msg time="2026-10-16T01:20:12.545096" 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-10-16T01:20:12.535409" elapsed="0.009778"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:20:12.534538" elapsed="0.010825"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:12.546390" 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-10-16T01:20:12.545849" elapsed="0.000633"/>
</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-10-16T01:20:12.553020" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:12.552256" elapsed="0.000821"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:12.554065" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:12.553429" elapsed="0.000690"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:12.554236" elapsed="0.000063"/>
</return>
<msg time="2026-10-16T01:20:12.554526" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:12.551421" elapsed="0.003155"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:20:12.554931" elapsed="0.000304"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:12.556426" 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-10-16T01:20:12.555608" elapsed="0.000875"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:12.557397" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:12.556857" elapsed="0.000593"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:12.558324" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:12.557795" elapsed="0.000584"/>
</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-10-16T01:20:12.567134" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:20:12.565772" elapsed="0.001498"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:20:12.567401" elapsed="0.000135"/>
</return>
<msg time="2026-10-16T01:20:12.568124" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:20:12.562404" elapsed="0.005873"/>
</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-10-16T01:20:12.591448" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:20:12.591004" elapsed="0.000480"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:20:12.592451" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:20:12.592163" elapsed="0.000376">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:12.592657" 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-10-16T01:20:12.591720" elapsed="0.000968"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:12.593400" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:12.592945" elapsed="0.000491"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:20:12.593853" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:20:12.594027" 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-10-16T01:20:12.593664" elapsed="0.000396"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:12.594651" 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-10-16T01:20:12.594343" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:12.596042" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:12.595660" elapsed="0.000422"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:20:12.596658" 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-10-16T01:20:12.596266" elapsed="0.000417"/>
</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-10-16T01:20:12.596983" elapsed="0.000020"/>
</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-10-16T01:20:12.597163" elapsed="0.000022"/>
</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-10-16T01:20:12.597358" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:20:12.596853" elapsed="0.000557"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:20:12.596742" elapsed="0.000695"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:20:12.597477" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:20:12.597605" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:20:12.595159" elapsed="0.002469"/>
</kw>
<status status="PASS" start="2026-10-16T01:20:12.594817" elapsed="0.002840"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:12.597839" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:12.597679" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:12.594793" elapsed="0.003117"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:20:12.598458" 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-10-16T01:20:12.598062" elapsed="0.000456"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:20:12.598564" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:20:12.590282" elapsed="0.008385"/>
</kw>
<msg time="2026-10-16T01:20:12.598730" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:12.584523" elapsed="0.014255"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:12.602588" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:12.606450" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:12.610266" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:12.610443" elapsed="0.000020"/>
</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-10-16T01:20:12.610619" elapsed="0.000019"/>
</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-10-16T01:20:12.610973" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:12.610833" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:12.610820" elapsed="0.000226"/>
</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-10-16T01:20:12.611199" elapsed="0.000034"/>
</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-10-16T01:20:12.611393" elapsed="0.000018"/>
</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-10-16T01:20:12.611552" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:20:12.610793" elapsed="0.000808"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:20:12.610686" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:12.611788" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:12.611858" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:20:12.611963" 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-10-16T01:20:12.583599" elapsed="0.028388"/>
</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-10-16T01:20:12.613134" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:12.612940" elapsed="0.000254">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:12.613295" 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-10-16T01:20:12.612599" elapsed="0.000719"/>
</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-10-16T01:20:12.613599" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:12.613382" elapsed="0.000269"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:20:12.614115" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:20:12.613849" elapsed="0.000290"/>
</kw>
<status status="PASS" start="2026-10-16T01:20:12.613674" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:12.613365" elapsed="0.000826"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:12.614720" 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-10-16T01:20:12.614365" elapsed="0.000381"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:20:12.614792" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:20:12.614917" 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-manganese/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-10-16T01:20:12.612263" elapsed="0.002678"/>
</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-10-16T01:20:12.616016" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:12.615828" elapsed="0.000247">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:12.616157" 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-10-16T01:20:12.615497" elapsed="0.000682"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:20:12.616356" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:20:12.616258" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:12.616240" elapsed="0.000194"/>
</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-10-16T01:20:12.616583" elapsed="0.000020"/>
</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-10-16T01:20:12.616769" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:12.616830" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:20:12.616953" 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-manganese/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-10-16T01:20:12.615186" elapsed="0.001791"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:12.618399" 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-10-16T01:20:12.618154" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:12.618866" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:12.618626" 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-10-16T01:20:12.622973" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:20:12.623039" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:20:12.623136" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:12.619192" elapsed="0.004290">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:12.618967" elapsed="0.004625">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:12.623799" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:12.623625" elapsed="0.000234"/>
</branch>
<status status="FAIL" start="2026-10-16T01:20:12.618950" elapsed="0.004931">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:12.624232" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:12.624355" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:12.624321" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:12.624305" elapsed="0.000109"/>
</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-10-16T01:20:12.624550" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:20:12.624613" elapsed="0.000013"/>
</return>
<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="FAIL" start="2026-10-16T01:20:12.617442" elapsed="0.007291">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:12.624803" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:20:12.573809" elapsed="0.051119">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:20:12.625329" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:12.625094" elapsed="0.000318"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:12.625047" elapsed="0.000406"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:12.625535" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:20:12.571603" elapsed="0.054117">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:12.568865" elapsed="0.056959">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:20:12.568684" elapsed="0.057212">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:12.626142" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:20:12.626503" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:12.626833" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:20:12.627179" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:20:12.627626" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:20:12.627964" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:20:12.628460" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:20:12.628734" elapsed="0.000019"/>
</return>
<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="FAIL" start="2026-10-16T01:20:12.561064" elapsed="0.067775">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:20:12.628934" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:20:12.559232" elapsed="0.069796">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:12.629266" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:12.629109" elapsed="0.000208"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:12.629478" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:12.629340" elapsed="0.000188"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:12.629692" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:12.629550" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:12.629093" elapsed="0.000692"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:20:12.558883" elapsed="0.070941">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:20:12.558474" elapsed="0.071401">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:12.629923" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:20:12.550043" elapsed="0.079971">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:12.630187" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:12.630423" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:12.630281" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:12.630265" elapsed="0.000227"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:12.630616" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:12.630900" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:12.630961" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:20:12.548440" elapsed="0.082614">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:20:12.547986" elapsed="0.083130">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:20:12.547745" elapsed="0.083419">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:20:12.546953" elapsed="0.084353">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:12.631519" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:20:12.526131" elapsed="0.105492">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:20:13.650027" elapsed="0.000402"/>
</kw>
<msg time="2026-10-16T01:20:13.650528" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:13.648795" elapsed="0.001942"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:20:13.647861" elapsed="0.003042"/>
</kw>
<msg time="2026-10-16T01:20:13.650994" 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-10-16T01:20:13.641393" elapsed="0.009693"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:20:13.640522" elapsed="0.010742"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:13.652303" 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-10-16T01:20:13.651762" elapsed="0.000636"/>
</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-10-16T01:20:13.658892" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:13.658100" elapsed="0.000851"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:13.660033" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:13.659304" elapsed="0.000785"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:13.660182" elapsed="0.000088"/>
</return>
<msg time="2026-10-16T01:20:13.660502" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:13.657290" elapsed="0.003263"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:20:13.660915" elapsed="0.000287"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:13.662330" 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-10-16T01:20:13.661595" elapsed="0.000792"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:13.663272" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:13.662743" elapsed="0.000584"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:13.664165" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:13.663635" elapsed="0.000603"/>
</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-10-16T01:20:13.672852" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:20:13.671447" elapsed="0.001514"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:20:13.673086" elapsed="0.000153"/>
</return>
<msg time="2026-10-16T01:20:13.673667" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:20:13.668202" elapsed="0.005837"/>
</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-10-16T01:20:13.696990" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:20:13.696545" elapsed="0.000481"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:20:13.697973" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:20:13.697694" elapsed="0.000363">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:13.698173" 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-10-16T01:20:13.697255" elapsed="0.000950"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:13.698903" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:13.698452" elapsed="0.000487"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:20:13.699334" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:20:13.699545" 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-10-16T01:20:13.699163" elapsed="0.000416"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:13.700178" 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-10-16T01:20:13.699867" elapsed="0.000383"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:13.701735" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:13.701166" elapsed="0.000644"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:20:13.702347" 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-10-16T01:20:13.702081" 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-10-16T01:20:13.702649" elapsed="0.000020"/>
</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-10-16T01:20:13.702845" 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-10-16T01:20:13.703023" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:20:13.702522" elapsed="0.000553"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:20:13.702414" elapsed="0.000688"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:20:13.703141" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:20:13.703286" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:20:13.700679" elapsed="0.002630"/>
</kw>
<status status="PASS" start="2026-10-16T01:20:13.700337" elapsed="0.003001"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:13.703505" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:13.703362" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:13.700313" elapsed="0.003262"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:20:13.704119" 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-10-16T01:20:13.703745" elapsed="0.000400"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:20:13.704188" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:20:13.695836" elapsed="0.008469"/>
</kw>
<msg time="2026-10-16T01:20:13.704352" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:13.690232" elapsed="0.014166"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:13.708163" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:13.711942" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:13.715726" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:13.715937" 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-10-16T01:20:13.716118" elapsed="0.000019"/>
</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-10-16T01:20:13.717055" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:13.716912" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:13.716897" 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-10-16T01:20:13.717296" 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-10-16T01:20:13.717474" elapsed="0.000018"/>
</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-10-16T01:20:13.717633" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:20:13.716869" elapsed="0.000812"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:20:13.716184" elapsed="0.001535"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:13.717868" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:13.717935" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:20:13.718038" 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-10-16T01:20:13.689382" elapsed="0.028679"/>
</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-10-16T01:20:13.719160" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:13.718970" elapsed="0.000263">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:13.719317" 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-10-16T01:20:13.718631" elapsed="0.000709"/>
</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-10-16T01:20:13.719616" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:13.719403" elapsed="0.000264"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:20:13.720131" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:20:13.719866" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-16T01:20:13.719690" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:13.719386" elapsed="0.000821"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:13.720741" 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-10-16T01:20:13.720385" elapsed="0.000381"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:20:13.720811" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:20:13.720934" 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-manganese/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-10-16T01:20:13.718333" elapsed="0.002624"/>
</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-10-16T01:20:13.722031" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:13.721843" elapsed="0.000245">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:13.722172" 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-10-16T01:20:13.721510" elapsed="0.000684"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:20:13.722369" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:20:13.722270" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:13.722253" elapsed="0.000192"/>
</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-10-16T01:20:13.722595" elapsed="0.000020"/>
</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-10-16T01:20:13.722818" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:13.722880" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:20:13.723006" 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-manganese/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-10-16T01:20:13.721200" elapsed="0.001829"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:13.724429" 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-10-16T01:20:13.724188" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:13.724891" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:13.724656" elapsed="0.000275"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:20:13.729110" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:20:13.729161" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:20:13.729313" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:13.725210" elapsed="0.004427">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:13.724991" elapsed="0.004748">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:13.729920" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:13.729771" elapsed="0.000207"/>
</branch>
<status status="FAIL" start="2026-10-16T01:20:13.724974" elapsed="0.005025">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:13.730340" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:13.730459" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:13.730427" elapsed="0.000069"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:13.730411" elapsed="0.000105"/>
</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-10-16T01:20:13.730650" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:20:13.730729" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:20:13.723479" elapsed="0.007351">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:13.730897" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:20:13.679729" elapsed="0.051291">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:20:13.731417" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:13.731185" elapsed="0.000313"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:13.731139" elapsed="0.000399"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:13.731621" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:20:13.677549" elapsed="0.054296">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:13.674515" elapsed="0.057430">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:20:13.674473" elapsed="0.057545">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:13.732279" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:20:13.732621" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:13.732950" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:20:13.733315" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:20:13.733764" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:20:13.734078" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:20:13.734437" elapsed="0.000019"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:20:13.734671" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:20:13.666899" elapsed="0.067906">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:20:13.734866" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:20:13.665070" elapsed="0.069883">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:13.735172" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:13.735031" elapsed="0.000205"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:13.735397" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:13.735259" elapsed="0.000187"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:13.735606" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:13.735468" elapsed="0.000184"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:13.735016" elapsed="0.000657"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:20:13.664737" elapsed="0.070996">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:20:13.664334" elapsed="0.071453">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:13.735835" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:20:13.655933" elapsed="0.079991">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:13.736116" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:13.736359" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:13.736197" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:13.736182" elapsed="0.000248"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:13.736590" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:13.736894" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:13.736958" elapsed="0.000016"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:20:13.654348" elapsed="0.082707">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:20:13.653893" elapsed="0.083226">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:20:13.653622" elapsed="0.083548">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:20:13.652868" elapsed="0.084399">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:13.737476" elapsed="0.000021"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:20:13.632204" elapsed="0.105375">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:20:14.756927" elapsed="0.000426"/>
</kw>
<msg time="2026-10-16T01:20:14.757473" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:14.755649" elapsed="0.001941"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:20:14.754743" elapsed="0.003033"/>
</kw>
<msg time="2026-10-16T01:20:14.757870" 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-10-16T01:20:14.748258" elapsed="0.009701"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:20:14.747374" elapsed="0.010730"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:14.759151" 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-10-16T01:20:14.758608" elapsed="0.000661"/>
</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-10-16T01:20:14.765812" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:14.765020" elapsed="0.000850"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:14.766853" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:14.766202" elapsed="0.000705"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:14.767000" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:20:14.767314" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:14.764192" elapsed="0.003175"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:20:14.767692" elapsed="0.000317"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:14.769092" 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-10-16T01:20:14.768399" elapsed="0.000748"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:14.770115" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:14.769574" elapsed="0.000593"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:14.771144" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:14.770496" elapsed="0.000701"/>
</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-10-16T01:20:14.779909" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:20:14.778490" elapsed="0.001528"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:20:14.780143" elapsed="0.000214"/>
</return>
<msg time="2026-10-16T01:20:14.780856" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:20:14.775195" elapsed="0.005761"/>
</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-10-16T01:20:14.803365" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:20:14.802928" elapsed="0.000474"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:20:14.804559" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:20:14.804157" elapsed="0.000499">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:14.804799" 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-10-16T01:20:14.803616" elapsed="0.001218"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:14.805533" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:14.805083" elapsed="0.000485"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:20:14.805968" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:20:14.806158" 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-10-16T01:20:14.805812" elapsed="0.000379"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:14.806816" 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-10-16T01:20:14.806470" elapsed="0.000416"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:14.807994" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:14.807766" elapsed="0.000269"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:20:14.808495" 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-10-16T01:20:14.808205" 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-10-16T01:20:14.808818" 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-10-16T01:20:14.809000" elapsed="0.000022"/>
</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-10-16T01:20:14.809180" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:20:14.808670" elapsed="0.000575"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:20:14.808563" elapsed="0.000711"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:20:14.809314" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:20:14.809444" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:20:14.807417" elapsed="0.002050"/>
</kw>
<status status="PASS" start="2026-10-16T01:20:14.807147" elapsed="0.002349"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:14.809665" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:14.809521" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:14.806960" elapsed="0.002793"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:20:14.810311" 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-10-16T01:20:14.809913" elapsed="0.000423"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:20:14.810379" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:20:14.802165" elapsed="0.008313"/>
</kw>
<msg time="2026-10-16T01:20:14.810557" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:14.796526" elapsed="0.014079"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:14.814468" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:14.818244" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:14.821981" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:14.822156" elapsed="0.000019"/>
</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-10-16T01:20:14.822344" 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-10-16T01:20:14.822679" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:14.822539" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:14.822525" 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-10-16T01:20:14.822922" elapsed="0.000019"/>
</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-10-16T01:20:14.823097" elapsed="0.000018"/>
</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-10-16T01:20:14.823271" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:20:14.822500" elapsed="0.000821"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:20:14.822411" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:14.823492" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:14.823559" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:20:14.823661" 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-10-16T01:20:14.795667" elapsed="0.028018"/>
</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-10-16T01:20:14.824818" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:14.824613" elapsed="0.000265">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:14.824992" 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-10-16T01:20:14.824292" elapsed="0.000724"/>
</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-10-16T01:20:14.825308" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:14.825079" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:20:14.825817" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:20:14.825541" elapsed="0.000300"/>
</kw>
<status status="PASS" start="2026-10-16T01:20:14.825384" elapsed="0.000489"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:14.825062" elapsed="0.000831"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:14.826396" 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-10-16T01:20:14.826049" elapsed="0.000371"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:20:14.826465" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:20:14.826587" 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-manganese/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-10-16T01:20:14.823960" elapsed="0.002650"/>
</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-10-16T01:20:14.829339" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:14.827492" elapsed="0.001908">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:14.829485" 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-10-16T01:20:14.827160" elapsed="0.002349"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:20:14.829673" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:20:14.829574" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:14.829557" 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-10-16T01:20:14.829944" 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-10-16T01:20:14.830119" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:14.830180" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:20:14.830321" 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-manganese/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-10-16T01:20:14.826865" elapsed="0.003480"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:14.831613" 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-10-16T01:20:14.831386" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:14.832079" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:14.831858" elapsed="0.000262"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:20:14.836344" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:20:14.836397" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:20:14.836501" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:14.832419" elapsed="0.004454">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:14.832180" elapsed="0.004769">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:14.837132" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:14.836980" elapsed="0.000241"/>
</branch>
<status status="FAIL" start="2026-10-16T01:20:14.832163" elapsed="0.005099">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:14.837599" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:14.837736" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:14.837686" elapsed="0.000089"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:14.837670" elapsed="0.000128"/>
</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-10-16T01:20:14.837935" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:20:14.837999" elapsed="0.000013"/>
</return>
<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="FAIL" start="2026-10-16T01:20:14.830612" elapsed="0.007486">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:14.838167" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:20:14.785941" elapsed="0.052373">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:20:14.838727" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:14.838486" elapsed="0.000327"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:14.838437" elapsed="0.000418"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:14.838940" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:20:14.783772" elapsed="0.055335">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:14.781266" elapsed="0.057944">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:20:14.781222" elapsed="0.058079">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:14.839550" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:20:14.839918" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:14.840246" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:20:14.840599" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:20:14.841053" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:20:14.841390" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:20:14.841774" elapsed="0.000023"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:20:14.842020" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:20:14.773900" elapsed="0.068221">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:20:14.842182" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:20:14.772055" elapsed="0.070231">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:14.842540" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:14.842399" elapsed="0.000192"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:14.842773" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:14.842614" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:14.842986" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:14.842845" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:14.842382" elapsed="0.000673"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:20:14.771691" elapsed="0.071402">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:20:14.771319" elapsed="0.071826">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:14.843194" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:20:14.762850" elapsed="0.080450">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:14.843475" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:14.843692" elapsed="0.000136"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:14.843553" elapsed="0.000305"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:14.843538" elapsed="0.000342"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:14.844005" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:14.844172" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:14.844282" elapsed="0.000015"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:20:14.761255" elapsed="0.083121">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:20:14.760783" elapsed="0.083654">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:20:14.760506" elapsed="0.083980">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:20:14.759742" elapsed="0.084824">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:14.844788" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:20:14.738368" elapsed="0.106523">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:20:15.864648" elapsed="0.000425"/>
</kw>
<msg time="2026-10-16T01:20:15.865183" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:15.863398" elapsed="0.001918"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:20:15.862427" elapsed="0.003047"/>
</kw>
<msg time="2026-10-16T01:20:15.865665" 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-10-16T01:20:15.855365" elapsed="0.010426"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:20:15.854425" elapsed="0.011520"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:15.866985" 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-10-16T01:20:15.866438" elapsed="0.000638"/>
</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-10-16T01:20:15.873676" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:15.872925" elapsed="0.000840"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:15.874758" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:15.874101" elapsed="0.000722"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:15.874933" elapsed="0.000070"/>
</return>
<msg time="2026-10-16T01:20:15.875229" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:15.872080" elapsed="0.003225"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:20:15.875634" elapsed="0.000319"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:15.877080" 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-10-16T01:20:15.876346" elapsed="0.000790"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:15.878032" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:15.877486" elapsed="0.000599"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:15.878967" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:15.878420" elapsed="0.000598"/>
</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-10-16T01:20:15.887830" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:20:15.886411" elapsed="0.001529"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:20:15.888066" elapsed="0.000132"/>
</return>
<msg time="2026-10-16T01:20:15.888641" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:20:15.883172" elapsed="0.005640"/>
</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-10-16T01:20:15.911900" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:20:15.911446" elapsed="0.000490"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:20:15.912960" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:20:15.912615" elapsed="0.000463">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:15.913202" 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-10-16T01:20:15.912153" elapsed="0.001072"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:15.913737" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:15.913408" elapsed="0.000356"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:20:15.914045" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:20:15.914193" 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-10-16T01:20:15.913929" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:15.914683" 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-10-16T01:20:15.914424" elapsed="0.000318"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:15.915648" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:15.915416" elapsed="0.000273"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:20:15.916293" 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-10-16T01:20:15.915881" elapsed="0.000438"/>
</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-10-16T01:20:15.916603" 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-10-16T01:20:15.916805" 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-10-16T01:20:15.916994" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:20:15.916473" elapsed="0.000573"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:20:15.916363" elapsed="0.000712"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:20:15.917115" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:20:15.917261" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:20:15.915058" elapsed="0.002227"/>
</kw>
<status status="PASS" start="2026-10-16T01:20:15.914804" elapsed="0.002511"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:15.917486" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:15.917341" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:15.914787" elapsed="0.002770"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:20:15.918122" 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-10-16T01:20:15.917728" elapsed="0.000419"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:20:15.918191" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:20:15.910732" elapsed="0.007575"/>
</kw>
<msg time="2026-10-16T01:20:15.918355" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:15.905050" elapsed="0.013351"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:15.922183" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:15.925976" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:15.929749" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:15.929925" elapsed="0.000020"/>
</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-10-16T01:20:15.930103" elapsed="0.000019"/>
</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-10-16T01:20:15.930488" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:15.930313" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:15.930299" 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-10-16T01:20:15.930731" 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-10-16T01:20:15.930912" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:15.931073" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:20:15.930271" elapsed="0.000851"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:20:15.930170" elapsed="0.000975"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:15.931309" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:15.931378" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:20:15.931483" 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-10-16T01:20:15.904182" elapsed="0.027324"/>
</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-10-16T01:20:15.932623" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:15.932433" elapsed="0.000251">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:15.932784" 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-10-16T01:20:15.932077" elapsed="0.000730"/>
</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-10-16T01:20:15.933084" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:15.932869" elapsed="0.000266"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:20:15.933594" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:20:15.933331" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-16T01:20:15.933158" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:15.932853" elapsed="0.000818"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:15.934180" 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-10-16T01:20:15.933845" elapsed="0.000359"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:20:15.934264" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:20:15.934388" 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-manganese/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-10-16T01:20:15.931781" elapsed="0.002630"/>
</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-10-16T01:20:15.935488" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:15.935298" elapsed="0.000249">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:15.935631" 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-10-16T01:20:15.934965" elapsed="0.000689"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:20:15.935836" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:20:15.935737" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:15.935719" elapsed="0.000195"/>
</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-10-16T01:20:15.936087" elapsed="0.000020"/>
</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-10-16T01:20:15.936274" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:15.936335" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:20:15.936460" 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-manganese/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-10-16T01:20:15.934652" elapsed="0.001877"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:15.937980" 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-10-16T01:20:15.937751" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:15.938442" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:15.938210" elapsed="0.000272"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:20:15.942903" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:20:15.942957" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:20:15.943054" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:15.938783" elapsed="0.004639">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:15.938543" elapsed="0.004959">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:15.943682" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:15.943532" elapsed="0.000226"/>
</branch>
<status status="FAIL" start="2026-10-16T01:20:15.938526" elapsed="0.005254">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:15.944115" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:15.944247" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:15.944202" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:15.944185" 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-10-16T01:20:15.944444" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:20:15.944506" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:20:15.937029" elapsed="0.007578">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:15.944674" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:20:15.894481" elapsed="0.050338">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:20:15.945214" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:15.944995" elapsed="0.000317"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:15.944946" elapsed="0.000408"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:15.945438" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:20:15.892103" elapsed="0.053500">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:15.889296" elapsed="0.056464">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:20:15.889230" elapsed="0.056610">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:15.946093" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:20:15.946460" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:15.946793" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:20:15.947147" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:20:15.947594" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:20:15.947940" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:20:15.948303" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:20:15.948544" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:20:15.881865" elapsed="0.066781">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:20:15.948745" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:20:15.879887" elapsed="0.068952">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:15.949061" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:15.948920" elapsed="0.000192"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:15.949286" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:15.949134" elapsed="0.000202"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:15.949498" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:15.949358" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:15.948904" elapsed="0.000662"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:20:15.879508" elapsed="0.070096">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:20:15.879112" elapsed="0.070544">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:15.949725" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:20:15.870671" elapsed="0.079148">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:15.949993" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:15.950212" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:15.950071" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:15.950056" elapsed="0.000239"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:15.950421" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:15.950589" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:15.950646" elapsed="0.000015"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:20:15.869050" elapsed="0.081834">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:20:15.868579" elapsed="0.082369">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:20:15.868336" elapsed="0.082661">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:20:15.867539" elapsed="0.083540">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:15.951305" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:20:15.845576" elapsed="0.105835">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:20:16.970284" elapsed="0.000401"/>
</kw>
<msg time="2026-10-16T01:20:16.970828" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:16.968999" elapsed="0.001943"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:20:16.968038" elapsed="0.003059"/>
</kw>
<msg time="2026-10-16T01:20:16.971186" 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-10-16T01:20:16.961449" elapsed="0.009852"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:20:16.960543" elapsed="0.010912"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:16.972562" 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-10-16T01:20:16.971982" elapsed="0.000673"/>
</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-10-16T01:20:16.979331" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:16.978534" elapsed="0.000856"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:16.980393" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:16.979753" elapsed="0.000694"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:16.980541" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:20:16.980860" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:16.977642" elapsed="0.003269"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:20:16.981238" elapsed="0.000309"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:16.982631" 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-10-16T01:20:16.981941" elapsed="0.000745"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:16.983575" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:16.983043" elapsed="0.000585"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:16.984490" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:16.983964" elapsed="0.000579"/>
</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-10-16T01:20:16.993219" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:20:16.991830" elapsed="0.001682"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:20:16.993646" elapsed="0.000180"/>
</return>
<msg time="2026-10-16T01:20:16.994281" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:20:16.988552" elapsed="0.005862"/>
</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-10-16T01:20:17.017996" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:20:17.017548" elapsed="0.000485"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:20:17.019060" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:20:17.018730" elapsed="0.000435">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:17.019300" 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-10-16T01:20:17.018267" elapsed="0.001066"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:17.020019" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:17.019567" elapsed="0.000487"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:20:17.020451" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:20:17.020641" 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-10-16T01:20:17.020294" elapsed="0.000380"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:17.021284" 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-10-16T01:20:17.020959" elapsed="0.000382"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:17.022797" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:17.022273" elapsed="0.000582"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:20:17.023477" 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-10-16T01:20:17.023099" elapsed="0.000412"/>
</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-10-16T01:20:17.023949" elapsed="0.000033"/>
</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-10-16T01:20:17.024221" elapsed="0.000037"/>
</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-10-16T01:20:17.024417" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:20:17.023747" elapsed="0.000722"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:20:17.023572" elapsed="0.000925"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:20:17.024537" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:20:17.024664" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:20:17.021794" elapsed="0.002892"/>
</kw>
<status status="PASS" start="2026-10-16T01:20:17.021427" elapsed="0.003303"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:17.024900" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:17.024756" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:17.021403" elapsed="0.003565"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:20:17.025527" 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-10-16T01:20:17.025121" elapsed="0.000431"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:20:17.025595" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:20:17.016834" elapsed="0.008860"/>
</kw>
<msg time="2026-10-16T01:20:17.025792" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:17.011103" elapsed="0.014738"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:17.029654" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:17.033420" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:17.037181" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:17.037369" elapsed="0.000020"/>
</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-10-16T01:20:17.037546" elapsed="0.000018"/>
</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-10-16T01:20:17.037902" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:17.037761" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:17.037747" elapsed="0.000227"/>
</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-10-16T01:20:17.038127" elapsed="0.000019"/>
</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-10-16T01:20:17.038314" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:17.038473" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:20:17.037719" elapsed="0.000802"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:20:17.037612" elapsed="0.000932"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:17.038692" elapsed="0.000034"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:17.038776" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:20:17.038880" 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-10-16T01:20:17.010262" elapsed="0.028642"/>
</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-10-16T01:20:17.040004" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:17.039813" elapsed="0.000250">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:17.040145" 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-10-16T01:20:17.039479" elapsed="0.000688"/>
</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-10-16T01:20:17.040456" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:17.040229" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:20:17.041001" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:20:17.040737" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-16T01:20:17.040562" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:17.040212" elapsed="0.000866"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:17.041583" 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-10-16T01:20:17.041234" elapsed="0.000373"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:20:17.041652" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:20:17.041792" 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-manganese/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-10-16T01:20:17.039170" elapsed="0.002645"/>
</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-10-16T01:20:17.042920" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:17.042716" elapsed="0.000264">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:17.043062" 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-10-16T01:20:17.042364" elapsed="0.000721"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:20:17.043263" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:20:17.043149" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:17.043132" elapsed="0.000209"/>
</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-10-16T01:20:17.043492" elapsed="0.000020"/>
</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-10-16T01:20:17.043662" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:17.043753" elapsed="0.000016"/>
</return>
<msg time="2026-10-16T01:20:17.043880" 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-manganese/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-10-16T01:20:17.042056" elapsed="0.001846"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:17.045398" 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-10-16T01:20:17.045100" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:17.045862" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:17.045625" elapsed="0.000278"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:20:17.050426" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:20:17.050479" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:20:17.050575" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:17.046182" elapsed="0.004762">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:17.045962" elapsed="0.005060">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:17.051202" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:17.051052" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-10-16T01:20:17.045945" elapsed="0.005350">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:17.051628" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:17.051797" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:17.051763" elapsed="0.000073"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:17.051746" elapsed="0.000111"/>
</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-10-16T01:20:17.051994" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:20:17.052058" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:20:17.044394" elapsed="0.007765">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:17.052228" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:20:17.000367" elapsed="0.051999">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:20:17.052782" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:17.052539" elapsed="0.000327"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:17.052490" elapsed="0.000424"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:17.053000" elapsed="0.000037"/>
</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="FAIL" start="2026-10-16T01:20:16.998197" elapsed="0.054971">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:16.995095" elapsed="0.058186">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:20:16.995050" elapsed="0.058308">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:17.053606" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:20:17.053975" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:17.054301" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:20:17.054657" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:20:17.055116" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:20:17.055451" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:20:17.055829" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:20:17.056070" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:20:16.987207" elapsed="0.068964">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:20:17.056232" elapsed="0.000026"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:20:16.985395" elapsed="0.070940">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:17.056554" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:17.056414" elapsed="0.000190"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:17.056819" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:17.056626" elapsed="0.000245"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:17.057036" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:17.056894" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:17.056398" elapsed="0.000707"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:20:16.985041" elapsed="0.072103">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:20:16.984636" elapsed="0.072560">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:17.057255" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:20:16.976289" elapsed="0.081060">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:17.057520" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:17.057857" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:17.057598" elapsed="0.000311"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:17.057583" elapsed="0.000350"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:17.058057" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:17.058224" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:17.058298" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:20:16.974664" elapsed="0.083726">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:20:16.974188" elapsed="0.084263">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:20:16.973950" elapsed="0.084550">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:20:16.973158" elapsed="0.085424">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:17.058803" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:20:16.952133" elapsed="0.106774">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:20:18.067754" elapsed="0.000190"/>
</kw>
<msg time="2026-10-16T01:20:18.068002" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:18.067177" elapsed="0.000882"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:20:18.066781" elapsed="0.001349"/>
</kw>
<msg time="2026-10-16T01:20:18.068171" 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-10-16T01:20:18.063908" elapsed="0.004303"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:20:18.063516" elapsed="0.004996"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:18.069169" 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-10-16T01:20:18.068818" elapsed="0.000468"/>
</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-10-16T01:20:18.075868" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:18.075079" elapsed="0.000851"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:18.076917" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:18.076280" elapsed="0.000693"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:18.077069" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:20:18.077377" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:18.074272" elapsed="0.003158"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:20:18.077785" elapsed="0.000285"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:18.079167" 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-10-16T01:20:18.078461" elapsed="0.000762"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:18.080114" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:18.079570" elapsed="0.000598"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:18.081041" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:18.080498" elapsed="0.000597"/>
</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-10-16T01:20:18.089813" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:20:18.088393" elapsed="0.001531"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:20:18.090052" elapsed="0.000133"/>
</return>
<msg time="2026-10-16T01:20:18.090647" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:20:18.085102" elapsed="0.005843"/>
</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-10-16T01:20:18.114875" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:20:18.114424" elapsed="0.000487"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:20:18.115912" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:20:18.115590" elapsed="0.000422">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:18.116130" 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-10-16T01:20:18.115129" elapsed="0.001032"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:18.116865" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:18.116414" elapsed="0.000486"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:20:18.117299" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:20:18.117498" 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-10-16T01:20:18.117126" elapsed="0.000405"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:18.118121" 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-10-16T01:20:18.117813" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:18.119443" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:18.119200" elapsed="0.000283"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:20:18.119975" 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-10-16T01:20:18.119654" elapsed="0.000345"/>
</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-10-16T01:20:18.120299" 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-10-16T01:20:18.120482" elapsed="0.000022"/>
</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-10-16T01:20:18.120659" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:20:18.120157" elapsed="0.000569"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:20:18.120045" elapsed="0.000709"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:20:18.120795" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:20:18.120926" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:20:18.118842" elapsed="0.002106"/>
</kw>
<status status="PASS" start="2026-10-16T01:20:18.118453" elapsed="0.002524"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:18.121143" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:18.121001" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:18.118241" elapsed="0.002972"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:20:18.121778" 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-10-16T01:20:18.121380" elapsed="0.000423"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:20:18.121847" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:20:18.113695" elapsed="0.008249"/>
</kw>
<msg time="2026-10-16T01:20:18.121991" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:18.107979" elapsed="0.014057"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:18.125818" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:18.129568" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:18.133328" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:18.133502" elapsed="0.000019"/>
</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-10-16T01:20:18.133677" elapsed="0.000032"/>
</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-10-16T01:20:18.134025" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:18.133886" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:18.133873" elapsed="0.000225"/>
</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-10-16T01:20:18.134248" elapsed="0.000092"/>
</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-10-16T01:20:18.134498" elapsed="0.000018"/>
</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-10-16T01:20:18.134690" elapsed="0.000034"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:20:18.133847" elapsed="0.000907"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:20:18.133758" elapsed="0.001019"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:18.134925" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:18.134993" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:20:18.135096" 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-10-16T01:20:18.107070" elapsed="0.028049"/>
</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-10-16T01:20:18.136212" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:18.136022" elapsed="0.000263">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:18.136402" 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-10-16T01:20:18.135685" 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-10-16T01:20:18.136718" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:18.136489" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:20:18.137223" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:20:18.136961" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-16T01:20:18.136795" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:18.136472" elapsed="0.000843"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:18.137824" 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-10-16T01:20:18.137471" elapsed="0.000378"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:20:18.137894" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:20:18.138017" 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-manganese/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-10-16T01:20:18.135390" elapsed="0.002651"/>
</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-10-16T01:20:18.140597" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:18.138929" elapsed="0.001729">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:18.140761" 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-10-16T01:20:18.138592" elapsed="0.002193"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:20:18.140951" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:20:18.140852" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:18.140835" elapsed="0.000194"/>
</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-10-16T01:20:18.141180" 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-10-16T01:20:18.141365" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:18.141427" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:20:18.141554" 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-manganese/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-10-16T01:20:18.138297" elapsed="0.003280"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:18.142812" 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-10-16T01:20:18.142568" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:18.143308" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:18.143072" elapsed="0.000278"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:20:18.147525" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:20:18.147577" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:20:18.147680" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:18.143634" elapsed="0.004419">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:18.143411" elapsed="0.004718">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:18.148322" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:18.148160" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-10-16T01:20:18.143394" elapsed="0.005011">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:18.148756" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:18.148878" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:18.148844" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:18.148828" elapsed="0.000109"/>
</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-10-16T01:20:18.149077" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:20:18.149140" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:20:18.141862" elapsed="0.007379">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:18.149324" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:20:18.097001" elapsed="0.052463">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:20:18.149881" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:18.149633" elapsed="0.000332"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:18.149585" elapsed="0.000423"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:18.150111" elapsed="0.000038"/>
</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="FAIL" start="2026-10-16T01:20:18.094828" elapsed="0.055524">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:18.091426" elapsed="0.059029">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:20:18.091384" elapsed="0.059146">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:18.150796" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:20:18.151275" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:18.151591" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:20:18.151968" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:20:18.152406" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:20:18.152745" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:20:18.153090" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:20:18.153345" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:20:18.083788" elapsed="0.069657">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:20:18.153507" elapsed="0.000014"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:20:18.081943" elapsed="0.071650">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:18.153833" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:18.153671" elapsed="0.000213"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:18.154041" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:18.153906" elapsed="0.000183"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:18.154250" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:18.154111" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:18.153655" elapsed="0.000678"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:20:18.081581" elapsed="0.072789">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:20:18.081189" elapsed="0.073233">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:18.154470" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:20:18.072900" elapsed="0.081659">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:18.154813" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:18.155030" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:18.154893" elapsed="0.000184"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:18.154877" elapsed="0.000221"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:18.155220" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:18.155396" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:18.155454" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:20:18.071250" elapsed="0.084294">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:20:18.070800" elapsed="0.084805">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:20:18.070525" elapsed="0.085169">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:20:18.069764" elapsed="0.086091">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:18.156064" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:20:18.059552" elapsed="0.096615">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:20:19.175044" elapsed="0.000415"/>
</kw>
<msg time="2026-10-16T01:20:19.175569" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:19.173686" elapsed="0.001997"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:20:19.172778" elapsed="0.003238"/>
</kw>
<msg time="2026-10-16T01:20:19.176112" 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-10-16T01:20:19.166221" elapsed="0.009987"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:20:19.165365" elapsed="0.011017"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:19.177449" 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-10-16T01:20:19.176907" elapsed="0.000636"/>
</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-10-16T01:20:19.184122" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:19.183346" elapsed="0.000836"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:19.185192" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:19.184543" elapsed="0.000704"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:19.185365" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:20:19.185656" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:19.182512" elapsed="0.003224"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:20:19.186071" elapsed="0.000311"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:19.187492" 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-10-16T01:20:19.186785" elapsed="0.000764"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:19.188450" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:19.187914" elapsed="0.000591"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:19.189378" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:19.188848" elapsed="0.000585"/>
</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-10-16T01:20:19.198148" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:20:19.196782" elapsed="0.001474"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:20:19.198409" elapsed="0.000134"/>
</return>
<msg time="2026-10-16T01:20:19.199014" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:20:19.193495" elapsed="0.005649"/>
</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-10-16T01:20:19.222378" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:20:19.221929" elapsed="0.000487"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:20:19.223398" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:20:19.223100" elapsed="0.000390">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:19.223608" 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-10-16T01:20:19.222631" elapsed="0.001010"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:19.224355" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:19.223901" elapsed="0.000490"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:20:19.224799" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:20:19.224988" 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-10-16T01:20:19.224619" elapsed="0.000403"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:19.225617" 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-10-16T01:20:19.225305" elapsed="0.000370"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:19.226957" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:19.226615" elapsed="0.000383"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:20:19.227586" 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-10-16T01:20:19.227171" elapsed="0.000441"/>
</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-10-16T01:20:19.227913" 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-10-16T01:20:19.228100" elapsed="0.000022"/>
</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-10-16T01:20:19.228293" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:20:19.227782" elapsed="0.000564"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:20:19.227657" elapsed="0.000717"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:20:19.228415" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:20:19.228546" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:20:19.226129" elapsed="0.002441"/>
</kw>
<status status="PASS" start="2026-10-16T01:20:19.225785" elapsed="0.002814"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:19.228783" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:19.228623" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:19.225760" elapsed="0.003095"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:20:19.229412" 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-10-16T01:20:19.229010" elapsed="0.000429"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:20:19.229483" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:20:19.221190" elapsed="0.008394"/>
</kw>
<msg time="2026-10-16T01:20:19.229631" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:19.215490" elapsed="0.014188"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:19.233516" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:19.237362" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:19.241168" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:19.241357" elapsed="0.000020"/>
</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-10-16T01:20:19.241538" 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-10-16T01:20:19.241901" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:19.241758" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:19.241743" 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-10-16T01:20:19.242129" elapsed="0.000019"/>
</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-10-16T01:20:19.242317" 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-10-16T01:20:19.242481" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:20:19.241715" elapsed="0.000815"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:20:19.241607" elapsed="0.000947"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:19.242718" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:19.242788" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:20:19.242895" 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-10-16T01:20:19.214624" elapsed="0.028295"/>
</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-10-16T01:20:19.244032" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:19.243839" elapsed="0.000253">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:19.244175" 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-10-16T01:20:19.243494" elapsed="0.000704"/>
</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-10-16T01:20:19.244491" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:19.244273" elapsed="0.000270"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:20:19.245015" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:20:19.244742" elapsed="0.000298"/>
</kw>
<status status="PASS" start="2026-10-16T01:20:19.244566" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:19.244245" elapsed="0.000849"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:19.245605" 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-10-16T01:20:19.245251" elapsed="0.000410"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:20:19.245725" elapsed="0.000028"/>
</return>
<msg time="2026-10-16T01:20:19.245854" 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-manganese/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-10-16T01:20:19.243181" elapsed="0.002697"/>
</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-10-16T01:20:19.246964" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:19.246774" elapsed="0.000249">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:19.247107" 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-10-16T01:20:19.246439" elapsed="0.000691"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:20:19.247304" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:20:19.247194" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:19.247177" elapsed="0.000205"/>
</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-10-16T01:20:19.247532" 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-10-16T01:20:19.247720" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:19.247782" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:20:19.247908" 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-manganese/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-10-16T01:20:19.246125" elapsed="0.001807"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:19.249362" 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-10-16T01:20:19.249118" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:19.249830" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:19.249593" elapsed="0.000278"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:20:19.254230" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:20:19.254295" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:20:19.254391" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:19.250153" elapsed="0.004610">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:19.249931" elapsed="0.004912">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:19.255028" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:19.254874" elapsed="0.000212"/>
</branch>
<status status="FAIL" start="2026-10-16T01:20:19.249915" elapsed="0.005193">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:19.255460" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:19.255579" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:19.255546" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:19.255530" elapsed="0.000107"/>
</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-10-16T01:20:19.255791" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:20:19.255885" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:20:19.248399" elapsed="0.007627">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:19.256121" elapsed="0.000020"/>
</return>
<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="FAIL" start="2026-10-16T01:20:19.204907" elapsed="0.051410">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:20:19.256889" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:19.256553" elapsed="0.000458"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:19.256488" elapsed="0.000581"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:19.257184" elapsed="0.000049"/>
</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="FAIL" start="2026-10-16T01:20:19.202743" elapsed="0.054692">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:19.199624" elapsed="0.057950">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:20:19.199581" elapsed="0.058096">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:19.258047" elapsed="0.000033"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:20:19.258563" elapsed="0.000030"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:19.259027" elapsed="0.000029"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:20:19.259525" elapsed="0.000031"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:20:19.260153" elapsed="0.000031"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:20:19.260603" elapsed="0.000028"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:20:19.261124" elapsed="0.000028"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:20:19.261471" elapsed="0.000025"/>
</return>
<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="FAIL" start="2026-10-16T01:20:19.192156" elapsed="0.069460">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:20:19.261786" elapsed="0.000024"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:20:19.190288" elapsed="0.071631">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:19.262231" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:19.262031" elapsed="0.000288"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:19.262544" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:19.262351" elapsed="0.000263"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:19.262967" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:19.262645" elapsed="0.000391"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:19.262009" elapsed="0.001101"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:20:19.189941" elapsed="0.073228">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:20:19.189531" elapsed="0.073714">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:19.263332" elapsed="0.000022"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:20:19.181134" elapsed="0.082329">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:19.263732" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:19.264043" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:19.263846" elapsed="0.000264"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:19.263825" elapsed="0.000317"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:19.264335" elapsed="0.000028"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:19.264575" elapsed="0.000026"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:19.264658" elapsed="0.000020"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:20:19.179535" elapsed="0.085274">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:20:19.179069" elapsed="0.085828">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:20:19.178831" elapsed="0.086137">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:20:19.178044" elapsed="0.087038">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:19.265391" elapsed="0.000032"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:20:19.156867" elapsed="0.108672">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:20:20.284751" elapsed="0.000395"/>
</kw>
<msg time="2026-10-16T01:20:20.285260" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:20.283459" elapsed="0.001945"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:20:20.282475" elapsed="0.003089"/>
</kw>
<msg time="2026-10-16T01:20:20.285654" 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-10-16T01:20:20.275931" elapsed="0.009846"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:20:20.275043" elapsed="0.010888"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:20.286976" 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-10-16T01:20:20.286429" elapsed="0.000641"/>
</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-10-16T01:20:20.293810" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:20.293007" elapsed="0.000863"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:20.294882" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:20.294208" elapsed="0.000729"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:20.295033" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:20:20.295383" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:20.292160" elapsed="0.003279"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:20:20.295919" elapsed="0.000310"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:20.297356" 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-10-16T01:20:20.296620" elapsed="0.000796"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:20.298305" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:20.297775" elapsed="0.000587"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:20.299206" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:20.298671" elapsed="0.000588"/>
</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-10-16T01:20:20.307979" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:20:20.306548" elapsed="0.001542"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:20:20.308217" elapsed="0.000158"/>
</return>
<msg time="2026-10-16T01:20:20.308858" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:20:20.303326" elapsed="0.005659"/>
</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-10-16T01:20:20.333048" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:20:20.332593" elapsed="0.000492"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:20:20.334058" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:20:20.333779" elapsed="0.000372">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:20.334284" 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-10-16T01:20:20.333318" elapsed="0.001001"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:20.335008" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:20.334554" elapsed="0.000489"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:20:20.335442" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:20:20.335626" 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-10-16T01:20:20.335267" elapsed="0.000392"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:20.336264" 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-10-16T01:20:20.335951" elapsed="0.000388"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:20.337799" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:20.337257" elapsed="0.000601"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:20:20.338355" 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-10-16T01:20:20.338088" 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-10-16T01:20:20.338658" 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-10-16T01:20:20.338857" 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-10-16T01:20:20.339114" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:20:20.338531" elapsed="0.000636"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:20:20.338423" elapsed="0.000772"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:20:20.339236" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:20:20.339382" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:20:20.336789" elapsed="0.002616"/>
</kw>
<status status="PASS" start="2026-10-16T01:20:20.336423" elapsed="0.003012"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:20.339604" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:20.339459" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:20.336400" elapsed="0.003276"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:20:20.340229" 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-10-16T01:20:20.339845" elapsed="0.000409"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:20:20.340311" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:20:20.331879" elapsed="0.008533"/>
</kw>
<msg time="2026-10-16T01:20:20.340459" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:20.326303" elapsed="0.014202"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:20.344280" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:20.348031" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:20.351787" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:20.351963" elapsed="0.000020"/>
</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-10-16T01:20:20.352142" elapsed="0.000019"/>
</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-10-16T01:20:20.352494" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:20.352352" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:20.352338" elapsed="0.000229"/>
</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-10-16T01:20:20.352732" 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-10-16T01:20:20.352911" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:20.353072" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:20:20.352311" elapsed="0.000810"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:20:20.352209" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:20.353339" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:20.353410" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:20:20.353516" 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-10-16T01:20:20.325443" elapsed="0.028097"/>
</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-10-16T01:20:20.354632" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:20.354442" elapsed="0.000250">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:20.354792" 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-10-16T01:20:20.354112" elapsed="0.000704"/>
</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-10-16T01:20:20.355097" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:20.354879" elapsed="0.000271"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:20:20.355623" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:20:20.355357" elapsed="0.000290"/>
</kw>
<status status="PASS" start="2026-10-16T01:20:20.355173" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:20.354862" elapsed="0.000856"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:20.356211" 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-10-16T01:20:20.355876" elapsed="0.000359"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:20:20.356292" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:20:20.356416" 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-manganese/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-10-16T01:20:20.353816" elapsed="0.002623"/>
</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-10-16T01:20:20.357532" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:20.357338" elapsed="0.000253">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:20.357673" 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-10-16T01:20:20.357013" elapsed="0.000698"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:20:20.357883" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:20:20.357776" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:20.357760" elapsed="0.000200"/>
</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-10-16T01:20:20.358107" elapsed="0.000020"/>
</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-10-16T01:20:20.358290" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:20.358351" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:20:20.358475" 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-manganese/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-10-16T01:20:20.356681" elapsed="0.001817"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:20.359895" 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-10-16T01:20:20.359654" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:20.360353" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:20.360123" elapsed="0.000270"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:20:20.364767" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:20:20.364856" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:20:20.364954" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:20.360673" elapsed="0.004645">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:20.360452" elapsed="0.004943">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:20.365575" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:20.365426" elapsed="0.000208"/>
</branch>
<status status="FAIL" start="2026-10-16T01:20:20.360436" elapsed="0.005220">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:20.366002" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:20.366122" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:20.366088" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:20.366072" elapsed="0.000109"/>
</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-10-16T01:20:20.366326" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:20:20.366389" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:20:20.358947" elapsed="0.007543">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:20.366558" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:20:20.315881" elapsed="0.050805">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:20:20.367110" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:20.366888" elapsed="0.000304"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:20.366839" elapsed="0.000395"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:20.367335" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:20:20.313416" elapsed="0.054086">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:20.309463" elapsed="0.058139">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:20:20.309421" elapsed="0.058256">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:20.367944" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:20:20.368302" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:20.368619" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:20:20.368986" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:20:20.369462" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:20:20.369794" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:20:20.370147" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:20:20.370405" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:20:20.301960" elapsed="0.068548">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:20:20.370570" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:20:20.300107" elapsed="0.070554">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:20.370915" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:20.370771" elapsed="0.000194"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:20.371125" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:20.370988" elapsed="0.000186"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:20.371352" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:20.371196" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:20.370754" elapsed="0.000668"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:20:20.299775" elapsed="0.071685">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:20:20.299375" elapsed="0.072138">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:20.371562" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:20:20.290634" elapsed="0.081020">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:20.371846" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:20.372065" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:20.371925" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:20.371910" elapsed="0.000226"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:20.372261" elapsed="0.000031"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:20.372457" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:20.372517" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:20:20.289048" elapsed="0.083561">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:20:20.288569" elapsed="0.084103">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:20:20.288328" elapsed="0.084409">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:20:20.287540" elapsed="0.085280">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:20.373062" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:20:20.266326" elapsed="0.106843">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:20:21.392074" elapsed="0.000416"/>
</kw>
<msg time="2026-10-16T01:20:21.392601" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:21.390828" elapsed="0.001915"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:20:21.389803" elapsed="0.003099"/>
</kw>
<msg time="2026-10-16T01:20:21.392993" 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-10-16T01:20:21.383179" elapsed="0.009903"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:20:21.382327" elapsed="0.010902"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:21.394269" 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-10-16T01:20:21.393755" elapsed="0.000629"/>
</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-10-16T01:20:21.400901" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:21.400122" elapsed="0.000836"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:21.401942" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:21.401312" elapsed="0.000684"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:21.402088" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:20:21.402394" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:21.399309" elapsed="0.003137"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:20:21.402805" elapsed="0.000281"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:21.404181" 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-10-16T01:20:21.403479" elapsed="0.000759"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:21.405124" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:21.404588" elapsed="0.000589"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:21.406040" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:21.405508" elapsed="0.000586"/>
</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-10-16T01:20:21.414642" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:20:21.413272" elapsed="0.001512"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:20:21.414912" elapsed="0.000134"/>
</return>
<msg time="2026-10-16T01:20:21.415492" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:20:21.410053" elapsed="0.005565"/>
</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-10-16T01:20:21.439111" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:20:21.438660" elapsed="0.000488"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:20:21.440213" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:20:21.439929" elapsed="0.000394">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:21.440441" 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-10-16T01:20:21.439451" elapsed="0.001023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:21.441165" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:21.440731" elapsed="0.000471"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:20:21.441605" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:20:21.441814" 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-10-16T01:20:21.441448" elapsed="0.000400"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:21.442437" 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-10-16T01:20:21.442113" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:21.443942" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:21.443599" elapsed="0.000400"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:20:21.444603" 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-10-16T01:20:21.444240" elapsed="0.000397"/>
</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-10-16T01:20:21.445046" elapsed="0.000028"/>
</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-10-16T01:20:21.445235" elapsed="0.000021"/>
</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-10-16T01:20:21.445427" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:20:21.444868" elapsed="0.000610"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:20:21.444697" elapsed="0.000809"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:20:21.445546" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:20:21.445673" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:20:21.443115" elapsed="0.002581"/>
</kw>
<status status="PASS" start="2026-10-16T01:20:21.442758" elapsed="0.002983"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:21.445911" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:21.445766" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:21.442555" elapsed="0.003425"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:20:21.446527" 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-10-16T01:20:21.446133" elapsed="0.000419"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:20:21.446595" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:20:21.437952" elapsed="0.008740"/>
</kw>
<msg time="2026-10-16T01:20:21.446755" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:21.432367" elapsed="0.014434"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:21.450538" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:21.454258" elapsed="0.000035"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:21.458037" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:21.458214" elapsed="0.000019"/>
</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-10-16T01:20:21.458403" elapsed="0.000019"/>
</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-10-16T01:20:21.458753" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:21.458599" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:21.458586" 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-10-16T01:20:21.458976" elapsed="0.000019"/>
</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-10-16T01:20:21.459151" elapsed="0.000018"/>
</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-10-16T01:20:21.459321" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:20:21.458560" elapsed="0.000811"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:20:21.458471" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:21.459542" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:21.459609" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:20:21.459726" 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-10-16T01:20:21.431503" elapsed="0.028247"/>
</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-10-16T01:20:21.460838" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:21.460632" elapsed="0.000266">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:21.460981" 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-10-16T01:20:21.460313" elapsed="0.000690"/>
</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-10-16T01:20:21.461290" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:21.461065" elapsed="0.000278"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:20:21.461802" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:20:21.461524" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-16T01:20:21.461366" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:21.461049" elapsed="0.000830"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:21.462382" 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-10-16T01:20:21.462035" elapsed="0.000371"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:20:21.462451" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:20:21.462573" 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-manganese/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-10-16T01:20:21.460007" elapsed="0.002589"/>
</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-10-16T01:20:21.465247" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:21.463507" elapsed="0.001828">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:21.465434" 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-10-16T01:20:21.463177" elapsed="0.002281"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:20:21.465645" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-16T01:20:21.465534" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:21.465512" elapsed="0.000231"/>
</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-10-16T01:20:21.465923" 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-10-16T01:20:21.466099" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:21.466161" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:20:21.466308" 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-manganese/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-10-16T01:20:21.462883" elapsed="0.003450"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:21.467624" 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-10-16T01:20:21.467374" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:21.468094" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:21.467870" elapsed="0.000266"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:20:21.472487" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:20:21.472540" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:20:21.472641" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:21.468433" elapsed="0.004590">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:21.468197" elapsed="0.004903">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:21.473297" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:21.473132" elapsed="0.000226"/>
</branch>
<status status="FAIL" start="2026-10-16T01:20:21.468180" elapsed="0.005200">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:21.473737" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:21.473861" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:21.473827" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:21.473810" elapsed="0.000110"/>
</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-10-16T01:20:21.474057" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:20:21.474121" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:20:21.466626" elapsed="0.007598">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:21.474355" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:20:21.421990" elapsed="0.052514">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:20:21.474920" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:21.474674" elapsed="0.000331"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:21.474627" elapsed="0.000421"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:21.475133" elapsed="0.000037"/>
</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="FAIL" start="2026-10-16T01:20:21.419851" elapsed="0.055462">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:21.416507" elapsed="0.058908">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:20:21.416461" elapsed="0.059028">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:21.475757" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:20:21.476128" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:21.476458" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:20:21.476829" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:20:21.477262" elapsed="0.000035"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:20:21.477595" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:20:21.477970" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:20:21.478216" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:20:21.408748" elapsed="0.069582">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:20:21.478394" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:20:21.406936" elapsed="0.071548">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:21.478728" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:21.478566" elapsed="0.000215"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:21.478943" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:21.478804" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:21.479158" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:21.479015" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:21.478550" elapsed="0.000678"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:20:21.406578" elapsed="0.072690">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:20:21.406189" elapsed="0.073146">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:21.479386" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:20:21.397943" elapsed="0.081569">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:21.479692" elapsed="0.000140"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:21.480039" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:21.479895" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:21.479879" elapsed="0.000231"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:21.480237" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:21.480419" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:21.480480" elapsed="0.000015"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:20:21.396348" elapsed="0.084226">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:20:21.395883" elapsed="0.084755">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:20:21.395615" elapsed="0.085073">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:20:21.394856" elapsed="0.085939">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:21.481006" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:20:21.373941" elapsed="0.107176">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:20:22.500220" elapsed="0.000426"/>
</kw>
<msg time="2026-10-16T01:20:22.500799" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:22.498975" elapsed="0.001941"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:20:22.498037" elapsed="0.003036"/>
</kw>
<msg time="2026-10-16T01:20:22.501163" 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-10-16T01:20:22.491417" elapsed="0.009834"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:20:22.490551" elapsed="0.010865"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:22.502447" 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-10-16T01:20:22.501918" elapsed="0.000620"/>
</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-10-16T01:20:22.509176" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:22.508394" elapsed="0.000839"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:22.510224" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:22.509592" elapsed="0.000686"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:22.510500" elapsed="0.000066"/>
</return>
<msg time="2026-10-16T01:20:22.510832" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:22.507569" elapsed="0.003314"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:20:22.511211" elapsed="0.000313"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:22.512603" 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-10-16T01:20:22.511920" elapsed="0.000738"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:22.513593" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:22.513054" elapsed="0.000592"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:22.514515" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:22.513995" elapsed="0.000572"/>
</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-10-16T01:20:22.523205" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:20:22.521857" elapsed="0.001475"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:20:22.523458" elapsed="0.000130"/>
</return>
<msg time="2026-10-16T01:20:22.524271" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:20:22.518597" elapsed="0.005856"/>
</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-10-16T01:20:22.549361" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:20:22.548896" elapsed="0.000504"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:20:22.550432" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:20:22.550109" elapsed="0.000420">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:22.550649" 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-10-16T01:20:22.549623" elapsed="0.001060"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:22.551428" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:22.550958" elapsed="0.000507"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:20:22.551884" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:20:22.552084" 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-10-16T01:20:22.551696" elapsed="0.000422"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:22.552756" 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-10-16T01:20:22.552407" elapsed="0.000409"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:22.554110" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:22.553777" elapsed="0.000375"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:20:22.554761" 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-10-16T01:20:22.554343" elapsed="0.000445"/>
</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-10-16T01:20:22.555082" elapsed="0.000020"/>
</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-10-16T01:20:22.555270" elapsed="0.000037"/>
</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-10-16T01:20:22.555472" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:20:22.554948" elapsed="0.000577"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:20:22.554835" elapsed="0.000719"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:20:22.555598" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:20:22.555792" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:20:22.553261" elapsed="0.002557"/>
</kw>
<status status="PASS" start="2026-10-16T01:20:22.552906" elapsed="0.002942"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:22.556024" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:22.555874" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:22.552881" elapsed="0.003216"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:20:22.556723" 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-10-16T01:20:22.556255" elapsed="0.000496"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:20:22.556798" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:20:22.548151" elapsed="0.008749"/>
</kw>
<msg time="2026-10-16T01:20:22.556949" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:22.542417" elapsed="0.014581"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:22.560833" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:22.564720" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:22.568533" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:22.568732" 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-10-16T01:20:22.568919" 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-10-16T01:20:22.569263" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:22.569120" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:22.569107" 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-10-16T01:20:22.569510" 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-10-16T01:20:22.569691" elapsed="0.000035"/>
</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-10-16T01:20:22.569871" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:20:22.569081" elapsed="0.000840"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:20:22.568989" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:22.570096" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:22.570165" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:20:22.570272" 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-10-16T01:20:22.541540" elapsed="0.028772"/>
</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-10-16T01:20:22.571478" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:22.571267" elapsed="0.000272">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:22.571623" 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-10-16T01:20:22.570937" elapsed="0.000710"/>
</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-10-16T01:20:22.571953" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:22.571732" elapsed="0.000275"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:20:22.572496" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:20:22.572204" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-10-16T01:20:22.572030" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:22.571693" elapsed="0.000884"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:22.573106" 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-10-16T01:20:22.572753" elapsed="0.000379"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:20:22.573180" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:20:22.573326" 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-manganese/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-10-16T01:20:22.570619" elapsed="0.002733"/>
</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-10-16T01:20:22.574497" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:22.574279" elapsed="0.000280">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:22.574646" 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-10-16T01:20:22.573948" elapsed="0.000722"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:20:22.574861" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:20:22.574754" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:22.574736" elapsed="0.000204"/>
</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-10-16T01:20:22.575094" elapsed="0.000020"/>
</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-10-16T01:20:22.575271" elapsed="0.000042"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:22.575361" elapsed="0.000016"/>
</return>
<msg time="2026-10-16T01:20:22.575493" 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-manganese/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-10-16T01:20:22.573604" elapsed="0.001914"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:22.576993" 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-10-16T01:20:22.576756" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:22.577478" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:22.577230" 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-10-16T01:20:22.581867" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:20:22.581923" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:20:22.582055" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:22.577832" elapsed="0.004594">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:22.577584" elapsed="0.004922">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:22.582693" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:22.582539" elapsed="0.000232"/>
</branch>
<status status="FAIL" start="2026-10-16T01:20:22.577567" elapsed="0.005228">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:22.583155" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:22.583284" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:22.583248" elapsed="0.000095"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:22.583230" elapsed="0.000135"/>
</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-10-16T01:20:22.583507" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:20:22.583574" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:20:22.576003" elapsed="0.007677">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:22.583771" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:20:22.531454" elapsed="0.052452">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:20:22.584334" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:22.584082" elapsed="0.000341"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:22.584032" elapsed="0.000436"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:22.584558" elapsed="0.000038"/>
</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="FAIL" start="2026-10-16T01:20:22.528802" elapsed="0.055950">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:22.524941" elapsed="0.059920">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:20:22.524899" elapsed="0.060040">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:22.585200" elapsed="0.000025"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:20:22.585578" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:22.585925" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:20:22.586299" elapsed="0.000025"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:20:22.586764" elapsed="0.000024"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:20:22.587090" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:20:22.587465" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:20:22.587786" elapsed="0.000019"/>
</return>
<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="FAIL" start="2026-10-16T01:20:22.517279" elapsed="0.070620">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:20:22.587985" elapsed="0.000021"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:20:22.515427" elapsed="0.072684">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:22.588436" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:22.588225" elapsed="0.000283"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:22.588754" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:22.588540" elapsed="0.000280"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:22.589028" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:22.588849" elapsed="0.000237"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:22.588202" elapsed="0.000910"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:20:22.515073" elapsed="0.074087">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:20:22.514666" elapsed="0.074557">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:22.589282" elapsed="0.000030"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:20:22.506202" elapsed="0.083208">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:22.589628" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:22.590027" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:22.589851" elapsed="0.000233"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:22.589829" elapsed="0.000281"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:22.590264" elapsed="0.000035"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:22.590489" elapsed="0.000023"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:22.590560" elapsed="0.000016"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:20:22.504551" elapsed="0.086123">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:20:22.504058" elapsed="0.086712">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:20:22.503812" elapsed="0.087028">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:20:22.503005" elapsed="0.087934">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:22.591196" elapsed="0.000026"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:20:22.481903" elapsed="0.109437">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:20:23.610963" elapsed="0.000437"/>
</kw>
<msg time="2026-10-16T01:20:23.611517" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:23.609610" elapsed="0.002027"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:20:23.608575" elapsed="0.003259"/>
</kw>
<msg time="2026-10-16T01:20:23.611930" 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-10-16T01:20:23.601857" elapsed="0.010169"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:20:23.600941" elapsed="0.011239"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:23.613265" 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-10-16T01:20:23.612686" elapsed="0.000701"/>
</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-10-16T01:20:23.620194" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:23.619392" elapsed="0.000865"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:23.621322" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:23.620628" elapsed="0.000756"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:23.621483" elapsed="0.000063"/>
</return>
<msg time="2026-10-16T01:20:23.621816" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:23.618526" elapsed="0.003344"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:20:23.622207" elapsed="0.000316"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:23.623658" 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-10-16T01:20:23.622928" elapsed="0.000821"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:23.624644" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:23.624086" elapsed="0.000646"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:23.625610" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:23.625054" elapsed="0.000612"/>
</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-10-16T01:20:23.634736" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:20:23.633224" elapsed="0.001634"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:20:23.634994" elapsed="0.000140"/>
</return>
<msg time="2026-10-16T01:20:23.635444" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:20:23.629853" elapsed="0.005674"/>
</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-10-16T01:20:23.658626" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:20:23.658169" elapsed="0.000494"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:20:23.659687" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:20:23.659390" elapsed="0.000419">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:23.659925" 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-10-16T01:20:23.658902" elapsed="0.001055"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:23.660740" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:23.660264" elapsed="0.000513"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:20:23.661163" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:20:23.661376" 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-10-16T01:20:23.661003" elapsed="0.000407"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:23.662006" 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-10-16T01:20:23.661674" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:23.663139" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:23.662767" elapsed="0.000414"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:20:23.663619" 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-10-16T01:20:23.663366" elapsed="0.000277"/>
</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-10-16T01:20:23.663945" 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-10-16T01:20:23.664127" elapsed="0.000022"/>
</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-10-16T01:20:23.664368" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:20:23.663818" elapsed="0.000603"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:20:23.663689" elapsed="0.000760"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:20:23.664490" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:20:23.664622" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:20:23.662421" elapsed="0.002224"/>
</kw>
<status status="PASS" start="2026-10-16T01:20:23.662152" elapsed="0.002521"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:23.664862" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:23.664712" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:23.662127" elapsed="0.002805"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:20:23.665492" 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-10-16T01:20:23.665092" elapsed="0.000425"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:20:23.665561" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:20:23.657448" elapsed="0.008212"/>
</kw>
<msg time="2026-10-16T01:20:23.665722" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:23.651348" elapsed="0.014423"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:23.669539" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:23.673357" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:23.677101" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:23.677328" 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-10-16T01:20:23.677507" elapsed="0.000019"/>
</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-10-16T01:20:23.677861" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:23.677718" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:23.677690" elapsed="0.000244"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:23.678086" elapsed="0.000019"/>
</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-10-16T01:20:23.678263" elapsed="0.000018"/>
</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-10-16T01:20:23.678436" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:20:23.677664" elapsed="0.000821"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:20:23.677574" elapsed="0.000934"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:23.678656" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:23.678740" elapsed="0.000016"/>
</return>
<msg time="2026-10-16T01:20:23.678846" 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-10-16T01:20:23.650443" elapsed="0.028426"/>
</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-10-16T01:20:23.679968" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:23.679772" elapsed="0.000257">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:23.680112" 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-10-16T01:20:23.679436" elapsed="0.000698"/>
</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-10-16T01:20:23.680421" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:23.680195" elapsed="0.000279"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:20:23.680952" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:20:23.680665" elapsed="0.000311"/>
</kw>
<status status="PASS" start="2026-10-16T01:20:23.680496" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:23.680179" elapsed="0.000849"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:23.681536" 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-10-16T01:20:23.681183" elapsed="0.000377"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:20:23.681606" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:20:23.681746" 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-manganese/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-10-16T01:20:23.679129" elapsed="0.002640"/>
</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-10-16T01:20:23.682860" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:23.682634" elapsed="0.000285">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:23.683003" 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-10-16T01:20:23.682319" elapsed="0.000706"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:20:23.683344" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:20:23.683227" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:23.683208" elapsed="0.000213"/>
</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-10-16T01:20:23.683570" elapsed="0.000020"/>
</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-10-16T01:20:23.683765" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:23.683826" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:20:23.683949" 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-manganese/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-10-16T01:20:23.682010" elapsed="0.001962"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:23.685361" 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-10-16T01:20:23.685124" elapsed="0.000278"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:23.685821" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:23.685587" elapsed="0.000274"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:20:23.689725" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:20:23.689779" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:20:23.689874" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:23.686140" elapsed="0.004089">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:23.685920" elapsed="0.004400">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:23.690502" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:23.690352" elapsed="0.000208"/>
</branch>
<status status="FAIL" start="2026-10-16T01:20:23.685903" elapsed="0.004679">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:23.690938" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:23.691058" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:23.691025" elapsed="0.000069"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:23.691009" elapsed="0.000105"/>
</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-10-16T01:20:23.691256" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:20:23.691331" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:20:23.684417" elapsed="0.007017">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:23.691500" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:20:23.640580" elapsed="0.051059">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:20:23.692051" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:23.691832" elapsed="0.000332"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:23.691784" elapsed="0.000427"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:23.692312" elapsed="0.000039"/>
</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="FAIL" start="2026-10-16T01:20:23.638349" elapsed="0.054133">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:23.635973" elapsed="0.056608">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:20:23.635945" elapsed="0.056708">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:23.692917" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:20:23.693263" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:23.693593" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:20:23.693962" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:20:23.694406" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:20:23.694740" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:20:23.695088" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:20:23.695339" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:20:23.628439" elapsed="0.067002">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:20:23.695501" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:20:23.626542" elapsed="0.069047">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:23.695827" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:23.695667" elapsed="0.000212"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:23.696037" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:23.695901" elapsed="0.000184"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:23.696247" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:23.696107" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:23.695651" elapsed="0.000677"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:20:23.626178" elapsed="0.070189">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:20:23.625796" elapsed="0.070624">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:23.696469" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:20:23.617085" elapsed="0.079477">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:23.696814" elapsed="0.000050"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:23.697070" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:23.696928" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:23.696912" elapsed="0.000228"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:23.697266" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:23.697454" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:23.697512" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:20:23.615429" elapsed="0.082177">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:20:23.614946" elapsed="0.082723">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:20:23.614665" elapsed="0.083128">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:20:23.613880" elapsed="0.083999">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:23.698090" elapsed="0.000021"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:20:23.592199" elapsed="0.105995">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:20:24.707034" elapsed="0.000195"/>
</kw>
<msg time="2026-10-16T01:20:24.707293" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:24.706468" elapsed="0.000899"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:20:24.706057" elapsed="0.001381"/>
</kw>
<msg time="2026-10-16T01:20:24.707478" 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-10-16T01:20:24.703053" elapsed="0.004465"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:20:24.702658" elapsed="0.004926"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:24.708054" 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-10-16T01:20:24.707821" elapsed="0.000274"/>
</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-10-16T01:20:24.710990" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:24.710639" elapsed="0.000376"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:24.711449" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:24.711166" elapsed="0.000307"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:24.711517" elapsed="0.000029"/>
</return>
<msg time="2026-10-16T01:20:24.711647" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:24.710272" elapsed="0.001398"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:20:24.711833" elapsed="0.000132"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:24.712542" 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-10-16T01:20:24.712130" elapsed="0.000438"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:24.712960" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:24.712730" elapsed="0.000254"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:24.713357" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:24.713122" 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-10-16T01:20:24.717181" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:20:24.716574" elapsed="0.000655"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:20:24.717286" elapsed="0.000074"/>
</return>
<msg time="2026-10-16T01:20:24.717554" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:20:24.715128" elapsed="0.002484"/>
</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-10-16T01:20:24.733661" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:20:24.733357" elapsed="0.000329"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:20:24.734409" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:20:24.734177" elapsed="0.000304">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:24.734564" 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-10-16T01:20:24.733861" elapsed="0.000725"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:24.735078" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:24.734769" elapsed="0.000334"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:20:24.735394" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:20:24.735541" 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-10-16T01:20:24.735266" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:24.735998" 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-10-16T01:20:24.735776" elapsed="0.000263"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:24.737064" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:24.736833" elapsed="0.000271"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:20:24.737546" 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-10-16T01:20:24.737281" 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-10-16T01:20:24.737868" elapsed="0.000020"/>
</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-10-16T01:20:24.738049" elapsed="0.000022"/>
</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-10-16T01:20:24.738229" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:20:24.737737" elapsed="0.000543"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:20:24.737613" elapsed="0.000707"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:20:24.738363" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:20:24.738492" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:20:24.736476" elapsed="0.002038"/>
</kw>
<status status="PASS" start="2026-10-16T01:20:24.736212" elapsed="0.002331"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:24.738729" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:24.738568" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:24.736082" elapsed="0.002718"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:20:24.739352" 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-10-16T01:20:24.738958" elapsed="0.000454"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:20:24.739457" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:20:24.732848" elapsed="0.006709"/>
</kw>
<msg time="2026-10-16T01:20:24.739604" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:24.728842" elapsed="0.010809"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:24.743423" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:24.747196" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:24.750981" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:24.751157" elapsed="0.000019"/>
</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-10-16T01:20:24.751353" 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-10-16T01:20:24.751690" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:24.751550" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:24.751536" elapsed="0.000243"/>
</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-10-16T01:20:24.751929" 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-10-16T01:20:24.752105" elapsed="0.000018"/>
</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-10-16T01:20:24.752263" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:20:24.751511" elapsed="0.000813"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:20:24.751422" elapsed="0.000926"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:24.752496" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:24.752562" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:20:24.752664" 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-10-16T01:20:24.728227" elapsed="0.024461"/>
</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-10-16T01:20:24.753842" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:24.753635" elapsed="0.000267">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:24.753984" 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-10-16T01:20:24.753299" elapsed="0.000709"/>
</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-10-16T01:20:24.754285" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:24.754070" elapsed="0.000280"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:20:24.754819" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:20:24.754539" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-16T01:20:24.754373" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:24.754054" elapsed="0.000842"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:24.755409" 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-10-16T01:20:24.755054" elapsed="0.000379"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:20:24.755479" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:20:24.755605" 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-manganese/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-10-16T01:20:24.752965" elapsed="0.002663"/>
</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-10-16T01:20:24.758123" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:24.756525" elapsed="0.001660">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:24.758272" 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-10-16T01:20:24.756186" elapsed="0.002109"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:20:24.758473" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:20:24.758373" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:24.758355" elapsed="0.000197"/>
</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-10-16T01:20:24.758721" 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-10-16T01:20:24.758896" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:24.758957" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:20:24.759084" 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-manganese/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-10-16T01:20:24.755889" elapsed="0.003219"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:24.760348" 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-10-16T01:20:24.760108" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:24.760817" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:24.760579" 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-10-16T01:20:24.764886" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:20:24.764939" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:20:24.765043" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:24.761143" elapsed="0.004266">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:24.760919" elapsed="0.004598">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:24.765716" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:24.765550" elapsed="0.000227"/>
</branch>
<status status="FAIL" start="2026-10-16T01:20:24.760902" elapsed="0.004897">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:24.766131" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:24.766256" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:24.766222" elapsed="0.000073"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:24.766204" 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-10-16T01:20:24.766464" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:20:24.766527" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:20:24.759397" elapsed="0.007231">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:24.766695" elapsed="0.000035"/>
</return>
<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="FAIL" start="2026-10-16T01:20:24.721205" elapsed="0.045644">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:20:24.767237" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:24.767019" elapsed="0.000313"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:24.766969" elapsed="0.000406"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:24.767459" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:20:24.719514" elapsed="0.048111">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:24.717848" elapsed="0.049898">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:20:24.717827" elapsed="0.049994">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:24.768067" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:20:24.768425" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:24.768752" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:20:24.769101" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:20:24.769549" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:20:24.769882" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:20:24.770231" elapsed="0.000019"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:20:24.770483" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:20:24.714549" elapsed="0.056034">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:20:24.770676" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:20:24.713754" elapsed="0.057054">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:24.771030" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:24.770888" elapsed="0.000192"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:24.771241" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:24.771103" elapsed="0.000188"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:24.771471" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:24.771329" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:24.770873" elapsed="0.000669"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:20:24.713590" elapsed="0.057990">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:20:24.713424" elapsed="0.058210">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:24.771683" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:20:24.709678" elapsed="0.062118">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:24.771972" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:24.772192" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:24.772052" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:24.772036" elapsed="0.000225"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:24.772398" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:24.772567" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:24.772626" elapsed="0.000015"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:20:24.708980" elapsed="0.063846">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:20:24.708774" elapsed="0.064118">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:20:24.708644" elapsed="0.064298">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:20:24.708297" elapsed="0.064727">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:24.773234" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:20:24.698675" elapsed="0.074678">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:20:25.785253" elapsed="0.000272"/>
</kw>
<msg time="2026-10-16T01:20:25.785601" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:25.784470" elapsed="0.001302"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:20:25.783897" elapsed="0.001981"/>
</kw>
<msg time="2026-10-16T01:20:25.785938" 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-10-16T01:20:25.779867" elapsed="0.006130"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:20:25.779304" elapsed="0.006787"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:25.786751" 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-10-16T01:20:25.786407" elapsed="0.000404"/>
</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-10-16T01:20:25.790896" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:25.790406" elapsed="0.000526"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:25.791544" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:25.791143" elapsed="0.000435"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:25.791638" elapsed="0.000039"/>
</return>
<msg time="2026-10-16T01:20:25.791845" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:25.789900" elapsed="0.001978"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:20:25.792086" elapsed="0.000376"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:25.793150" 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-10-16T01:20:25.792716" elapsed="0.000469"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:25.793746" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:25.793406" elapsed="0.000376"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:25.794300" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:25.793978" elapsed="0.000373"/>
</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-10-16T01:20:25.799793" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:20:25.798932" elapsed="0.000931"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:20:25.799944" elapsed="0.000088"/>
</return>
<msg time="2026-10-16T01:20:25.800306" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:20:25.796890" elapsed="0.003516"/>
</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-10-16T01:20:25.823604" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:20:25.823153" elapsed="0.000488"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:20:25.824631" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:20:25.824348" elapsed="0.000395">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:25.824864" 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-10-16T01:20:25.823885" elapsed="0.001012"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:25.825589" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:25.825133" elapsed="0.000492"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:20:25.826294" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:20:25.826536" 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-10-16T01:20:25.826123" elapsed="0.000448"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:25.827191" 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-10-16T01:20:25.826874" elapsed="0.000376"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:25.828461" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:25.828194" elapsed="0.000308"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:20:25.829088" 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-10-16T01:20:25.828674" elapsed="0.000440"/>
</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-10-16T01:20:25.829409" elapsed="0.000020"/>
</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-10-16T01:20:25.829592" elapsed="0.000022"/>
</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-10-16T01:20:25.829792" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:20:25.829266" elapsed="0.000580"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:20:25.829158" elapsed="0.000716"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:20:25.829915" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:20:25.830047" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:20:25.827725" elapsed="0.002346"/>
</kw>
<status status="PASS" start="2026-10-16T01:20:25.827355" elapsed="0.002745"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:25.830267" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:25.830123" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:25.827330" elapsed="0.003024"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:20:25.830921" 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-10-16T01:20:25.830508" elapsed="0.000439"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:20:25.830991" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:20:25.822432" elapsed="0.008660"/>
</kw>
<msg time="2026-10-16T01:20:25.831140" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:25.816641" elapsed="0.014546"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:25.835154" elapsed="0.000033"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:25.838972" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:25.842727" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:25.842960" 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-10-16T01:20:25.843142" elapsed="0.000019"/>
</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-10-16T01:20:25.843512" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:25.843368" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:25.843351" 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-10-16T01:20:25.843752" 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-10-16T01:20:25.843927" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:25.844085" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:20:25.843306" elapsed="0.000827"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:20:25.843212" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:25.844306" elapsed="0.000030"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:25.844387" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:20:25.844502" 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-10-16T01:20:25.815783" elapsed="0.028743"/>
</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-10-16T01:20:25.845684" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:25.845470" elapsed="0.000298">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:25.845853" 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-10-16T01:20:25.845112" 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-10-16T01:20:25.846158" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:25.845939" elapsed="0.000270"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:20:25.846679" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:20:25.846415" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-16T01:20:25.846232" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:25.845922" elapsed="0.000850"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:25.847262" 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-10-16T01:20:25.846927" elapsed="0.000360"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:20:25.847347" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:20:25.847473" 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-manganese/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-10-16T01:20:25.844805" elapsed="0.002692"/>
</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-10-16T01:20:25.848602" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:20:25.848411" elapsed="0.000250">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:20:25.848762" 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-10-16T01:20:25.848081" elapsed="0.000704"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:20:25.848948" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:20:25.848849" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:25.848833" elapsed="0.000193"/>
</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-10-16T01:20:25.849175" elapsed="0.000020"/>
</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-10-16T01:20:25.849398" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:25.849461" elapsed="0.000016"/>
</return>
<msg time="2026-10-16T01:20:25.849590" 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-manganese/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-10-16T01:20:25.847775" elapsed="0.001838"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:25.851053" 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-10-16T01:20:25.850822" elapsed="0.000274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:25.851521" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:25.851284" 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-10-16T01:20:25.855546" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:20:25.855598" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:20:25.855695" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:25.851865" elapsed="0.004200">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:25.851624" elapsed="0.004520">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:25.856342" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:25.856175" elapsed="0.000374"/>
</branch>
<status status="FAIL" start="2026-10-16T01:20:25.851607" elapsed="0.004964">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:20:25.856921" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:25.857041" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:25.857008" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:25.856992" elapsed="0.000108"/>
</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-10-16T01:20:25.857236" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:20:25.857305" elapsed="0.000025"/>
</return>
<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="FAIL" start="2026-10-16T01:20:25.850090" elapsed="0.007329">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:25.857487" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:20:25.805370" elapsed="0.052258">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:20:25.858055" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:25.857831" elapsed="0.000307"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:25.857780" elapsed="0.000401"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:25.858267" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:20:25.803096" elapsed="0.055432">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:25.800739" elapsed="0.057893">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:20:25.800676" elapsed="0.058048">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:25.858984" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:20:25.859351" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:25.859669" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:20:25.860039" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:20:25.860487" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:20:25.860824" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:20:25.861178" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:20:25.861440" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:20:25.796029" elapsed="0.065514">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:20:25.861607" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:20:25.794875" elapsed="0.066847">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:25.861954" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:25.861809" elapsed="0.000197"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:25.862166" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:25.862028" elapsed="0.000188"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:25.862399" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:25.862238" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:25.861792" elapsed="0.000678"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:20:25.794647" elapsed="0.067862">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:20:25.794412" elapsed="0.068151">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:25.862612" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:20:25.789047" elapsed="0.073676">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:25.862901" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:25.863122" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:25.862981" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:25.862966" elapsed="0.000226"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:25.863364" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:25.863544" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:20:25.863604" elapsed="0.000015"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:20:25.788066" elapsed="0.075648">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:20:25.787777" elapsed="0.076008">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:20:25.787602" elapsed="0.076234">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:20:25.787090" elapsed="0.076830">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:25.864141" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:20:25.773938" elapsed="0.090307">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<msg time="2026-10-16T01:20:25.864345" level="FAIL">Keyword 'Check Ovsdb Shards Status' failed after retrying for 1 minute 30 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<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="FAIL" start="2026-10-16T01:18:54.908385" elapsed="90.956051">Keyword 'Check Ovsdb Shards Status' failed after retrying for 1 minute 30 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<doc>Check Shard Status after some cluster event.</doc>
<status status="FAIL" start="2026-10-16T01:18:54.908024" elapsed="90.956506">Keyword 'Check Ovsdb Shards Status' failed after retrying for 1 minute 30 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<doc>Create original cluster list and check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:18:54.555984" elapsed="91.308682">Keyword 'Check Ovsdb Shards Status' failed after retrying for 1 minute 30 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:20:25.866137" elapsed="0.000226"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:20:25.865891" 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-10-16T01:20:25.867530" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:25.867224" elapsed="0.000351"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:25.867206" elapsed="0.000392"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:25.869614" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:25.869529" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:25.869512" elapsed="0.000166"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:25.871565" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:25.870249" elapsed="0.001343"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:25.872029" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:25.871758" elapsed="0.000296"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:25.872095" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:20:25.872222" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:25.869897" elapsed="0.002348"/>
</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-10-16T01:20:25.874641" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:25.874557" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:25.874539" 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-10-16T01:20:25.875878" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:25.875794" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:25.875777" elapsed="0.000165"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:20:25.876323" level="INFO">${karaf_connection_index} = 222</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:20:25.876084" elapsed="0.000265"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:20:25.876687" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:20:25.876509" elapsed="0.000219"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:20:25.913422" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:20:25.877303" elapsed="0.036323"/>
</kw>
<msg time="2026-10-16T01:20:25.913810" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:20:25.913852" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:25.876887" elapsed="0.037002"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:20:25.993946" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:25.914485" elapsed="0.079639"/>
</kw>
<msg time="2026-10-16T01:20:25.994280" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:20:25.994336" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:25.914051" elapsed="0.080320"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:25.994639" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:25.994439" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:25.994422" elapsed="0.000332"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:25.995268" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:25.994931" elapsed="0.000432"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:25.995618" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:25.995424" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:25.995408" elapsed="0.000321"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:20:25.995760" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:25.998373" elapsed="0.000495"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:20:26.000106" elapsed="0.000489"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:20:26.002018" 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-10-16T01:20:25.996542" elapsed="0.005873"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:20:25.996030" elapsed="0.006503"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:20:25.875512" elapsed="0.127097"/>
</kw>
<msg time="2026-10-16T01:20:26.002691" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:26.002748" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:25.874910" elapsed="0.127876"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:20:26.002940" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:20:26.002855" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:26.002838" 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-10-16T01:20:26.003391" 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-10-16T01:20:26.003688" elapsed="0.000112"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:20:26.003844" 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-10-16T01:20:25.874257" elapsed="0.129673"/>
</kw>
<msg time="2026-10-16T01:20:26.004012" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:26.004051" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:25.872581" elapsed="0.131506"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:26.004389" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:26.004153" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:26.004137" elapsed="0.000323"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:20:25.872443" elapsed="0.132039"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:26.006850" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:26.006763" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:26.006746" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:26.007998" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:26.007914" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:26.007897" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:20:26.008437" 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-10-16T01:20:26.008198" elapsed="0.000264"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:20:26.008844" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:20:26.008652" elapsed="0.000216"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:20:26.043660" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:20:26.009449" elapsed="0.034449"/>
</kw>
<msg time="2026-10-16T01:20:26.044070" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:20:26.044111" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:26.009020" elapsed="0.035128"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:20:26.134070" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:26.044822" elapsed="0.089429"/>
</kw>
<msg time="2026-10-16T01:20:26.134427" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:20:26.134469" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:26.044341" elapsed="0.090164"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:26.134817" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:26.134581" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:26.134559" elapsed="0.000357"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:26.135456" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:26.135095" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:26.135815" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:26.135602" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:26.135586" elapsed="0.000371"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:20:26.135990" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:26.138536" 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-10-16T01:20:26.140284" elapsed="0.000663"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:20:26.142353" 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-10-16T01:20:26.136831" elapsed="0.005921"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:20:26.136288" elapsed="0.006583"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:20:26.007638" elapsed="0.135309"/>
</kw>
<msg time="2026-10-16T01:20:26.143029" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:26.143068" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:26.007056" elapsed="0.136047"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:20:26.143254" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:20:26.143171" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:26.143154" elapsed="0.000192"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:20:26.143665" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:26.144049" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:20:26.144114" 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-10-16T01:20:26.006457" elapsed="0.137742"/>
</kw>
<msg time="2026-10-16T01:20:26.144282" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:26.144333" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:26.004738" elapsed="0.139631"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:26.144651" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:26.144437" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:26.144421" elapsed="0.000317"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:20:26.004587" elapsed="0.140173"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:26.147140" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:26.147056" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:26.147039" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:26.148295" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:26.148211" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:26.148194" elapsed="0.000176"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:20:26.148761" 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-10-16T01:20:26.148512" elapsed="0.000274"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:20:26.149121" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:20:26.148944" elapsed="0.000201"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:20:26.189596" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:20:26.149745" elapsed="0.040053"/>
</kw>
<msg time="2026-10-16T01:20:26.189954" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:20:26.189995" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:26.149302" elapsed="0.040775"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:20:26.264236" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:26.190688" elapsed="0.073770"/>
</kw>
<msg time="2026-10-16T01:20:26.264634" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:20:26.264675" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:26.190245" elapsed="0.074486"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:26.265051" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:26.264817" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:26.264793" elapsed="0.000356"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:26.265815" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:26.265343" elapsed="0.000559"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:26.266163" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:26.265965" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:26.265947" elapsed="0.000314"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:20:26.266299" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:26.268891" 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-10-16T01:20:26.270663" elapsed="0.000491"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:20:26.272380" elapsed="0.000716"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:20:26.267142" elapsed="0.006022"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:20:26.266610" elapsed="0.006672"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:20:26.147953" elapsed="0.125422"/>
</kw>
<msg time="2026-10-16T01:20:26.273457" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:26.273497" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:26.147360" elapsed="0.126173"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:20:26.273686" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-10-16T01:20:26.273601" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:26.273585" elapsed="0.000196"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:20:26.274100" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:26.274416" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:20:26.274481" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:20:26.146765" elapsed="0.127801"/>
</kw>
<msg time="2026-10-16T01:20:26.274650" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:26.274690" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:26.145009" elapsed="0.129791"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:26.275090" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:26.274871" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:26.274854" elapsed="0.000355"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:20:26.144873" elapsed="0.130359"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:20:25.872291" elapsed="0.402970"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:20:25.869210" elapsed="0.406118"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:20:25.866969" elapsed="0.408415"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:25.866562" elapsed="0.408865"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:20:25.865523" elapsed="0.409957"/>
</kw>
<kw name="Get Ovsdb Entity Owner Status For One Device" owner="ClusterOvsdb">
<msg time="2026-10-16T01:20:26.279172" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:20:26.277973" elapsed="0.001235">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${new_owner}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:26.279422" elapsed="0.000020"/>
</kw>
<doc>Check Entity Owner Status and identify owner and candidate.</doc>
<status status="FAIL" start="2026-10-16T01:20:25.865012" elapsed="0.414552">Variable '${ovsdb_uuid}' not found.</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-10-16T01:20:26.281038" elapsed="0.000203"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:20:26.280792" elapsed="0.000499"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:26.282196" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:26.282111" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:26.282094" elapsed="0.000166"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:26.284119" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:26.284037" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:26.284021" elapsed="0.000160"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:26.285091" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:26.284764" elapsed="0.000352"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:26.285557" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:26.285266" elapsed="0.000315"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:26.285622" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:20:26.285764" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:26.284396" elapsed="0.001391"/>
</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-10-16T01:20:26.288364" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:26.288265" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:26.288247" elapsed="0.000182"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:26.289523" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:26.289439" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:26.289423" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:20:26.289978" level="INFO">${karaf_connection_index} = 222</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:20:26.289749" elapsed="0.000255"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:20:26.290353" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:20:26.290164" elapsed="0.000214"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:20:26.323682" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:20:26.290965" elapsed="0.032911"/>
</kw>
<msg time="2026-10-16T01:20:26.324033" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:20:26.324074" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:26.290533" elapsed="0.033615"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:20:26.399040" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:26.324778" elapsed="0.074436"/>
</kw>
<msg time="2026-10-16T01:20:26.399383" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:20:26.399425" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:26.324325" elapsed="0.075135"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:26.399751" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:26.399529" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:26.399512" elapsed="0.000335"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:26.400372" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:26.400024" elapsed="0.000427"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:26.400722" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:26.400511" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:26.400495" elapsed="0.000321"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:20:26.400846" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:26.403314" 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-10-16T01:20:26.405059" elapsed="0.000477"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:20:26.406948" elapsed="0.000310"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:20:26.401627" elapsed="0.005710"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:20:26.401116" elapsed="0.006341"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:20:26.289166" elapsed="0.118369"/>
</kw>
<msg time="2026-10-16T01:20:26.407615" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:26.407655" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:26.288576" elapsed="0.119114"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:20:26.407859" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:20:26.407775" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:26.407758" elapsed="0.000177"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:20:26.408243" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:26.408550" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:20:26.408613" 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-10-16T01:20:26.287974" elapsed="0.120814"/>
</kw>
<msg time="2026-10-16T01:20:26.408875" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:26.408915" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:26.286114" elapsed="0.122836"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:26.409247" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:26.409017" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:26.409001" elapsed="0.000368"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:20:26.285976" elapsed="0.123416"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:26.411903" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:26.411819" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:26.411802" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:26.413062" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:26.412979" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:26.412963" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:20:26.413504" 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-10-16T01:20:26.413265" elapsed="0.000264"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:20:26.413879" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:20:26.413687" elapsed="0.000216"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:20:26.450885" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:20:26.414482" elapsed="0.036575"/>
</kw>
<msg time="2026-10-16T01:20:26.451232" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:20:26.451274" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:26.414056" elapsed="0.037253"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:20:26.533482" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:26.451922" elapsed="0.082028"/>
</kw>
<msg time="2026-10-16T01:20:26.534344" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:20:26.534442" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:26.451487" elapsed="0.083035"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:26.535233" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:26.534689" elapsed="0.000728"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:26.534644" elapsed="0.000829"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:26.536754" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:26.535910" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:26.537535" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:26.537079" elapsed="0.000609"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:26.537043" elapsed="0.000726"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:20:26.537840" elapsed="0.000061"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:26.543545" elapsed="0.001118"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:20:26.547506" elapsed="0.001263"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:20:26.551469" elapsed="0.000942"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:20:26.539664" elapsed="0.012894"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:20:26.538479" elapsed="0.014413"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:20:26.412722" elapsed="0.140342"/>
</kw>
<msg time="2026-10-16T01:20:26.553350" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:26.553442" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:26.412113" elapsed="0.141410"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:20:26.554111" elapsed="0.000055"/>
</return>
<status status="PASS" start="2026-10-16T01:20:26.553677" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:26.553640" elapsed="0.000648"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:20:26.555040" elapsed="0.000052"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:26.555754" elapsed="0.000052"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:20:26.555899" 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-10-16T01:20:26.411512" elapsed="0.144577"/>
</kw>
<msg time="2026-10-16T01:20:26.556275" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:26.556388" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:26.409639" elapsed="0.146832"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:26.557154" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:26.556621" elapsed="0.000642"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:26.556586" elapsed="0.000727"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:20:26.409502" elapsed="0.147879"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:26.563130" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:26.562944" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:26.562906" elapsed="0.000366"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:26.565928" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:26.565691" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:26.565650" elapsed="0.000434"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:20:26.566695" 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-10-16T01:20:26.566378" elapsed="0.000373"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:20:26.567222" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:20:26.566975" elapsed="0.000281"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:20:26.601736" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:20:26.568215" elapsed="0.033775"/>
</kw>
<msg time="2026-10-16T01:20:26.602208" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:20:26.602266" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:26.567487" elapsed="0.034847"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:20:26.679962" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:26.603176" elapsed="0.077224"/>
</kw>
<msg time="2026-10-16T01:20:26.680834" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:20:26.680933" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:26.602562" elapsed="0.078450"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:26.681738" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:26.681187" elapsed="0.000712"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:26.681139" elapsed="0.000904"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:26.683338" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:26.682477" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:26.684165" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:26.683667" elapsed="0.000677"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:26.683631" elapsed="0.000768"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:20:26.684469" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:26.690133" elapsed="0.001156"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:20:26.694295" elapsed="0.000726"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:20:26.696948" elapsed="0.000483"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:20:26.686303" elapsed="0.011224"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:20:26.685137" elapsed="0.012556"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:20:26.565055" elapsed="0.132768"/>
</kw>
<msg time="2026-10-16T01:20:26.697940" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:26.697997" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:26.563650" elapsed="0.134394"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:20:26.698260" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-10-16T01:20:26.698140" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:26.698116" elapsed="0.000272"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:20:26.699046" elapsed="0.000035"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:26.699498" elapsed="0.000033"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:20:26.699590" elapsed="0.000021"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:20:26.562248" elapsed="0.137486"/>
</kw>
<msg time="2026-10-16T01:20:26.699857" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:26.699915" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:26.558057" elapsed="0.141908"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:26.700381" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:26.700061" elapsed="0.000390"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:26.700038" elapsed="0.000446"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:20:26.557625" elapsed="0.142889"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:20:26.285835" elapsed="0.414719"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:20:26.283747" elapsed="0.416880"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:20:26.281856" elapsed="0.418904"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:26.281451" elapsed="0.419374"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:20:26.280439" elapsed="0.420455"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:26.707598" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:26.707204" elapsed="0.000469"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:26.707180" elapsed="0.000546"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:20:26.708174" 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-10-16T01:20:26.708306" 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-10-16T01:20:26.707997" elapsed="0.000366"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:26.709054" level="INFO">Attempting to execute command "sudo ovs-vsctl add-br br-s1" on remote system "10.30.171.104" 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-10-16T01:20:26.708625" elapsed="0.000490"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:20:26.709871" level="INFO">${conn_id} = 323</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-10-16T01:20:26.709427" elapsed="0.000479"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:20:26.711118" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:20:26.711217" 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-10-16T01:20:26.710768" elapsed="0.000481"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:26.711475" elapsed="0.000420"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:20:26.712996" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:20:27.340073" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:20:26 UTC 2026

  System load:  0.02               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:18:37 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:20:26.712654" elapsed="0.627592"/>
</kw>
<msg time="2026-10-16T01:20:27.340360" 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-10-16T01:20:26.712129" elapsed="0.628315"/>
</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-10-16T01:20:26.710220" elapsed="0.630322"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:20:27.341026" level="INFO">Executing command 'sudo ovs-vsctl add-br br-s1'.</msg>
<msg time="2026-10-16T01:20:27.454801" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:20:27.455032" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:20:27.455118" 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-10-16T01:20:27.340819" elapsed="0.114345"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:20:27.455539" elapsed="0.000449"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:27.457096" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:27.456502" elapsed="0.000680"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:20:27.457592" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:27.457355" elapsed="0.000338"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:27.457290" 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-10-16T01:20:27.458062" elapsed="0.000053"/>
</return>
<status status="PASS" start="2026-10-16T01:20:27.457881" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:27.457850" elapsed="0.000382"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:20:27.458300" elapsed="0.000050"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:27.459966" elapsed="0.000658"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:20:27.461060" elapsed="0.000331"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:20:27.461731" elapsed="0.000198"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:20:27.459029" elapsed="0.003004"/>
</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-10-16T01:20:26.706595" elapsed="0.755687"/>
</kw>
<msg time="2026-10-16T01:20:27.462414" 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-10-16T01:20:26.705849" elapsed="0.756666"/>
</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-10-16T01:20:26.705222" elapsed="0.757447"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:20:27.463840" 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-10-16T01:20:27.463128" elapsed="0.000770"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:20:27.464997" 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-10-16T01:20:27.464346" elapsed="0.000708"/>
</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-10-16T01:20:27.475013" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:27.474208" elapsed="0.000862"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:27.476213" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:27.475427" elapsed="0.000840"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:27.476391" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:20:27.476680" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:27.473390" elapsed="0.003373"/>
</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-10-16T01:20:27.482641" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:20:27.482009" elapsed="0.000687"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:20:27.482823" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:20:27.483095" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:20:27.481241" elapsed="0.001907"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:27.485838" 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-10-16T01:20:27.485280" elapsed="0.000655"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:27.486902" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:27.486375" elapsed="0.000620"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:20:27.493884" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:20:27.493998" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:20:27.494210" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:20:27.487659" elapsed="0.007570">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:27.487132" elapsed="0.008294">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:20:27.496165" elapsed="0.000058"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:27.495498" elapsed="0.000818"/>
</branch>
<status status="FAIL" start="2026-10-16T01:20:27.487095" elapsed="0.009379">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:20:27.497311" elapsed="0.000076"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:27.497611" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:27.497535" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:27.497498" elapsed="0.000288"/>
</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-10-16T01:20:27.498094" elapsed="0.000043"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:20:27.498234" 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-10-16T01:20:27.483859" elapsed="0.014625">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:27.498608" 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-10-16T01:20:27.480271" elapsed="0.018564">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:20:27.499302" elapsed="0.000070"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:20:27.477125" elapsed="0.022356">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:20:27.476873" elapsed="0.022723">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:20:27.472254" elapsed="0.027563">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:20:28.509251" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:28.508419" elapsed="0.000896"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:28.510320" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:28.509681" elapsed="0.000715"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:28.510492" elapsed="0.000250"/>
</return>
<msg time="2026-10-16T01:20:28.510976" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:28.507568" elapsed="0.003459"/>
</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-10-16T01:20:28.516876" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:20:28.516222" elapsed="0.000710"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:20:28.517025" elapsed="0.000057"/>
</return>
<msg time="2026-10-16T01:20:28.517292" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:20:28.515493" elapsed="0.001870"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:28.519984" 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-10-16T01:20:28.519456" elapsed="0.000621"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:28.521025" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:28.520512" elapsed="0.000603"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:20:28.527351" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:20:28.527463" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:20:28.527798" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:20:28.521802" elapsed="0.007171">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:28.521249" elapsed="0.007887">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:20:28.529571" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:28.529205" elapsed="0.000528"/>
</branch>
<status status="FAIL" start="2026-10-16T01:20:28.521212" elapsed="0.008573">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:20:28.530540" elapsed="0.000051"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:28.530834" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:28.530757" elapsed="0.000165"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:28.530695" 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-10-16T01:20:28.531270" elapsed="0.000043"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:20:28.531431" elapsed="0.000031"/>
</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-10-16T01:20:28.518047" elapsed="0.013593">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:28.531787" 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-10-16T01:20:28.514540" elapsed="0.017439">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:20:28.532455" elapsed="0.000049"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:20:28.511404" elapsed="0.021205">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:20:28.511134" elapsed="0.021617">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:20:28.506350" elapsed="0.026586">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:20:29.537564" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:29.537140" elapsed="0.000455"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:29.538054" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:29.537771" elapsed="0.000307"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:29.538123" elapsed="0.000036"/>
</return>
<msg time="2026-10-16T01:20:29.538264" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:29.536766" 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-10-16T01:20:29.541054" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:20:29.540781" elapsed="0.000299"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:20:29.541122" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:20:29.541245" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:20:29.540438" elapsed="0.000830"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:29.542473" 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-10-16T01:20:29.542224" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:29.543017" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:29.542720" elapsed="0.000339"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:20:29.547077" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:20:29.547130" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:20:29.547232" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:20:29.543370" elapsed="0.004444">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:29.543127" elapsed="0.004763">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:20:29.548077" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:29.547924" elapsed="0.000212"/>
</branch>
<status status="FAIL" start="2026-10-16T01:20:29.543108" elapsed="0.005051">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:20:29.548512" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:29.548633" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:29.548600" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:29.548583" elapsed="0.000109"/>
</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-10-16T01:20:29.548848" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:20:29.548911" 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-10-16T01:20:29.541596" elapsed="0.007412">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:29.549063" 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-10-16T01:20:29.540007" elapsed="0.009142">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:20:29.549372" elapsed="0.000023"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:20:29.538469" elapsed="0.010977">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:20:29.538349" elapsed="0.011151">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:20:29.536135" elapsed="0.013449">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:20:30.559319" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:30.558460" elapsed="0.000946"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:30.560430" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:30.559782" elapsed="0.000705"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:30.560585" elapsed="0.000069"/>
</return>
<msg time="2026-10-16T01:20:30.560919" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:30.557594" elapsed="0.003378"/>
</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-10-16T01:20:30.567017" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:20:30.566369" elapsed="0.000703"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:20:30.567169" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:20:30.567468" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:20:30.565601" elapsed="0.001927"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:30.570195" 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-10-16T01:20:30.569653" elapsed="0.000640"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:30.571262" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:30.570762" 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-10-16T01:20:30.577533" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:20:30.577648" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:20:30.577897" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:20:30.572073" elapsed="0.007005">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:30.571526" elapsed="0.007721">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:20:30.579685" elapsed="0.000080"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:30.579317" elapsed="0.000537"/>
</branch>
<status status="FAIL" start="2026-10-16T01:20:30.571486" elapsed="0.008419">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:20:30.580668" elapsed="0.000081"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:30.580967" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:30.580894" elapsed="0.000158"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:30.580858" elapsed="0.000239"/>
</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-10-16T01:20:30.581421" elapsed="0.000044"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:20:30.581564" elapsed="0.000031"/>
</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-10-16T01:20:30.568220" elapsed="0.013585">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:30.581928" 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-10-16T01:20:30.564641" elapsed="0.017477">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:20:30.582601" elapsed="0.000049"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:20:30.561480" elapsed="0.021307">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:20:30.561196" elapsed="0.021708">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:20:30.556338" elapsed="0.026823">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:20:31.592698" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:31.591851" elapsed="0.000945"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:31.593827" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:31.593148" elapsed="0.000735"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:31.593982" elapsed="0.000071"/>
</return>
<msg time="2026-10-16T01:20:31.594283" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:31.590992" elapsed="0.003345"/>
</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-10-16T01:20:31.600308" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:20:31.599617" elapsed="0.000770"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:20:31.600485" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:20:31.600795" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:20:31.598886" elapsed="0.001962"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:31.603495" 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-10-16T01:20:31.602971" elapsed="0.000620"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:31.604641" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:31.604039" elapsed="0.000724"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:20:31.611140" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:20:31.611253" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:20:31.611485" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:20:31.605432" elapsed="0.007222">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:31.604907" elapsed="0.007947">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:20:31.613261" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:31.612925" elapsed="0.000499"/>
</branch>
<status status="FAIL" start="2026-10-16T01:20:31.604868" elapsed="0.008606">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:20:31.614240" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:31.614536" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:31.614461" elapsed="0.000161"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:31.614424" 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-10-16T01:20:31.615006" elapsed="0.000045"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:20:31.615150" 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-10-16T01:20:31.601533" elapsed="0.013855">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:31.615604" 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-10-16T01:20:31.597873" elapsed="0.017961">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:20:31.616302" elapsed="0.000050"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:20:31.594760" elapsed="0.021722">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:20:31.594474" elapsed="0.022129">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:20:31.589759" elapsed="0.027059">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:20:32.626296" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:32.625439" elapsed="0.001004"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:32.627474" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:32.626828" elapsed="0.000702"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:32.627626" elapsed="0.000100"/>
</return>
<msg time="2026-10-16T01:20:32.627962" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:32.624584" elapsed="0.003430"/>
</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-10-16T01:20:32.633892" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:20:32.633234" elapsed="0.000713"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:20:32.634039" elapsed="0.000057"/>
</return>
<msg time="2026-10-16T01:20:32.634308" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:20:32.632493" elapsed="0.001865"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:32.637004" 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-10-16T01:20:32.636471" elapsed="0.000627"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:32.638054" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:32.637538" elapsed="0.000605"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:20:32.644315" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:20:32.644449" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:20:32.644657" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:20:32.638832" elapsed="0.007012">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:32.638281" elapsed="0.007725">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:20:32.646436" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:32.646076" elapsed="0.000586"/>
</branch>
<status status="FAIL" start="2026-10-16T01:20:32.638244" elapsed="0.008506">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:20:32.647517" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:32.647816" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:32.647739" elapsed="0.000163"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:32.647675" elapsed="0.000272"/>
</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-10-16T01:20:32.648249" elapsed="0.000043"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:20:32.648410" 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-10-16T01:20:32.635058" elapsed="0.013563">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:32.648770" 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-10-16T01:20:32.631537" elapsed="0.017423">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:20:32.649431" elapsed="0.000050"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:20:32.628424" elapsed="0.021160">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:20:32.628122" elapsed="0.021609">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:20:32.623340" elapsed="0.026580">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<msg time="2026-10-16T01:20:32.650112" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<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="FAIL" start="2026-10-16T01:20:27.465506" elapsed="5.184802">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${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="NOT RUN" start="2026-10-16T01:20:32.650855" elapsed="0.000045"/>
</kw>
<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-10-16T01:20:26.704679" elapsed="5.946422">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<doc>Create bridge with OVS command and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-10-16T01:20:26.279894" elapsed="6.371500">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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-10-16T01:20:32.655109" elapsed="0.000496"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:20:32.654363" elapsed="0.001398"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:32.657897" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:32.657665" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:32.657626" elapsed="0.000415"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:32.662309" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:32.662119" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:32.662082" elapsed="0.000391"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:32.664576" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:32.663812" elapsed="0.000824"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:32.665764" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:32.665079" elapsed="0.000742"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:32.665917" elapsed="0.000060"/>
</return>
<msg time="2026-10-16T01:20:32.666206" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:32.662954" elapsed="0.003305"/>
</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-10-16T01:20:32.671161" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:32.671039" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:32.671015" elapsed="0.000236"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:32.672895" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:32.672773" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:32.672746" elapsed="0.000239"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:20:32.673532" level="INFO">${karaf_connection_index} = 222</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:20:32.673188" elapsed="0.000381"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:20:32.674083" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:20:32.673828" elapsed="0.000290"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:20:32.712678" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:20:32.674981" elapsed="0.037934"/>
</kw>
<msg time="2026-10-16T01:20:32.713105" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:20:32.713149" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:32.674336" elapsed="0.038849"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:20:32.808404" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:32.713914" elapsed="0.094668"/>
</kw>
<msg time="2026-10-16T01:20:32.808759" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:20:32.808801" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:32.713402" elapsed="0.095433"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:32.809136" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:32.808916" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:32.808893" elapsed="0.000339"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:32.809782" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:32.809423" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:32.810122" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:32.809926" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:32.809910" elapsed="0.000305"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:20:32.810248" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:32.812856" elapsed="0.000485"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:20:32.814600" elapsed="0.000498"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:20:32.816610" 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-10-16T01:20:32.811100" elapsed="0.005912"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:20:32.810569" elapsed="0.006561"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:20:32.672356" elapsed="0.144853"/>
</kw>
<msg time="2026-10-16T01:20:32.817293" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:32.817335" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:32.671484" elapsed="0.145899"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:20:32.817539" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:20:32.817454" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:32.817437" elapsed="0.000181"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:20:32.818016" 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-10-16T01:20:32.818319" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:20:32.818400" 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-10-16T01:20:32.670606" elapsed="0.147882"/>
</kw>
<msg time="2026-10-16T01:20:32.818573" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:32.818614" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:32.667046" elapsed="0.151605"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:32.818955" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:32.818735" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:32.818718" elapsed="0.000310"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:20:32.666695" elapsed="0.152355"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:32.821643" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:32.821559" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:32.821541" elapsed="0.000182"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:32.822833" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:32.822748" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:32.822730" elapsed="0.000167"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:20:32.823267" 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-10-16T01:20:32.823039" elapsed="0.000253"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:20:32.823650" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:20:32.823466" elapsed="0.000208"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:20:32.865136" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:20:32.824265" elapsed="0.041050"/>
</kw>
<msg time="2026-10-16T01:20:32.865489" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:20:32.865531" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:32.823845" elapsed="0.041722"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:20:32.948546" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:32.866181" elapsed="0.082588"/>
</kw>
<msg time="2026-10-16T01:20:32.948944" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:20:32.948985" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:32.865752" elapsed="0.083323"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:32.949405" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:32.949162" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:32.949138" elapsed="0.000366"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:32.950070" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:32.949687" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:32.950424" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:32.950215" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:32.950198" elapsed="0.000320"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:20:32.950551" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:32.953121" elapsed="0.000493"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:20:32.954884" elapsed="0.000473"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:20:32.956870" 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-10-16T01:20:32.951399" elapsed="0.005850"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:20:32.950872" elapsed="0.006509"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:20:32.822469" elapsed="0.134991"/>
</kw>
<msg time="2026-10-16T01:20:32.957543" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:32.957583" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:32.821872" elapsed="0.135746"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:20:32.957816" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:20:32.957686" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:32.957669" 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-10-16T01:20:32.958210" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:32.958519" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:20:32.958583" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:20:32.821251" elapsed="0.137418"/>
</kw>
<msg time="2026-10-16T01:20:32.958793" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:32.958834" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:32.819304" elapsed="0.139565"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:32.959150" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:32.958936" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:32.958920" elapsed="0.000300"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:20:32.819165" elapsed="0.140076"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:32.961842" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:32.961756" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:32.961738" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:32.963029" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:32.962946" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:32.962929" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:20:32.963514" 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-10-16T01:20:32.963268" elapsed="0.000270"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:20:32.963899" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:20:32.963713" elapsed="0.000210"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:20:33.001307" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:20:32.964498" elapsed="0.036995"/>
</kw>
<msg time="2026-10-16T01:20:33.001648" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:20:33.001689" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:32.964075" elapsed="0.037673"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:20:33.081782" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:33.002329" elapsed="0.079627"/>
</kw>
<msg time="2026-10-16T01:20:33.082109" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:20:33.082149" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:33.001912" elapsed="0.080272"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:33.082465" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:33.082251" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:33.082234" elapsed="0.000325"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:33.083093" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:33.082760" elapsed="0.000416"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:33.083446" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:33.083234" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:33.083218" elapsed="0.000320"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:20:33.083568" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:33.086029" 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-10-16T01:20:33.087772" elapsed="0.000457"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:20:33.089613" 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-10-16T01:20:33.084336" elapsed="0.005667"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:20:33.083848" elapsed="0.006272"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:20:32.962669" elapsed="0.127526"/>
</kw>
<msg time="2026-10-16T01:20:33.090276" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:33.090315" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:32.962050" elapsed="0.128300"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:20:33.090516" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:20:33.090433" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:33.090416" elapsed="0.000175"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:20:33.090980" 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-10-16T01:20:33.091315" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:20:33.091395" 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-10-16T01:20:32.961447" elapsed="0.130035"/>
</kw>
<msg time="2026-10-16T01:20:33.091564" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:33.091603" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:32.959502" elapsed="0.132135"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:33.091935" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:33.091719" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:33.091688" elapsed="0.000318"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:20:32.959354" elapsed="0.132673"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:20:32.666360" elapsed="0.425694"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:20:32.661427" elapsed="0.430678"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:20:32.657062" elapsed="0.435096"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:32.656098" elapsed="0.436102"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:20:32.653446" elapsed="0.438804"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:33.095863" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:33.095619" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:33.095602" elapsed="0.000336"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:20:33.096248" 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-10-16T01:20:33.096338" 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-10-16T01:20:33.096125" elapsed="0.000237"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:33.096861" 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.104" 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-10-16T01:20:33.096562" elapsed="0.000341"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:20:33.097389" level="INFO">${conn_id} = 328</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-10-16T01:20:33.097077" elapsed="0.000336"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:20:33.098224" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:20:33.098292" 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-10-16T01:20:33.097968" elapsed="0.000346"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:33.098476" elapsed="0.000295"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:20:33.099535" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:20:33.465340" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:20:26 UTC 2026

  System load:  0.02               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:20:27 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:20:33.099291" elapsed="0.366181"/>
</kw>
<msg time="2026-10-16T01:20:33.465593" 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-10-16T01:20:33.098932" elapsed="0.366727"/>
</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-10-16T01:20:33.097603" elapsed="0.368165"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:20:33.466214" level="INFO">Executing command 'sudo ovs-vsctl add-port br-s1 vx1 -- set Interface vx1 type=vxlan'.</msg>
<msg time="2026-10-16T01:20:33.551210" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:20:33.551496" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:20:33.551590" 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-10-16T01:20:33.466021" elapsed="0.085622"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:20:33.552060" elapsed="0.000544"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:33.553742" 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-10-16T01:20:33.553123" 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-10-16T01:20:33.554221" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:33.553993" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:33.553951" elapsed="0.000418"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:20:33.554683" elapsed="0.000088"/>
</return>
<status status="PASS" start="2026-10-16T01:20:33.554501" elapsed="0.000340"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:33.554469" elapsed="0.000422"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:20:33.554961" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:33.556563" elapsed="0.000675"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:20:33.557758" elapsed="0.000427"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:20:33.558537" elapsed="0.000234"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:20:33.555620" elapsed="0.003261"/>
</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-10-16T01:20:33.095191" elapsed="0.463847"/>
</kw>
<msg time="2026-10-16T01:20:33.559143" 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-10-16T01:20:33.094670" elapsed="0.464573"/>
</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-10-16T01:20:33.094233" elapsed="0.465188"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:20:33.560555" 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-10-16T01:20:33.559878" elapsed="0.000733"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:20:33.561734" 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-10-16T01:20:33.561064" elapsed="0.000727"/>
</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-10-16T01:20:33.571745" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:33.570955" elapsed="0.000848"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:33.572811" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:33.572142" elapsed="0.000725"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:33.572958" elapsed="0.000060"/>
</return>
<msg time="2026-10-16T01:20:33.573246" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:33.570114" elapsed="0.003183"/>
</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-10-16T01:20:33.579306" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:20:33.578664" elapsed="0.000698"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:20:33.579481" elapsed="0.000059"/>
</return>
<msg time="2026-10-16T01:20:33.579788" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:20:33.577830" elapsed="0.002012"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:33.582496" 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-10-16T01:20:33.581969" elapsed="0.000622"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:33.583559" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:33.583047" elapsed="0.000603"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:20:33.591890" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:20:33.592007" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:20:33.592227" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:20:33.584317" elapsed="0.008736">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:33.583818" elapsed="0.009405">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:20:33.593663" elapsed="0.000084"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:33.593296" elapsed="0.000541"/>
</branch>
<status status="FAIL" start="2026-10-16T01:20:33.583779" elapsed="0.010109">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:20:33.594675" elapsed="0.000088"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:33.594987" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:33.594910" elapsed="0.000165"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:33.594872" elapsed="0.000250"/>
</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-10-16T01:20:33.595448" elapsed="0.000045"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:20:33.595591" 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-10-16T01:20:33.580535" elapsed="0.015305">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:33.595967" 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-10-16T01:20:33.576859" elapsed="0.019305">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:20:33.596658" elapsed="0.000080"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:20:33.573679" elapsed="0.023169">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:20:33.573427" elapsed="0.023538">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:20:33.568944" elapsed="0.028212">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:20:34.606630" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:34.605803" elapsed="0.000890"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:34.607739" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:34.607070" elapsed="0.000726"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:34.607895" elapsed="0.000068"/>
</return>
<msg time="2026-10-16T01:20:34.608195" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:34.604955" elapsed="0.003292"/>
</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-10-16T01:20:34.614171" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:20:34.613529" elapsed="0.000698"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:20:34.614324" elapsed="0.000079"/>
</return>
<msg time="2026-10-16T01:20:34.614623" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:20:34.612795" elapsed="0.001881"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:34.617326" 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-10-16T01:20:34.616824" elapsed="0.000618"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:34.618460" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:34.617952" elapsed="0.000599"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:20:34.625188" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:20:34.625298" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:20:34.625528" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:20:34.619233" elapsed="0.007064">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:34.618691" elapsed="0.007787">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:20:34.626920" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:34.626551" elapsed="0.000501"/>
</branch>
<status status="FAIL" start="2026-10-16T01:20:34.618654" elapsed="0.008448">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:20:34.628311" elapsed="0.000054"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:34.628608" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:34.628531" elapsed="0.000165"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:34.628494" elapsed="0.000278"/>
</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-10-16T01:20:34.629084" elapsed="0.000044"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:20:34.629224" elapsed="0.000030"/>
</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-10-16T01:20:34.615368" elapsed="0.014090">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:34.629580" 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-10-16T01:20:34.611824" elapsed="0.018072">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:20:34.630368" elapsed="0.000072"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:20:34.608630" elapsed="0.021916">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:20:34.608356" elapsed="0.022304">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:20:34.603747" elapsed="0.027130">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:20:35.640923" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:35.639973" elapsed="0.001018"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:35.642033" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:35.641352" elapsed="0.000735"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:35.642187" elapsed="0.000084"/>
</return>
<msg time="2026-10-16T01:20:35.642541" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:35.639084" elapsed="0.003509"/>
</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-10-16T01:20:35.648579" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:20:35.647949" elapsed="0.000686"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:20:35.648760" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:20:35.649039" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:20:35.647182" elapsed="0.001908"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:35.651797" 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-10-16T01:20:35.651231" elapsed="0.000662"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:35.652880" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:35.652305" elapsed="0.000666"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:20:35.659894" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:20:35.660038" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:20:35.660269" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:20:35.653673" elapsed="0.007602">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:35.653119" elapsed="0.008352">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:20:35.661917" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:35.661546" elapsed="0.000504"/>
</branch>
<status status="FAIL" start="2026-10-16T01:20:35.653079" elapsed="0.009021">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:20:35.662964" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:35.663796" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:35.663279" elapsed="0.000613"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:35.663240" elapsed="0.000700"/>
</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-10-16T01:20:35.664255" elapsed="0.000045"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:20:35.664422" 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-10-16T01:20:35.649830" elapsed="0.014811">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:35.664817" 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-10-16T01:20:35.646210" elapsed="0.018804">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:20:35.665502" elapsed="0.000050"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:20:35.643016" elapsed="0.022643">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:20:35.642743" elapsed="0.023065">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:20:35.637736" elapsed="0.028258">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:20:36.676054" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:36.675105" elapsed="0.001019"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:36.677170" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:36.676505" elapsed="0.000719"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:36.677325" elapsed="0.000106"/>
</return>
<msg time="2026-10-16T01:20:36.677677" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:36.674219" elapsed="0.003540"/>
</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-10-16T01:20:36.683696" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:20:36.683067" elapsed="0.000717"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:20:36.683880" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:20:36.684155" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:20:36.682301" elapsed="0.001906"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:36.686910" 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-10-16T01:20:36.686346" elapsed="0.000659"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:36.687966" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:36.687442" 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-10-16T01:20:36.695061" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:20:36.695178" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:20:36.695396" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:20:36.688776" elapsed="0.007608">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:36.688205" elapsed="0.008374">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:20:36.697044" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:36.696654" elapsed="0.000522"/>
</branch>
<status status="FAIL" start="2026-10-16T01:20:36.688165" elapsed="0.009061">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:20:36.698058" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:36.698330" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:36.698256" elapsed="0.000184"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:36.698220" elapsed="0.000268"/>
</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-10-16T01:20:36.698825" elapsed="0.000045"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:20:36.698967" elapsed="0.000031"/>
</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-10-16T01:20:36.684944" elapsed="0.014239">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:36.699300" elapsed="0.000031"/>
</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-10-16T01:20:36.681332" elapsed="0.018185">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:20:36.700017" elapsed="0.000050"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:20:36.678145" elapsed="0.022027">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:20:36.677880" elapsed="0.022410">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:20:36.672743" elapsed="0.027757">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:20:37.710937" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:37.709979" elapsed="0.001029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:37.712048" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:37.711364" elapsed="0.000739"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:37.712202" elapsed="0.000080"/>
</return>
<msg time="2026-10-16T01:20:37.712551" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:37.709101" elapsed="0.003501"/>
</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-10-16T01:20:37.719197" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:20:37.718547" elapsed="0.000705"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:20:37.719346" elapsed="0.000057"/>
</return>
<msg time="2026-10-16T01:20:37.719647" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:20:37.717812" elapsed="0.001885"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:37.722398" 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-10-16T01:20:37.721880" elapsed="0.000642"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:37.723488" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:37.722969" elapsed="0.000722"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:20:37.731604" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:20:37.731757" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:20:37.732026" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:20:37.724402" elapsed="0.008533">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:37.723879" elapsed="0.009226">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:20:37.733539" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:37.733178" elapsed="0.000494"/>
</branch>
<status status="FAIL" start="2026-10-16T01:20:37.723834" elapsed="0.009919">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:20:37.734517" elapsed="0.000054"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:37.734814" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:37.734738" elapsed="0.000160"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:37.734676" 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-10-16T01:20:37.735247" elapsed="0.000043"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:20:37.735385" elapsed="0.000055"/>
</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-10-16T01:20:37.720400" elapsed="0.015226">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:37.735776" 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-10-16T01:20:37.716194" elapsed="0.019773">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:20:37.736440" elapsed="0.000051"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:20:37.713035" elapsed="0.023562">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:20:37.712753" elapsed="0.023994">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:20:37.707773" elapsed="0.029164">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:20:38.747873" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:38.746948" elapsed="0.000994"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:38.748972" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:38.748294" elapsed="0.000732"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:38.749123" elapsed="0.000077"/>
</return>
<msg time="2026-10-16T01:20:38.749463" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:38.746075" elapsed="0.003441"/>
</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-10-16T01:20:38.755598" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:20:38.754966" elapsed="0.000689"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:20:38.755782" elapsed="0.000059"/>
</return>
<msg time="2026-10-16T01:20:38.756058" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:20:38.754195" elapsed="0.001916"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:38.758833" 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-10-16T01:20:38.758262" elapsed="0.000667"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:38.759890" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:38.759346" elapsed="0.000634"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:20:38.766960" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:20:38.767092" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:20:38.767331" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:20:38.760666" elapsed="0.007495">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:38.760126" elapsed="0.008202">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:20:38.768795" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:38.768400" elapsed="0.000529"/>
</branch>
<status status="FAIL" start="2026-10-16T01:20:38.760085" elapsed="0.008894">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:20:38.769776" elapsed="0.000054"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:38.770045" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:38.769971" elapsed="0.000158"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:38.769936" 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-10-16T01:20:38.770500" elapsed="0.000044"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:20:38.770642" 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-10-16T01:20:38.756847" elapsed="0.014040">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:38.771007" elapsed="0.000031"/>
</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-10-16T01:20:38.753230" elapsed="0.017963">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:20:38.771672" elapsed="0.000079"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:20:38.750033" elapsed="0.021827">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:20:38.749770" elapsed="0.022204">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:20:38.744689" elapsed="0.027467">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<msg time="2026-10-16T01:20:38.772442" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<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="FAIL" start="2026-10-16T01:20:33.562219" elapsed="5.210421">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${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="NOT RUN" start="2026-10-16T01:20:38.773242" elapsed="0.000050"/>
</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="FAIL" start="2026-10-16T01:20:33.093865" elapsed="5.679667">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<doc>Add port with OVS command and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-10-16T01:20:32.652139" elapsed="6.121720">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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-10-16T01:20:38.777558" elapsed="0.000503"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:20:38.776966" elapsed="0.001212"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:38.780256" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:38.780060" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:38.780019" elapsed="0.000380"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:38.784889" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:38.784660" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:38.784623" elapsed="0.000405"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:38.787101" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:38.786326" elapsed="0.000833"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:38.788154" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:38.787516" elapsed="0.000692"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:38.788299" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:20:38.788605" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:38.785503" elapsed="0.003153"/>
</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-10-16T01:20:38.794109" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:38.793920" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:38.793882" elapsed="0.000367"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:38.796855" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:38.796634" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:38.796596" elapsed="0.000399"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:20:38.797902" level="INFO">${karaf_connection_index} = 222</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:20:38.797315" elapsed="0.000642"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:20:38.798788" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:20:38.798315" elapsed="0.000530"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:20:38.835171" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:20:38.799785" elapsed="0.035581"/>
</kw>
<msg time="2026-10-16T01:20:38.835550" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:20:38.835593" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:38.799159" elapsed="0.036509"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:20:38.921325" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:38.836313" elapsed="0.085221"/>
</kw>
<msg time="2026-10-16T01:20:38.921718" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:20:38.921763" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:38.835864" elapsed="0.085935"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:38.922081" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:38.921870" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:38.921851" elapsed="0.000326"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:38.922733" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:38.922357" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:38.923082" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:38.922883" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:38.922866" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:20:38.923206" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:38.925751" elapsed="0.000478"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:20:38.927496" elapsed="0.000545"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:20:38.929394" 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-10-16T01:20:38.924021" elapsed="0.005793"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:20:38.923500" elapsed="0.006431"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:20:38.796032" elapsed="0.133976"/>
</kw>
<msg time="2026-10-16T01:20:38.930089" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:38.930129" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:38.794603" elapsed="0.135562"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:20:38.930316" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:20:38.930232" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:38.930216" elapsed="0.000177"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:20:38.930806" 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-10-16T01:20:38.931101" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:20:38.931165" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:20:38.793218" elapsed="0.138031"/>
</kw>
<msg time="2026-10-16T01:20:38.931332" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:38.931371" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:38.789401" elapsed="0.142006"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:38.931760" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:38.931491" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:38.931475" elapsed="0.000361"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:20:38.789094" elapsed="0.142764"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:38.934263" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:38.934178" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:38.934160" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:38.935437" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:38.935339" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:38.935321" elapsed="0.000180"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:20:38.935888" 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-10-16T01:20:38.935643" elapsed="0.000270"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:20:38.936249" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:20:38.936074" elapsed="0.000199"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:20:38.971316" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:20:38.936878" elapsed="0.034630"/>
</kw>
<msg time="2026-10-16T01:20:38.971665" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:20:38.971727" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:38.936444" elapsed="0.035319"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:20:39.059168" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:38.972348" elapsed="0.086999"/>
</kw>
<msg time="2026-10-16T01:20:39.059522" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:20:39.059563" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:38.971926" elapsed="0.087673"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:39.059890" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:39.059668" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:39.059650" elapsed="0.000334"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:39.060615" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:39.060166" elapsed="0.000549"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:39.060975" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:39.060778" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:39.060761" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:20:39.061099" elapsed="0.000024"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:39.063768" elapsed="0.000485"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:20:39.065541" elapsed="0.000471"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:20:39.067370" 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-10-16T01:20:39.062051" elapsed="0.005724"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:20:39.061361" elapsed="0.006529"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:20:38.935080" elapsed="0.132887"/>
</kw>
<msg time="2026-10-16T01:20:39.068094" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:39.068135" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:38.934487" elapsed="0.133683"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:20:39.068324" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:20:39.068240" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:39.068223" elapsed="0.000177"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:20:39.068810" 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-10-16T01:20:39.069105" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:20:39.069168" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:20:38.933890" elapsed="0.135361"/>
</kw>
<msg time="2026-10-16T01:20:39.069332" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:39.069370" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:38.932106" elapsed="0.137299"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:39.069718" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:39.069488" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:39.069472" elapsed="0.000319"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:20:38.931968" elapsed="0.137844"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:39.072303" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:39.072218" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:39.072201" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:39.073479" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:39.073380" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:39.073364" elapsed="0.000178"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:20:39.073927" 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-10-16T01:20:39.073683" elapsed="0.000268"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:20:39.074281" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:20:39.074110" elapsed="0.000195"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:20:39.116962" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:20:39.074905" elapsed="0.042234"/>
</kw>
<msg time="2026-10-16T01:20:39.117297" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:20:39.117337" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:39.074473" elapsed="0.042898"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:20:39.197532" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:39.117996" elapsed="0.079741"/>
</kw>
<msg time="2026-10-16T01:20:39.197896" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:20:39.197936" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:39.117550" elapsed="0.080421"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:39.198242" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:39.198042" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:39.198023" elapsed="0.000344"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:39.198916" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:39.198560" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:39.199255" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:39.199061" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:39.199045" elapsed="0.000302"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:20:39.199376" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:39.201856" 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-10-16T01:20:39.203551" elapsed="0.000607"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:20:39.205334" 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-10-16T01:20:39.200172" elapsed="0.005804"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:20:39.199659" elapsed="0.006434"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:20:39.073125" elapsed="0.133045"/>
</kw>
<msg time="2026-10-16T01:20:39.206251" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:39.206290" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:39.072528" elapsed="0.133797"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:20:39.206493" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:20:39.206393" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:39.206377" elapsed="0.000192"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:20:39.206946" 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-10-16T01:20:39.207244" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:20:39.207308" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:20:39.071926" elapsed="0.135465"/>
</kw>
<msg time="2026-10-16T01:20:39.207492" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:39.207531" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:39.070054" elapsed="0.137512"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:39.207933" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:39.207632" elapsed="0.000351"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:39.207616" elapsed="0.000389"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:20:39.069919" elapsed="0.138108"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:20:38.788788" elapsed="0.419265"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:20:38.783979" elapsed="0.424124"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:20:38.779459" elapsed="0.428694"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:38.778528" elapsed="0.429666"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:20:38.775651" elapsed="0.432589"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:39.211720" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:39.211400" elapsed="0.000376"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:39.211383" elapsed="0.000416"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:20:39.212176" 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-10-16T01:20:39.212268" 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-10-16T01:20:39.212042" elapsed="0.000250"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:39.212805" level="INFO">Attempting to execute command "sudo ovs-vsctl del-br br-s1" on remote system "10.30.171.104" 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-10-16T01:20:39.212500" elapsed="0.000348"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:20:39.213329" level="INFO">${conn_id} = 333</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-10-16T01:20:39.213024" elapsed="0.000329"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:20:39.214200" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:20:39.214267" 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-10-16T01:20:39.213937" elapsed="0.000352"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:39.214453" elapsed="0.000302"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:20:39.215563" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:20:39.644170" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:20:26 UTC 2026

  System load:  0.02               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:20:33 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:20:39.215283" elapsed="0.428995"/>
</kw>
<msg time="2026-10-16T01:20:39.644348" 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-10-16T01:20:39.214917" elapsed="0.429498"/>
</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-10-16T01:20:39.213567" elapsed="0.430960"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:20:39.644983" level="INFO">Executing command 'sudo ovs-vsctl del-br br-s1'.</msg>
<msg time="2026-10-16T01:20:39.728479" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:20:39.728745" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:20:39.728836" 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-10-16T01:20:39.644783" elapsed="0.084099"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:20:39.729247" elapsed="0.000492"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:39.730828" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:39.730226" 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-10-16T01:20:39.731289" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:39.731068" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:39.731024" elapsed="0.000440"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:20:39.731790" elapsed="0.000054"/>
</return>
<status status="PASS" start="2026-10-16T01:20:39.731575" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:39.731543" elapsed="0.000419"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:20:39.732031" elapsed="0.000028"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:39.733623" elapsed="0.000662"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:20:39.734740" elapsed="0.000310"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:20:39.735363" elapsed="0.000271"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:20:39.732689" elapsed="0.003082"/>
</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-10-16T01:20:39.210988" elapsed="0.525031"/>
</kw>
<msg time="2026-10-16T01:20:39.736125" 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-10-16T01:20:39.210447" elapsed="0.525778"/>
</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-10-16T01:20:39.210023" elapsed="0.526358"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:20:39.737549" 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-10-16T01:20:39.736864" elapsed="0.000741"/>
</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-10-16T01:20:39.744869" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:39.744089" elapsed="0.000839"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:39.745926" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:39.745265" elapsed="0.000714"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:39.746069" elapsed="0.000059"/>
</return>
<msg time="2026-10-16T01:20:39.746348" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:39.743255" elapsed="0.003143"/>
</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-10-16T01:20:39.752371" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:20:39.751767" elapsed="0.000680"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:20:39.752542" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:20:39.752849" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:20:39.751014" elapsed="0.001885"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:39.755554" 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-10-16T01:20:39.755034" elapsed="0.000613"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:39.757003" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:39.756094" elapsed="0.001003"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:20:39.764330" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:20:39.764777" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:20:39.765058" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:20:39.757838" elapsed="0.008067">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:39.757232" elapsed="0.008841">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:20:39.766499" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:39.766141" elapsed="0.000492"/>
</branch>
<status status="FAIL" start="2026-10-16T01:20:39.757196" elapsed="0.009486">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:20:39.767478" elapsed="0.000054"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:39.767851" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:39.767775" elapsed="0.000161"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:39.767736" elapsed="0.000245"/>
</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-10-16T01:20:39.768285" elapsed="0.000043"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:20:39.768468" 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-10-16T01:20:39.753612" elapsed="0.015081">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:39.768849" 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-10-16T01:20:39.750055" elapsed="0.018983">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:20:39.769533" elapsed="0.000050"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:20:39.746864" elapsed="0.022824">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:20:39.746569" elapsed="0.023271">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:20:39.742165" elapsed="0.027858">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:20:40.776582" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:40.775755" elapsed="0.000889"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:40.777658" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:40.777019" elapsed="0.000724"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:40.777840" elapsed="0.000068"/>
</return>
<msg time="2026-10-16T01:20:40.778139" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:40.774906" elapsed="0.003284"/>
</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-10-16T01:20:40.784061" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:20:40.783405" elapsed="0.000711"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:20:40.784209" elapsed="0.000056"/>
</return>
<msg time="2026-10-16T01:20:40.784506" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:20:40.782671" elapsed="0.001887"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:40.787357" 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-10-16T01:20:40.786819" elapsed="0.000655"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:40.792336" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:40.787925" elapsed="0.004540"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:20:40.799295" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:20:40.799406" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:20:40.799767" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:20:40.793170" elapsed="0.007375">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:40.792617" elapsed="0.008124">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:20:40.801180" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:40.800817" elapsed="0.000504"/>
</branch>
<status status="FAIL" start="2026-10-16T01:20:40.792578" elapsed="0.008792">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:20:40.802151" elapsed="0.000054"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:40.802419" elapsed="0.000051"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:40.802346" elapsed="0.000183"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:40.802311" elapsed="0.000266"/>
</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-10-16T01:20:40.802907" elapsed="0.000045"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:20:40.803049" elapsed="0.000031"/>
</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-10-16T01:20:40.785283" elapsed="0.017976">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:40.803377" 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-10-16T01:20:40.781739" elapsed="0.021849">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:20:40.804085" elapsed="0.000050"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:20:40.778570" elapsed="0.025670">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:20:40.778297" elapsed="0.026056">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:20:40.773737" elapsed="0.030825">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:20:41.811578" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:41.810691" elapsed="0.000951"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:41.812671" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:41.812023" elapsed="0.000732"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:41.812853" elapsed="0.000073"/>
</return>
<msg time="2026-10-16T01:20:41.813162" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:41.809857" elapsed="0.003356"/>
</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-10-16T01:20:41.819113" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:20:41.818470" elapsed="0.000698"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:20:41.819260" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:20:41.819556" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:20:41.817730" elapsed="0.001878"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:41.822327" 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-10-16T01:20:41.821772" elapsed="0.000651"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:41.823620" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:41.823097" elapsed="0.000646"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:20:41.904014" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:20:41.904112" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:20:41.904325" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:20:41.824410" elapsed="0.080503">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:41.823895" elapsed="0.081139">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:20:41.905365" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:41.905087" elapsed="0.000382"/>
</branch>
<status status="FAIL" start="2026-10-16T01:20:41.823854" elapsed="0.081648">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:20:41.906056" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:41.906237" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:41.906188" elapsed="0.000105"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:41.906163" elapsed="0.000158"/>
</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-10-16T01:20:41.906541" elapsed="0.000043"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:20:41.906647" elapsed="0.000019"/>
</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-10-16T01:20:41.820304" elapsed="0.086503">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:41.906884" 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-10-16T01:20:41.816761" elapsed="0.090242">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:20:41.907299" elapsed="0.000030"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:20:41.813603" elapsed="0.093791">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:20:41.813323" elapsed="0.094163">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:20:41.808578" elapsed="0.099028">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:20:42.914525" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:42.913624" elapsed="0.000971"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:42.915616" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:42.914974" elapsed="0.000697"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:42.915799" elapsed="0.000072"/>
</return>
<msg time="2026-10-16T01:20:42.916105" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:42.912795" elapsed="0.003467"/>
</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-10-16T01:20:42.922181" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:20:42.921540" elapsed="0.000698"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:20:42.922331" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:20:42.922628" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:20:42.920810" elapsed="0.001869"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:42.925759" 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-10-16T01:20:42.924846" elapsed="0.001012"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:42.926830" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:42.926283" elapsed="0.000637"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:20:42.933528" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:20:42.933648" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:20:42.933907" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:20:42.927601" elapsed="0.007173">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:42.927067" elapsed="0.007874">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:20:42.935346" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:42.935011" elapsed="0.000491"/>
</branch>
<status status="FAIL" start="2026-10-16T01:20:42.927026" elapsed="0.008531">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:20:42.936317" elapsed="0.000052"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:42.936607" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:42.936534" elapsed="0.000158"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:42.936495" 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-10-16T01:20:42.937072" elapsed="0.000043"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:20:42.937211" elapsed="0.000030"/>
</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-10-16T01:20:42.923369" elapsed="0.014051">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:42.937593" 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-10-16T01:20:42.919845" elapsed="0.017973">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:20:42.938272" elapsed="0.000048"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:20:42.916658" elapsed="0.021767">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:20:42.916377" elapsed="0.022190">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:20:42.911502" elapsed="0.027347">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:20:43.945886" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:43.944988" elapsed="0.000965"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:43.946975" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:43.946306" elapsed="0.000727"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:43.947131" elapsed="0.000075"/>
</return>
<msg time="2026-10-16T01:20:43.947437" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:43.944124" elapsed="0.003388"/>
</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-10-16T01:20:43.953360" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:20:43.952754" elapsed="0.000662"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:20:43.953532" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:20:43.953846" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:20:43.951997" elapsed="0.001902"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:43.956942" 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-10-16T01:20:43.956016" elapsed="0.001022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:43.958008" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:43.957484" elapsed="0.000614"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:20:43.964532" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:20:43.964647" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:20:43.964900" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:20:43.958838" elapsed="0.006849">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:43.958244" elapsed="0.007639">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:20:43.966291" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:43.965954" elapsed="0.000467"/>
</branch>
<status status="FAIL" start="2026-10-16T01:20:43.958206" elapsed="0.008293">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:20:43.967254" elapsed="0.000052"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:43.967540" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:43.967445" elapsed="0.000180"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:43.967411" 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-10-16T01:20:43.968000" elapsed="0.000044"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:20:43.968140" elapsed="0.000031"/>
</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-10-16T01:20:43.954585" elapsed="0.013857">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:43.968590" 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-10-16T01:20:43.951040" elapsed="0.017771">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:20:43.969267" elapsed="0.000049"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:20:43.947913" elapsed="0.021507">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:20:43.947630" elapsed="0.021926">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:20:43.942852" elapsed="0.026916">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:20:44.976912" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:44.976005" elapsed="0.000974"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:44.978007" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:44.977330" elapsed="0.000733"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:44.978160" elapsed="0.000074"/>
</return>
<msg time="2026-10-16T01:20:44.978488" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:44.975133" elapsed="0.003410"/>
</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-10-16T01:20:44.984514" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:20:44.983887" elapsed="0.000685"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:20:44.984666" elapsed="0.000088"/>
</return>
<msg time="2026-10-16T01:20:44.984971" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:20:44.983120" elapsed="0.001901"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:44.988136" 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-10-16T01:20:44.987192" elapsed="0.001041"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:44.989232" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:20:44.988679" elapsed="0.000644"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:20:44.996183" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:20:44.996296" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:20:44.996534" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:20:44.990089" elapsed="0.007243">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:20:44.989491" elapsed="0.008030">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:20:44.997965" elapsed="0.000138"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:44.997594" elapsed="0.000600"/>
</branch>
<status status="FAIL" start="2026-10-16T01:20:44.989428" elapsed="0.008816">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:20:44.999026" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:44.999291" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:44.999219" elapsed="0.000156"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:20:44.999184" 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-10-16T01:20:44.999772" elapsed="0.000046"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:20:44.999914" elapsed="0.000030"/>
</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-10-16T01:20:44.985782" elapsed="0.014344">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:20:45.000243" elapsed="0.000031"/>
</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-10-16T01:20:44.982149" elapsed="0.018281">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:20:45.000942" elapsed="0.000049"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:20:44.978939" elapsed="0.022155">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:20:44.978655" elapsed="0.022552">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:20:44.973857" elapsed="0.027533">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<msg time="2026-10-16T01:20:45.001604" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</msg>
<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="FAIL" start="2026-10-16T01:20:39.738069" elapsed="5.263762">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<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-10-16T01:20:39.209634" elapsed="5.792416">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<doc>Delete bridge with OVS command and verify it gets deleted from all instances.</doc>
<status status="FAIL" start="2026-10-16T01:20:38.774467" elapsed="6.227865">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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-10-16T01:20:45.005496" elapsed="0.000484"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:20:45.004929" elapsed="0.001164"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:45.008153" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:45.007957" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:45.007918" elapsed="0.000378"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:45.012837" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:45.012618" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:45.012581" elapsed="0.000398"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:45.015041" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:45.014263" elapsed="0.000835"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:45.016173" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:45.015522" elapsed="0.000705"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:45.016319" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:20:45.016624" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:45.013417" elapsed="0.003257"/>
</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-10-16T01:20:45.022105" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:45.021917" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:45.021878" elapsed="0.000367"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:45.024619" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:45.024502" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:45.024463" elapsed="0.000265"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:20:45.025250" level="INFO">${karaf_connection_index} = 222</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:20:45.024934" elapsed="0.000351"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:20:45.025814" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:20:45.025530" elapsed="0.000319"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:20:45.062061" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:20:45.026659" elapsed="0.035583"/>
</kw>
<msg time="2026-10-16T01:20:45.062427" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:20:45.062485" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:45.026065" elapsed="0.036457"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:20:45.128989" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:45.063132" elapsed="0.066045"/>
</kw>
<msg time="2026-10-16T01:20:45.129337" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:20:45.129379" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:45.062686" elapsed="0.066728"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:45.129741" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:45.129504" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:45.129484" elapsed="0.000354"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:45.130358" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:45.130018" elapsed="0.000424"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:45.130734" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:45.130520" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:45.130503" elapsed="0.000325"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:20:45.130859" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:45.133405" 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-10-16T01:20:45.135328" elapsed="0.000523"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:20:45.137260" 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-10-16T01:20:45.131666" elapsed="0.005999"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:20:45.131152" elapsed="0.006687"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:20:45.024037" elapsed="0.113881"/>
</kw>
<msg time="2026-10-16T01:20:45.138000" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:45.138039" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:45.022597" elapsed="0.115478"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:20:45.138226" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:20:45.138143" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:45.138126" elapsed="0.000177"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:20:45.138638" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:45.138980" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:20:45.139045" 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-10-16T01:20:45.021225" elapsed="0.117903"/>
</kw>
<msg time="2026-10-16T01:20:45.139210" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:45.139249" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:45.017428" elapsed="0.121856"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:45.139581" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:45.139350" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:45.139334" elapsed="0.000319"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:20:45.017119" elapsed="0.122556"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:45.142203" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:45.142118" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:45.142101" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:45.143350" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:45.143266" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:45.143251" elapsed="0.000161"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:20:45.143818" 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-10-16T01:20:45.143571" elapsed="0.000272"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:20:45.144180" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:20:45.144003" elapsed="0.000200"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:20:45.176566" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:20:45.144801" elapsed="0.031975"/>
</kw>
<msg time="2026-10-16T01:20:45.176933" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:20:45.176975" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:45.144354" elapsed="0.032656"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:20:45.241029" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:45.177601" elapsed="0.063609"/>
</kw>
<msg time="2026-10-16T01:20:45.241370" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:20:45.241412" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:45.177171" elapsed="0.064275"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:45.241811" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:45.241570" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:45.241551" elapsed="0.000359"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:45.242430" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:45.242088" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:45.242809" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:45.242592" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:45.242576" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:20:45.242935" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:45.245423" 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-10-16T01:20:45.247174" elapsed="0.000622"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:20:45.249191" 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-10-16T01:20:45.243752" elapsed="0.005835"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:20:45.243201" elapsed="0.006519"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:20:45.143015" elapsed="0.106784"/>
</kw>
<msg time="2026-10-16T01:20:45.249880" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:45.249919" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:45.142410" elapsed="0.107544"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:20:45.250106" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:20:45.250022" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:45.250005" elapsed="0.000177"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:20:45.250501" 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-10-16T01:20:45.250884" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:20:45.250950" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:20:45.141832" elapsed="0.109201"/>
</kw>
<msg time="2026-10-16T01:20:45.251113" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:45.251151" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:45.140027" elapsed="0.111160"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:45.251481" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:45.251251" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:45.251236" elapsed="0.000318"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:20:45.139890" elapsed="0.111685"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:45.253965" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:45.253878" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:45.253861" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:45.255127" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:45.255043" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:45.255026" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:20:45.255569" 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-10-16T01:20:45.255329" elapsed="0.000297"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:20:45.255984" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:20:45.255807" elapsed="0.000201"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:20:45.290592" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:20:45.256589" elapsed="0.034189"/>
</kw>
<msg time="2026-10-16T01:20:45.290931" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:20:45.290971" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:45.256161" elapsed="0.034845"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:20:45.355437" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:45.291629" elapsed="0.063995"/>
</kw>
<msg time="2026-10-16T01:20:45.355799" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:20:45.355839" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:45.291191" elapsed="0.064683"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:45.356144" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:45.355943" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:45.355925" elapsed="0.000312"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:45.356785" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:45.356419" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:45.357118" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:45.356924" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:45.356908" elapsed="0.000302"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:20:45.357241" elapsed="0.000024"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:45.359685" 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-10-16T01:20:45.361383" elapsed="0.000613"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:20:45.363353" 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-10-16T01:20:45.358034" elapsed="0.005725"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:20:45.357517" elapsed="0.006357"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:20:45.254786" elapsed="0.109166"/>
</kw>
<msg time="2026-10-16T01:20:45.364033" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:45.364071" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:45.254171" elapsed="0.109934"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:20:45.364256" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:20:45.364173" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:45.364157" elapsed="0.000175"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:20:45.364654" 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-10-16T01:20:45.365035" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:20:45.365134" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:20:45.253568" elapsed="0.111654"/>
</kw>
<msg time="2026-10-16T01:20:45.365304" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:45.365342" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:45.251834" elapsed="0.113542"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:45.365673" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:45.365443" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:45.365427" elapsed="0.000335"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:20:45.251681" elapsed="0.114103"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:20:45.016808" elapsed="0.349002"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:20:45.011944" elapsed="0.353916"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:20:45.007343" elapsed="0.358567"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:45.006417" elapsed="0.359534"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:20:45.004124" elapsed="0.361876"/>
</kw>
<kw name="Verify Sample Port Is Modified" owner="ClusterOvsdb">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:20:45.368146" 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-10-16T01:20:45.367818" elapsed="0.000354"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:20:45.372663" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:20:45.371374" elapsed="0.001337">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:20:46.381876" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:20:46.378969" elapsed="0.002994">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:20:47.392120" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:20:47.388858" elapsed="0.003362">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:20:48.398959" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:20:48.397098" elapsed="0.001924">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:20:49.408855" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:20:49.405742" elapsed="0.003205">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:20:50.418508" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:20:50.415462" elapsed="0.003158">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<msg time="2026-10-16T01:20:50.418859" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: Variable '${ovsdb_uuid}' not found.</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-10-16T01:20:45.368374" elapsed="5.050794">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: Variable '${ovsdb_uuid}' not found.</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-10-16T01:20:45.367426" elapsed="5.052105">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: Variable '${ovsdb_uuid}' not found.</status>
</kw>
<doc>Verify modified port exists in all instances.</doc>
<status status="FAIL" start="2026-10-16T01:20:45.003045" elapsed="5.416869">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: Variable '${ovsdb_uuid}' not found.</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-10-16T01:20:50.423948" elapsed="0.000503"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:20:50.423277" elapsed="0.001331"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:50.426816" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:50.426562" elapsed="0.000355"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:50.426498" elapsed="0.000469"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:50.431253" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:50.431063" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:50.431025" elapsed="0.000370"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:50.433483" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:50.432742" elapsed="0.000826"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:50.434576" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:50.433938" elapsed="0.000695"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:50.434754" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:20:50.435048" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:50.431902" elapsed="0.003198"/>
</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-10-16T01:20:50.441120" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:50.440927" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:50.440888" elapsed="0.000376"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:50.444067" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:50.443755" elapsed="0.000415"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:50.443675" elapsed="0.000541"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:20:50.445244" level="INFO">${karaf_connection_index} = 222</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:20:50.444651" elapsed="0.000651"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:20:50.446167" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:20:50.445739" elapsed="0.000482"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:20:50.479967" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:20:50.447658" elapsed="0.032568"/>
</kw>
<msg time="2026-10-16T01:20:50.480446" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:20:50.480504" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:50.446603" elapsed="0.033968"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:20:50.558964" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:50.481434" elapsed="0.077713"/>
</kw>
<msg time="2026-10-16T01:20:50.559305" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:20:50.559347" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:50.480844" elapsed="0.078538"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:50.559749" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:50.559497" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:50.559478" elapsed="0.000370"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:50.560375" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:50.560029" elapsed="0.000429"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:50.560764" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:50.560547" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:50.560503" elapsed="0.000356"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:20:50.560890" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:50.563353" 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-10-16T01:20:50.565093" elapsed="0.000500"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:20:50.566790" 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-10-16T01:20:50.561687" elapsed="0.005481"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:20:50.561174" elapsed="0.006113"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:20:50.443092" elapsed="0.124271"/>
</kw>
<msg time="2026-10-16T01:20:50.567444" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:50.567483" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:50.441617" elapsed="0.125913"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:20:50.567683" elapsed="0.000049"/>
</return>
<status status="PASS" start="2026-10-16T01:20:50.567599" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:50.567582" 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-10-16T01:20:50.568108" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:50.568401" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:20:50.568464" 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-10-16T01:20:50.440213" elapsed="0.128350"/>
</kw>
<msg time="2026-10-16T01:20:50.568647" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:50.568687" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:50.435886" elapsed="0.132960"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:50.569143" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:50.568916" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:50.568900" elapsed="0.000315"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:20:50.435545" elapsed="0.133696"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:50.571799" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:50.571687" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:50.571670" 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-10-16T01:20:50.572951" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:50.572868" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:50.572852" elapsed="0.000161"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:20:50.573410" 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-10-16T01:20:50.573154" elapsed="0.000281"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:20:50.573800" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:20:50.573608" elapsed="0.000216"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:20:50.607935" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:20:50.574392" elapsed="0.033734"/>
</kw>
<msg time="2026-10-16T01:20:50.608292" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:20:50.608333" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:50.573977" elapsed="0.034391"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:20:50.680254" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:50.609003" elapsed="0.071427"/>
</kw>
<msg time="2026-10-16T01:20:50.680599" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:20:50.680640" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:50.608549" elapsed="0.072125"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:50.680984" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:50.680781" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:50.680762" elapsed="0.000317"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:50.681607" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:50.681257" elapsed="0.000432"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:50.681963" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:50.681766" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:50.681750" elapsed="0.000305"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:20:50.682086" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:50.684554" 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-10-16T01:20:50.686282" elapsed="0.000478"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:20:50.687933" elapsed="0.000308"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:20:50.682880" elapsed="0.005426"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:20:50.682355" elapsed="0.006068"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:20:50.572597" elapsed="0.115903"/>
</kw>
<msg time="2026-10-16T01:20:50.688597" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:50.688636" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:50.572008" elapsed="0.116663"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:20:50.688853" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:20:50.688768" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:50.688751" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:20:50.689242" 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-10-16T01:20:50.689556" elapsed="0.000065"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:20:50.689666" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:20:50.571382" elapsed="0.118413"/>
</kw>
<msg time="2026-10-16T01:20:50.689879" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:50.689918" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:50.569486" elapsed="0.120466"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:50.690234" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:50.690019" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:50.690004" elapsed="0.000301"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:20:50.569351" elapsed="0.120976"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:50.692913" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:50.692829" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:50.692812" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:50.694255" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:50.694172" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:50.694155" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:20:50.694694" 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-10-16T01:20:50.694458" elapsed="0.000277"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:20:50.695077" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:20:50.694894" elapsed="0.000207"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:20:50.728611" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:20:50.695673" elapsed="0.033154"/>
</kw>
<msg time="2026-10-16T01:20:50.728982" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:20:50.729023" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:50.695252" elapsed="0.033806"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:20:50.797911" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:50.729650" elapsed="0.068439"/>
</kw>
<msg time="2026-10-16T01:20:50.798243" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:20:50.798283" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:50.729218" elapsed="0.069100"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:50.798600" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:50.798387" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:50.798370" elapsed="0.000325"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:50.799242" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:50.798904" elapsed="0.000420"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:50.799591" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:50.799384" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:50.799368" elapsed="0.000317"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:20:50.799732" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:50.802289" 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-10-16T01:20:50.804029" elapsed="0.000455"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:20:50.805687" 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-10-16T01:20:50.800484" elapsed="0.005597"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:20:50.799998" elapsed="0.006202"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:20:50.693913" elapsed="0.112365"/>
</kw>
<msg time="2026-10-16T01:20:50.806360" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:50.806399" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:50.693120" elapsed="0.113314"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:20:50.806601" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:20:50.806502" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:50.806485" elapsed="0.000193"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:20:50.807007" 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-10-16T01:20:50.807308" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:20:50.807372" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:20:50.692501" elapsed="0.114955"/>
</kw>
<msg time="2026-10-16T01:20:50.807558" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:50.807599" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:50.690584" elapsed="0.117050"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:50.807933" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:50.807715" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:50.807685" elapsed="0.000319"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:20:50.690434" elapsed="0.117591"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:20:50.435207" elapsed="0.372845"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:20:50.430345" elapsed="0.377758"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:20:50.425961" elapsed="0.382193"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:50.424999" elapsed="0.383196"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:20:50.422123" elapsed="0.386118"/>
</kw>
<kw name="Delete Sample Port And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:20:50.813711" 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-10-16T01:20:50.812537" elapsed="0.001212">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-10-16T01:20:50.420766" elapsed="0.393117">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-10-16T01:20:50.815221" elapsed="0.000199"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:20:50.814982" elapsed="0.000487"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:50.816445" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:50.816360" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:50.816343" elapsed="0.000166"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:50.818363" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:50.818280" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:50.818264" elapsed="0.000202"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:50.819379" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:50.819055" elapsed="0.000350"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:50.819861" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:50.819574" elapsed="0.000312"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:50.819927" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:20:50.820051" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:50.818689" elapsed="0.001384"/>
</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-10-16T01:20:50.822554" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:50.822457" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:50.822440" elapsed="0.000177"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:50.823761" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:50.823657" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:50.823640" elapsed="0.000183"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:20:50.824192" level="INFO">${karaf_connection_index} = 222</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:20:50.823966" elapsed="0.000250"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:20:50.824567" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:20:50.824373" elapsed="0.000219"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:20:50.860745" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:20:50.825169" elapsed="0.035764"/>
</kw>
<msg time="2026-10-16T01:20:50.861092" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:20:50.861133" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:50.824760" elapsed="0.036407"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:20:50.948949" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:50.861835" elapsed="0.087295"/>
</kw>
<msg time="2026-10-16T01:20:50.949283" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:20:50.949324" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:50.861331" elapsed="0.088028"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:50.949646" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:50.949428" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:50.949410" elapsed="0.000350"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:50.950279" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:50.949940" elapsed="0.000426"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:50.950636" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:50.950426" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:50.950410" elapsed="0.000335"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:20:50.950776" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:50.953247" 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-10-16T01:20:50.955006" elapsed="0.000454"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:20:50.956647" elapsed="0.000524"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:20:50.951589" elapsed="0.005647"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:20:50.951046" elapsed="0.006305"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:20:50.823349" elapsed="0.134078"/>
</kw>
<msg time="2026-10-16T01:20:50.957510" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:50.957568" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:50.822777" elapsed="0.134827"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:20:50.957772" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:20:50.957672" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:50.957656" elapsed="0.000193"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:20:50.958157" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:50.958452" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:20:50.958527" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:20:50.822172" elapsed="0.136441"/>
</kw>
<msg time="2026-10-16T01:20:50.958739" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:50.958782" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:50.820396" elapsed="0.138420"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:50.959098" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:50.958884" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:50.958868" elapsed="0.000300"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:20:50.820259" elapsed="0.138931"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:50.961726" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:50.961627" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:50.961610" elapsed="0.000179"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:50.962873" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:50.962790" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:50.962773" elapsed="0.000161"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:20:50.963294" 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-10-16T01:20:50.963074" elapsed="0.000245"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:20:50.963664" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:20:50.963476" elapsed="0.000211"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:20:51.000273" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:20:50.964264" elapsed="0.036182"/>
</kw>
<msg time="2026-10-16T01:20:51.000635" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:20:51.000677" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:50.963856" elapsed="0.036873"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:20:51.105071" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:51.001312" elapsed="0.104120"/>
</kw>
<msg time="2026-10-16T01:20:51.105685" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:20:51.105774" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:51.000893" elapsed="0.104935"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:51.106273" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:51.105945" elapsed="0.000428"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:51.105911" elapsed="0.000502"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:51.107252" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:51.106711" elapsed="0.000666"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:51.107777" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:51.107460" elapsed="0.000429"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:51.107438" elapsed="0.000487"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:20:51.107972" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:51.111512" elapsed="0.000800"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:20:51.114184" elapsed="0.000889"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:20:51.116630" elapsed="0.000514"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:20:51.109191" elapsed="0.008061"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:20:51.108408" elapsed="0.009006"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:20:50.962499" elapsed="0.155042"/>
</kw>
<msg time="2026-10-16T01:20:51.117661" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:51.117738" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:50.961933" elapsed="0.155860"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:20:51.118022" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-10-16T01:20:51.117897" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:51.117872" 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 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-10-16T01:20:51.118645" elapsed="0.000034"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:51.119305" elapsed="0.000033"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:20:51.119401" elapsed="0.000021"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:20:50.961325" elapsed="0.158211"/>
</kw>
<msg time="2026-10-16T01:20:51.119659" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:51.119736" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:50.959433" elapsed="0.160357"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:51.120219" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:51.119901" elapsed="0.000389"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:51.119876" elapsed="0.000448"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:20:50.959299" elapsed="0.161056"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:51.124062" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:51.123945" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:51.123922" 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-10-16T01:20:51.125925" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:51.125806" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:51.125782" elapsed="0.000234"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:20:51.126582" 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-10-16T01:20:51.126225" elapsed="0.000391"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:20:51.127079" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:20:51.126864" elapsed="0.000241"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:20:51.169866" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:20:51.127778" elapsed="0.042361"/>
</kw>
<msg time="2026-10-16T01:20:51.170388" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:20:51.170445" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:51.127262" elapsed="0.043232"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:20:51.269069" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:51.172129" elapsed="0.097240"/>
</kw>
<msg time="2026-10-16T01:20:51.269605" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:20:51.269648" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:51.171040" elapsed="0.098645"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:51.270119" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:51.269816" elapsed="0.000378"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:51.269781" elapsed="0.000443"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:51.270869" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:51.270409" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:51.271219" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:51.271022" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:51.271005" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:20:51.271346" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:51.274008" 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-10-16T01:20:51.275752" elapsed="0.000475"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:20:51.277604" 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-10-16T01:20:51.272255" elapsed="0.005748"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:20:51.271688" elapsed="0.006431"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:20:51.125382" elapsed="0.152816"/>
</kw>
<msg time="2026-10-16T01:20:51.278288" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:51.278329" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:51.124464" elapsed="0.153901"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:20:51.278577" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-10-16T01:20:51.278472" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:51.278452" elapsed="0.000347"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:20:51.279146" 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-10-16T01:20:51.279454" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:20:51.279533" 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-10-16T01:20:51.123464" elapsed="0.156158"/>
</kw>
<msg time="2026-10-16T01:20:51.279725" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:51.279766" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:51.120778" elapsed="0.159024"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:51.280104" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:51.279870" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:51.279855" elapsed="0.000321"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:20:51.120537" elapsed="0.159662"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:20:50.820121" elapsed="0.460110"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:20:50.817990" elapsed="0.462300"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:20:50.816108" elapsed="0.464236"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:50.815630" elapsed="0.464758"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:20:50.814637" elapsed="0.465802"/>
</kw>
<kw name="Delete Sample Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:20:51.284508" 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-10-16T01:20:51.283360" elapsed="0.001194">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-10-16T01:20:50.814137" elapsed="0.470556">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-10-16T01:20:51.286201" elapsed="0.000214"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:20:51.285958" elapsed="0.000507"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:51.287384" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:51.287296" elapsed="0.000131"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:51.287279" elapsed="0.000168"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:51.289327" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:51.289245" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:51.289229" elapsed="0.000160"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:51.290309" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:51.289978" elapsed="0.000357"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:51.290795" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:51.290485" elapsed="0.000334"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:51.290861" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:20:51.290987" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:51.289607" elapsed="0.001402"/>
</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-10-16T01:20:51.293548" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:51.293449" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:51.293432" elapsed="0.000179"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:51.294786" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:51.294681" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:51.294664" elapsed="0.000184"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:20:51.295225" level="INFO">${karaf_connection_index} = 222</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:20:51.294992" elapsed="0.000258"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:20:51.295607" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:20:51.295411" elapsed="0.000220"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:20:51.329901" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:20:51.296214" elapsed="0.033941"/>
</kw>
<msg time="2026-10-16T01:20:51.330372" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:20:51.330420" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:51.295802" elapsed="0.034656"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:20:51.413049" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:51.331260" elapsed="0.082079"/>
</kw>
<msg time="2026-10-16T01:20:51.413569" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:20:51.413615" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:51.330720" elapsed="0.082931"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:51.414104" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:51.413794" elapsed="0.000389"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:51.413753" elapsed="0.000461"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:51.414895" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:51.414402" elapsed="0.000589"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:51.415261" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:51.415055" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:51.415038" elapsed="0.000321"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:20:51.415395" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:51.418201" 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-10-16T01:20:51.420112" elapsed="0.000505"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:20:51.422001" 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-10-16T01:20:51.416410" elapsed="0.005981"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:20:51.415800" elapsed="0.006712"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:20:51.294400" elapsed="0.128220"/>
</kw>
<msg time="2026-10-16T01:20:51.422767" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:51.422815" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:51.293773" elapsed="0.129080"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:20:51.423020" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-10-16T01:20:51.422929" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:51.422911" elapsed="0.000194"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:20:51.423513" elapsed="0.000045"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:51.424004" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:20:51.424073" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:20:51.293159" elapsed="0.131007"/>
</kw>
<msg time="2026-10-16T01:20:51.424257" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:51.424298" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:51.291346" elapsed="0.132989"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:51.424665" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:51.424408" elapsed="0.000395"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:51.424391" elapsed="0.000445"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:20:51.291206" elapsed="0.133655"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:51.427555" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:51.427448" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:51.427430" 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-10-16T01:20:51.428789" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:51.428670" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:51.428652" elapsed="0.000202"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:20:51.429239" 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-10-16T01:20:51.429000" elapsed="0.000264"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:20:51.429630" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:20:51.429426" elapsed="0.000229"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:20:51.470188" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:20:51.430320" elapsed="0.040069"/>
</kw>
<msg time="2026-10-16T01:20:51.470577" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:20:51.470621" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:51.429841" elapsed="0.040817"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:20:51.564910" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:51.471329" elapsed="0.093781"/>
</kw>
<msg time="2026-10-16T01:20:51.565272" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:20:51.565314" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:51.470870" elapsed="0.094479"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:51.565678" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:51.565432" elapsed="0.000353"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:51.565408" elapsed="0.000408"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:51.566376" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:51.566004" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:51.566787" elapsed="0.000079"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:51.566550" elapsed="0.000373"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:51.566515" elapsed="0.000432"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:20:51.566980" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:51.569679" 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-10-16T01:20:51.571481" elapsed="0.000535"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:20:51.573435" elapsed="0.000370"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:20:51.567884" elapsed="0.005996"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:20:51.567302" elapsed="0.006700"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:20:51.428386" elapsed="0.145696"/>
</kw>
<msg time="2026-10-16T01:20:51.574172" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:51.574215" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:51.427786" elapsed="0.146466"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:20:51.574412" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-16T01:20:51.574324" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:51.574307" elapsed="0.000188"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:20:51.574979" 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-10-16T01:20:51.575291" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:20:51.575355" 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-10-16T01:20:51.427139" elapsed="0.148305"/>
</kw>
<msg time="2026-10-16T01:20:51.575550" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:51.575595" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:51.425154" elapsed="0.150476"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:51.575956" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:51.575716" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:51.575683" elapsed="0.000346"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:20:51.425005" elapsed="0.151046"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:51.578763" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:51.578660" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:51.578643" elapsed="0.000184"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:51.579950" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:51.579863" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:51.579844" elapsed="0.000169"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:20:51.580391" 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-10-16T01:20:51.580156" elapsed="0.000261"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:20:51.580815" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:20:51.580598" elapsed="0.000243"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:20:51.616512" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:20:51.581423" elapsed="0.035361"/>
</kw>
<msg time="2026-10-16T01:20:51.616974" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:20:51.617017" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:51.580996" elapsed="0.036110"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:20:51.705065" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:51.617851" elapsed="0.087411"/>
</kw>
<msg time="2026-10-16T01:20:51.705427" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:20:51.705469" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:51.617315" elapsed="0.088191"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:51.705892" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:51.705619" elapsed="0.000348"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:51.705591" elapsed="0.000404"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:51.706549" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:51.706180" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:51.706916" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:51.706716" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:51.706684" elapsed="0.000325"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:20:51.707043" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:51.709645" elapsed="0.000495"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:20:51.711367" elapsed="0.000500"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:20:51.713079" 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-10-16T01:20:51.707922" elapsed="0.005545"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:20:51.707366" elapsed="0.006240"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:20:51.579564" elapsed="0.134122"/>
</kw>
<msg time="2026-10-16T01:20:51.713801" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:51.713842" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:51.578975" elapsed="0.134903"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:20:51.714037" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:20:51.713949" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:51.713932" elapsed="0.000185"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:20:51.714447" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:51.714788" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:20:51.714853" 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-10-16T01:20:51.578335" elapsed="0.136608"/>
</kw>
<msg time="2026-10-16T01:20:51.715031" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:51.715074" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:51.576315" elapsed="0.138794"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:51.715482" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:51.715179" elapsed="0.000374"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:51.715163" elapsed="0.000414"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:20:51.576176" elapsed="0.139424"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:20:51.291059" elapsed="0.424573"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:20:51.288953" elapsed="0.426736"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:20:51.287038" elapsed="0.428757"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:51.286628" elapsed="0.429213"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:20:51.285602" elapsed="0.430290"/>
</kw>
<kw name="Create Sample Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:20:51.720280" 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-10-16T01:20:51.718977" elapsed="0.001339">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-10-16T01:20:51.285037" elapsed="0.435415">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-10-16T01:20:51.723006" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:20:51.722464" elapsed="0.000797"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:51.724166" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:51.724080" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:51.724063" elapsed="0.000165"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:51.726140" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:51.726057" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:51.726040" elapsed="0.000162"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:51.727120" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:51.726793" elapsed="0.000353"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:51.727582" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:51.727294" elapsed="0.000313"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:51.727647" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:20:51.727789" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:51.726403" elapsed="0.001409"/>
</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-10-16T01:20:51.730315" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:51.730231" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:51.730214" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:51.731646" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:51.731518" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:51.731502" elapsed="0.000233"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:20:51.732114" level="INFO">${karaf_connection_index} = 222</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:20:51.731882" elapsed="0.000262"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:20:51.732507" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:20:51.732320" elapsed="0.000225"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:20:51.767179" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:20:51.733150" elapsed="0.034231"/>
</kw>
<msg time="2026-10-16T01:20:51.767565" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:20:51.767612" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:51.732730" elapsed="0.034918"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:20:51.856977" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:51.768417" elapsed="0.088793"/>
</kw>
<msg time="2026-10-16T01:20:51.857412" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:20:51.857467" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:51.767944" elapsed="0.089569"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:51.857928" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:51.857636" elapsed="0.000385"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:51.857602" elapsed="0.000448"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:51.858695" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:51.858274" elapsed="0.000549"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:51.859124" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:51.858901" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:51.858882" elapsed="0.000348"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:20:51.859265" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:51.862138" elapsed="0.000595"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:20:51.864097" elapsed="0.000538"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:20:51.865965" 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-10-16T01:20:51.860228" elapsed="0.006129"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:20:51.859625" elapsed="0.006868"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:20:51.731261" elapsed="0.135342"/>
</kw>
<msg time="2026-10-16T01:20:51.866765" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:51.866812" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:51.730589" elapsed="0.136260"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:20:51.867050" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-10-16T01:20:51.866934" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:51.866909" 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-10-16T01:20:51.867486" 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-10-16T01:20:51.867914" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:20:51.867985" 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-10-16T01:20:51.729942" elapsed="0.138149"/>
</kw>
<msg time="2026-10-16T01:20:51.868185" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:51.868228" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:51.728148" elapsed="0.140133"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:51.868633" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:51.868373" elapsed="0.000413"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:51.868354" elapsed="0.000462"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:20:51.728010" elapsed="0.140831"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:51.871787" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:51.871680" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:51.871660" 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-10-16T01:20:51.873129" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:51.873041" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:51.873024" elapsed="0.000185"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:20:51.873664" 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-10-16T01:20:51.873370" elapsed="0.000321"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:20:51.874227" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:20:51.874036" elapsed="0.000225"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:20:51.909164" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:20:51.875003" elapsed="0.034375"/>
</kw>
<msg time="2026-10-16T01:20:51.909567" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:20:51.909613" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:51.874443" elapsed="0.035206"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:20:52.003841" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:51.910345" elapsed="0.093694"/>
</kw>
<msg time="2026-10-16T01:20:52.004207" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:20:52.004249" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:51.909853" elapsed="0.094433"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:52.004624" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:52.004369" elapsed="0.000354"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:52.004345" elapsed="0.000413"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:52.005322" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:52.004947" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:52.005730" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:52.005473" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:52.005456" elapsed="0.000377"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:20:52.005866" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:52.008476" 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-10-16T01:20:52.010354" elapsed="0.000532"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:20:52.012303" 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-10-16T01:20:52.006741" elapsed="0.006008"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:20:52.006170" elapsed="0.006705"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:20:51.872776" elapsed="0.140179"/>
</kw>
<msg time="2026-10-16T01:20:52.013090" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:52.013133" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:51.872051" elapsed="0.141118"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:20:52.013330" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:20:52.013241" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:52.013224" elapsed="0.000185"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:20:52.013856" 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-10-16T01:20:52.014166" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:20:52.014232" 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-10-16T01:20:51.871338" elapsed="0.142982"/>
</kw>
<msg time="2026-10-16T01:20:52.014407" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:52.014448" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:51.869142" elapsed="0.145342"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:52.014824" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:52.014573" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:52.014556" elapsed="0.000345"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:20:51.868970" elapsed="0.145953"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:52.017562" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:52.017461" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:52.017444" elapsed="0.000181"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:52.018752" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:52.018637" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:52.018620" elapsed="0.000200"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:20:52.019203" 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-10-16T01:20:52.018967" elapsed="0.000262"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:20:52.019595" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:20:52.019390" elapsed="0.000231"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:20:52.053401" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:20:52.020229" elapsed="0.033370"/>
</kw>
<msg time="2026-10-16T01:20:52.053816" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:20:52.053860" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:52.019804" elapsed="0.034091"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:20:52.142500" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:52.054494" elapsed="0.088280"/>
</kw>
<msg time="2026-10-16T01:20:52.142934" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:20:52.142976" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:52.054060" elapsed="0.088951"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:52.143296" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:52.143086" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:52.143064" elapsed="0.000369"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:52.143999" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:52.143632" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:52.144346" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:52.144148" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:52.144131" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:20:52.144472" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:52.147009" 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-10-16T01:20:52.148756" elapsed="0.000461"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:20:52.150605" 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-10-16T01:20:52.145298" elapsed="0.005699"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:20:52.144794" elapsed="0.006319"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:20:52.018368" elapsed="0.132822"/>
</kw>
<msg time="2026-10-16T01:20:52.151272" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:52.151312" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:52.017786" elapsed="0.133562"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:20:52.151500" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-10-16T01:20:52.151415" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:52.151399" elapsed="0.000195"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:20:52.151988" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:52.152285" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:20:52.152349" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:20:52.017162" elapsed="0.135271"/>
</kw>
<msg time="2026-10-16T01:20:52.152518" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:52.152574" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:52.015177" elapsed="0.137433"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:52.152911" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:52.152677" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:52.152661" elapsed="0.000321"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:20:52.015041" elapsed="0.137962"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:20:51.727863" elapsed="0.425169"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:20:51.725764" elapsed="0.427325"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:20:51.723822" elapsed="0.429321"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:51.723404" elapsed="0.429781"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:20:51.721755" elapsed="0.431481"/>
</kw>
<kw name="Create Sample Port And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:20:52.158627" 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-10-16T01:20:52.157328" elapsed="0.001337">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-10-16T01:20:51.721091" elapsed="0.437768">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-10-16T01:20:52.161434" elapsed="0.000360"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:20:52.160870" elapsed="0.000982"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:52.162850" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:52.162758" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:52.162737" elapsed="0.000188"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:52.164938" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:52.164850" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:52.164833" elapsed="0.000186"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:52.166061" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:52.165653" elapsed="0.000436"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:52.166562" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:52.166243" elapsed="0.000346"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:52.166648" elapsed="0.000038"/>
</return>
<msg time="2026-10-16T01:20:52.166816" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:52.165256" 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-10-16T01:20:52.169637" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:52.169545" elapsed="0.000136"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:52.169507" 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-10-16T01:20:52.170992" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:52.170889" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:52.170871" elapsed="0.000186"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:20:52.171498" level="INFO">${karaf_connection_index} = 222</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:20:52.171236" elapsed="0.000325"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:20:52.171983" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:20:52.171785" elapsed="0.000224"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:20:52.206771" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:20:52.172696" elapsed="0.034256"/>
</kw>
<msg time="2026-10-16T01:20:52.207136" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:20:52.207186" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:52.172189" elapsed="0.035049"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:20:52.299449" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:52.207937" elapsed="0.091725"/>
</kw>
<msg time="2026-10-16T01:20:52.299855" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:20:52.299899" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:52.207421" elapsed="0.092513"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:52.300228" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:52.300011" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:52.299990" elapsed="0.000337"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:52.300972" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:52.300574" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:52.301327" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:52.301126" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:52.301108" elapsed="0.000315"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:20:52.301455" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:52.304095" 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-10-16T01:20:52.305938" elapsed="0.000482"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:20:52.307638" 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-10-16T01:20:52.302313" elapsed="0.005785"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:20:52.301798" elapsed="0.006435"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:20:52.170576" elapsed="0.137738"/>
</kw>
<msg time="2026-10-16T01:20:52.308400" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:52.308440" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:52.169892" elapsed="0.138583"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:20:52.308648" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-16T01:20:52.308560" elapsed="0.000450"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:52.308541" elapsed="0.000500"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:20:52.309373" 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-10-16T01:20:52.309718" elapsed="0.000032"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:20:52.309795" 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-10-16T01:20:52.169178" elapsed="0.140706"/>
</kw>
<msg time="2026-10-16T01:20:52.309972" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:52.310012" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:52.167206" elapsed="0.142845"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:52.310340" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:52.310119" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:52.310103" elapsed="0.000310"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:20:52.167047" elapsed="0.143388"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:52.313014" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:52.312930" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:52.312912" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:52.314198" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:52.314113" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:52.314096" elapsed="0.000166"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:20:52.314657" 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-10-16T01:20:52.314406" elapsed="0.000277"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:20:52.315056" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:20:52.314871" elapsed="0.000209"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:20:52.351593" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:20:52.315748" elapsed="0.036102"/>
</kw>
<msg time="2026-10-16T01:20:52.352042" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:20:52.352086" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:52.315278" elapsed="0.036843"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:20:52.447960" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:52.352887" elapsed="0.095382"/>
</kw>
<msg time="2026-10-16T01:20:52.448491" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:20:52.448553" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:52.352332" elapsed="0.096260"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:52.449023" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:52.448718" elapsed="0.000384"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:52.448665" elapsed="0.000465"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:52.449901" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:52.449338" elapsed="0.000658"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:52.450259" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:52.450059" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:52.450042" elapsed="0.000311"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:20:52.450388" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:52.453050" elapsed="0.000494"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:20:52.454830" elapsed="0.000475"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:20:52.456515" elapsed="0.000563"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:20:52.451283" elapsed="0.005863"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:20:52.450752" elapsed="0.006510"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:20:52.313850" elapsed="0.143490"/>
</kw>
<msg time="2026-10-16T01:20:52.457425" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:52.457465" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:52.313221" elapsed="0.144280"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:20:52.457678" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-10-16T01:20:52.457586" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:52.457568" 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-10-16T01:20:52.458112" 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-10-16T01:20:52.458425" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:20:52.458490" 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-10-16T01:20:52.312617" elapsed="0.145976"/>
</kw>
<msg time="2026-10-16T01:20:52.458828" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:52.458871" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:52.310750" elapsed="0.148156"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:52.459194" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:52.458975" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:52.458959" elapsed="0.000306"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:20:52.310569" elapsed="0.148718"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:52.461915" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:52.461825" elapsed="0.000132"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:52.461807" elapsed="0.000171"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:52.463075" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:52.462992" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:52.462976" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:20:52.463510" 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-10-16T01:20:52.463280" elapsed="0.000269"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:20:52.463919" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:20:52.463729" elapsed="0.000214"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:20:52.497793" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:20:52.464505" elapsed="0.033460"/>
</kw>
<msg time="2026-10-16T01:20:52.498136" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:20:52.498178" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:52.464095" elapsed="0.034117"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:20:52.591771" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:52.498830" elapsed="0.093127"/>
</kw>
<msg time="2026-10-16T01:20:52.592112" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:20:52.592154" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:52.498373" elapsed="0.093815"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:52.592458" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:52.592258" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:52.592240" elapsed="0.000325"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:52.593113" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:52.592768" elapsed="0.000434"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:52.593455" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:52.593262" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:52.593245" elapsed="0.000315"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:20:52.593591" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:52.596124" elapsed="0.000488"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:20:52.597912" elapsed="0.000459"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:20:52.599588" elapsed="0.000531"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:20:52.594386" elapsed="0.005800"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:20:52.593892" elapsed="0.006408"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:20:52.462736" elapsed="0.137641"/>
</kw>
<msg time="2026-10-16T01:20:52.600459" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:52.600498" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:52.462124" elapsed="0.138421"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:20:52.600714" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:20:52.600615" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:52.600599" elapsed="0.000194"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:20:52.601103" 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-10-16T01:20:52.601401" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:20:52.601465" 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-10-16T01:20:52.461488" elapsed="0.140076"/>
</kw>
<msg time="2026-10-16T01:20:52.601648" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:52.601687" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:52.459560" elapsed="0.142205"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:52.602051" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:52.601835" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:52.601819" elapsed="0.000302"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:20:52.459409" elapsed="0.142732"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:20:52.166897" elapsed="0.435272"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:20:52.164500" elapsed="0.437724"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:20:52.162430" elapsed="0.439847"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:52.162005" elapsed="0.440314"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:20:52.160103" elapsed="0.442266"/>
</kw>
<kw name="Modify the destination IP of Sample Port" owner="ClusterOvsdb">
<msg time="2026-10-16T01:20:52.605380" 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-10-16T01:20:52.604078" elapsed="0.001338">Variable '${original_candidate}' not found.</status>
</kw>
<doc>Modify the dst ip of existing port in Owner.</doc>
<status status="FAIL" start="2026-10-16T01:20:52.159438" elapsed="0.446131">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-10-16T01:20:52.607106" elapsed="0.000201"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:20:52.606854" elapsed="0.000504"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:52.608600" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:52.608501" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:52.608483" elapsed="0.000182"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:52.610510" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:52.610428" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:52.610411" elapsed="0.000176"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:52.611478" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:52.611156" elapsed="0.000396"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:52.611993" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:52.611720" elapsed="0.000297"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:52.612058" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:20:52.612184" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:52.610805" elapsed="0.001401"/>
</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-10-16T01:20:52.614727" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:52.614627" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:52.614610" elapsed="0.000181"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:52.615940" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:52.615857" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:52.615841" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:20:52.616371" level="INFO">${karaf_connection_index} = 222</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:20:52.616144" elapsed="0.000251"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:20:52.616773" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:20:52.616579" elapsed="0.000219"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:20:52.650982" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:20:52.617362" elapsed="0.033794"/>
</kw>
<msg time="2026-10-16T01:20:52.651311" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:20:52.651351" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:52.616952" elapsed="0.034433"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:20:52.718623" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:52.652008" elapsed="0.066821"/>
</kw>
<msg time="2026-10-16T01:20:52.718990" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:20:52.719032" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:52.651563" elapsed="0.067503"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:52.719347" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:52.719137" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:52.719119" elapsed="0.000324"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:52.720013" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:52.719645" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:52.720359" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:52.720159" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:52.720143" elapsed="0.000311"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:20:52.720485" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:52.723051" elapsed="0.000495"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:20:52.724803" elapsed="0.000464"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:20:52.726680" 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-10-16T01:20:52.721302" elapsed="0.005775"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:20:52.720794" elapsed="0.006401"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:20:52.615510" elapsed="0.111763"/>
</kw>
<msg time="2026-10-16T01:20:52.727358" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:52.727398" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:52.614940" elapsed="0.112493"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:20:52.727624" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:20:52.727502" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:52.727485" elapsed="0.000299"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:20:52.728107" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:52.728407" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:20:52.728472" 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-10-16T01:20:52.614331" elapsed="0.114240"/>
</kw>
<msg time="2026-10-16T01:20:52.728657" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:52.728711" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:52.612550" elapsed="0.116198"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:52.729037" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:52.728817" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:52.728801" elapsed="0.000309"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:20:52.612398" elapsed="0.116733"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:52.731773" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:52.731660" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:52.731642" 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-10-16T01:20:52.732974" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:52.732889" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:52.732872" elapsed="0.000165"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:20:52.733408" 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-10-16T01:20:52.733181" elapsed="0.000252"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:20:52.733800" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:20:52.733608" elapsed="0.000216"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:20:52.766520" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:20:52.734393" elapsed="0.032336"/>
</kw>
<msg time="2026-10-16T01:20:52.766887" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:20:52.766928" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:52.733979" elapsed="0.032983"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:20:52.818865" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:52.767564" elapsed="0.051478"/>
</kw>
<msg time="2026-10-16T01:20:52.819200" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:20:52.819241" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:52.767126" elapsed="0.052187"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:52.819610" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:52.819387" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:52.819369" elapsed="0.000358"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:52.820249" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:52.819907" elapsed="0.000423"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:52.820766" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:52.820391" elapsed="0.000449"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:52.820375" elapsed="0.000488"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:20:52.820895" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:52.823379" 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-10-16T01:20:52.825159" elapsed="0.000474"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:20:52.826860" 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-10-16T01:20:52.821684" elapsed="0.005556"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:20:52.821167" elapsed="0.006192"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:20:52.732609" elapsed="0.094828"/>
</kw>
<msg time="2026-10-16T01:20:52.827519" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:52.827588" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:52.731998" elapsed="0.095626"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:20:52.827799" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:20:52.827694" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:52.827677" elapsed="0.000200"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:20:52.828191" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:52.828491" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:20:52.828569" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:20:52.731327" elapsed="0.097329"/>
</kw>
<msg time="2026-10-16T01:20:52.829043" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:52.829084" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:52.729382" elapsed="0.099737"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:52.829406" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:52.829189" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:52.829173" elapsed="0.000304"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:20:52.729243" elapsed="0.100256"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:52.832011" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:52.831927" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:52.831909" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:52.833170" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:52.833087" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:52.833070" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:20:52.833653" 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-10-16T01:20:52.833410" elapsed="0.000269"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:20:52.834033" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:20:52.833856" elapsed="0.000201"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:20:52.866775" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:20:52.834632" elapsed="0.032317"/>
</kw>
<msg time="2026-10-16T01:20:52.867105" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:20:52.867146" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:52.834210" elapsed="0.032970"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:20:52.933495" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:52.867806" elapsed="0.065881"/>
</kw>
<msg time="2026-10-16T01:20:52.933862" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:20:52.933903" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:52.867342" elapsed="0.066596"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:52.934209" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:52.934007" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:52.933990" elapsed="0.000315"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:52.934857" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:52.934485" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:52.935228" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:52.934999" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:52.934982" elapsed="0.000341"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:20:52.935354" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:52.937849" elapsed="0.000473"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:20:52.939572" elapsed="0.000472"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:20:52.941391" elapsed="0.000526"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:20:52.936139" elapsed="0.005852"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:20:52.935630" elapsed="0.006478"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:20:52.832829" elapsed="0.109357"/>
</kw>
<msg time="2026-10-16T01:20:52.942267" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:52.942306" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:52.832218" elapsed="0.110123"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:20:52.942494" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:20:52.942409" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:52.942393" elapsed="0.000195"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:20:52.942917" 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-10-16T01:20:52.943252" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:20:52.943316" 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-10-16T01:20:52.831619" elapsed="0.111782"/>
</kw>
<msg time="2026-10-16T01:20:52.943483" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:52.943522" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:52.829778" elapsed="0.113794"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:52.943992" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:52.943640" elapsed="0.000402"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:52.943624" elapsed="0.000441"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:20:52.829622" elapsed="0.114465"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:20:52.612256" elapsed="0.331857"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:20:52.610139" elapsed="0.334026"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:20:52.607942" elapsed="0.336275"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:52.607522" elapsed="0.336738"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:20:52.606391" elapsed="0.337918"/>
</kw>
<kw name="Verify Sample Port Is Modified" owner="ClusterOvsdb">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:20:52.946546" 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-10-16T01:20:52.946207" elapsed="0.000366"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:20:52.951058" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:20:52.949776" elapsed="0.001317">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:20:53.960311" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:20:53.957372" elapsed="0.003022">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:20:54.969800" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:20:54.966822" elapsed="0.003062">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:20:55.979655" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:20:55.976666" elapsed="0.003114">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:20:56.990025" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:20:56.987015" elapsed="0.003100">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:20:57.999891" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:20:57.996881" elapsed="0.003103">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<msg time="2026-10-16T01:20:58.000205" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: Variable '${ovsdb_uuid}' not found.</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-10-16T01:20:52.946788" elapsed="5.053836">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: Variable '${ovsdb_uuid}' not found.</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-10-16T01:20:52.945849" elapsed="5.055066">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: Variable '${ovsdb_uuid}' not found.</status>
</kw>
<doc>Verify port is modified in all instances.</doc>
<status status="FAIL" start="2026-10-16T01:20:52.605950" elapsed="5.395250">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: Variable '${ovsdb_uuid}' not found.</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-10-16T01:20:58.006092" elapsed="0.000545"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:20:58.005467" elapsed="0.001319"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:58.008939" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:58.008683" elapsed="0.000357"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:58.008639" elapsed="0.000451"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:58.013370" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:58.013186" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:58.013148" elapsed="0.000363"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:58.015667" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:58.014865" elapsed="0.000886"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:58.016748" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:58.016092" elapsed="0.000712"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:58.016898" elapsed="0.000059"/>
</return>
<msg time="2026-10-16T01:20:58.017184" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:58.014019" elapsed="0.003215"/>
</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-10-16T01:20:58.022999" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:58.022793" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:58.022754" elapsed="0.000414"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:58.025819" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:58.025571" elapsed="0.000349"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:58.025534" elapsed="0.000441"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:20:58.027271" level="INFO">${karaf_connection_index} = 222</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:20:58.026346" elapsed="0.000983"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:20:58.028172" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:20:58.027744" elapsed="0.000481"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:20:58.065834" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:20:58.029552" elapsed="0.036583"/>
</kw>
<msg time="2026-10-16T01:20:58.066391" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:20:58.066448" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:58.028567" elapsed="0.037930"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:20:58.155559" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:58.067412" elapsed="0.088367"/>
</kw>
<msg time="2026-10-16T01:20:58.155944" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:20:58.155986" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:58.066771" elapsed="0.089289"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:58.156350" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:58.156136" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:58.156117" elapsed="0.000331"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:58.157020" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:58.156650" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:58.157364" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:58.157165" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:58.157148" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:20:58.157492" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:58.160040" 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-10-16T01:20:58.161813" elapsed="0.000476"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:20:58.163494" 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-10-16T01:20:58.158319" elapsed="0.005603"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:20:58.157814" elapsed="0.006226"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:20:58.025001" elapsed="0.139117"/>
</kw>
<msg time="2026-10-16T01:20:58.164200" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:58.164240" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:58.023521" elapsed="0.140753"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:20:58.164429" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:20:58.164343" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:58.164326" elapsed="0.000181"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:20:58.164960" 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-10-16T01:20:58.165255" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:20:58.165319" 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-10-16T01:20:58.022098" elapsed="0.143306"/>
</kw>
<msg time="2026-10-16T01:20:58.165486" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:58.165526" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:58.018027" elapsed="0.147534"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:58.165878" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:58.165644" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:58.165628" elapsed="0.000322"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:20:58.017686" elapsed="0.148285"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:58.168468" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:58.168383" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:58.168366" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:58.169900" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:58.169818" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:58.169801" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:20:58.170365" 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-10-16T01:20:58.170139" elapsed="0.000250"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:20:58.170757" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:20:58.170548" elapsed="0.000233"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:20:58.203663" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:20:58.171349" elapsed="0.032512"/>
</kw>
<msg time="2026-10-16T01:20:58.204031" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:20:58.204072" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:58.170936" elapsed="0.033170"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:20:58.279225" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:58.204722" elapsed="0.074683"/>
</kw>
<msg time="2026-10-16T01:20:58.279561" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:20:58.279619" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:58.204270" elapsed="0.075384"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:58.279947" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:58.279743" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:58.279724" elapsed="0.000318"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:58.280572" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:58.280221" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:58.280952" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:58.280755" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:58.280737" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:20:58.281076" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:58.283552" 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-10-16T01:20:58.285297" elapsed="0.000491"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:20:58.287169" elapsed="0.000308"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:20:58.281884" elapsed="0.005658"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:20:58.281341" elapsed="0.006336"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:20:58.169512" elapsed="0.118259"/>
</kw>
<msg time="2026-10-16T01:20:58.287852" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:58.287892" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:58.168689" elapsed="0.119238"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:20:58.288078" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:20:58.287995" elapsed="0.000136"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:58.287979" elapsed="0.000174"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:20:58.288462" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:58.288905" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:20:58.288972" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:20:58.168090" elapsed="0.120967"/>
</kw>
<msg time="2026-10-16T01:20:58.289139" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:58.289178" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:58.166217" elapsed="0.122995"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:58.289494" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:58.289278" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:58.289263" elapsed="0.000301"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:20:58.166082" elapsed="0.123520"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:58.293154" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:58.293070" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:58.293053" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:58.294298" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:58.294215" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:58.294198" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:20:58.294769" 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-10-16T01:20:58.294501" elapsed="0.000293"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:20:58.295128" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:20:58.294952" elapsed="0.000200"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:20:58.331823" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:20:58.295743" elapsed="0.036262"/>
</kw>
<msg time="2026-10-16T01:20:58.332189" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:20:58.332230" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:58.295302" elapsed="0.036962"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:20:58.416821" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:58.333030" elapsed="0.083972"/>
</kw>
<msg time="2026-10-16T01:20:58.417157" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:20:58.417198" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:58.332425" elapsed="0.084808"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:58.417515" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:58.417303" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:58.417285" elapsed="0.000339"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:58.418175" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:58.417823" elapsed="0.000434"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:58.418512" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:58.418317" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:58.418301" elapsed="0.000318"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:20:58.418650" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:58.421158" elapsed="0.000481"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:20:58.422871" elapsed="0.000442"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:20:58.424481" elapsed="0.000551"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:20:58.419469" elapsed="0.005629"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:20:58.418977" elapsed="0.006238"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:20:58.293960" elapsed="0.131333"/>
</kw>
<msg time="2026-10-16T01:20:58.425374" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:58.425413" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:58.293363" elapsed="0.132085"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:20:58.425615" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:20:58.425516" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:58.425500" elapsed="0.000193"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:20:58.426019" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:58.426310" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:20:58.426373" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:20:58.292781" elapsed="0.133675"/>
</kw>
<msg time="2026-10-16T01:20:58.426537" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:58.426592" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:58.289860" elapsed="0.136768"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:58.426959" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:58.426740" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:58.426680" elapsed="0.000350"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:20:58.289725" elapsed="0.137326"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:20:58.017344" elapsed="0.409733"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:20:58.012480" elapsed="0.414647"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:20:58.008076" elapsed="0.419100"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:58.007119" elapsed="0.420097"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:20:58.004223" elapsed="0.423038"/>
</kw>
<kw name="Delete Sample Port And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:20:58.431303" 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-10-16T01:20:58.430044" elapsed="0.001293">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-10-16T01:20:58.002272" elapsed="0.429188">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-10-16T01:20:58.432755" elapsed="0.000203"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:20:58.432477" 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-10-16T01:20:58.433904" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:58.433821" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:58.433803" elapsed="0.000164"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:58.435859" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:58.435775" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:58.435759" elapsed="0.000162"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:58.436831" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:58.436471" elapsed="0.000386"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:58.437270" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:58.437004" elapsed="0.000290"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:58.437334" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:20:58.437459" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:58.436118" elapsed="0.001363"/>
</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-10-16T01:20:58.439974" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:58.439891" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:58.439874" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:58.441130" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:58.441048" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:58.441032" elapsed="0.000160"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:20:58.441554" level="INFO">${karaf_connection_index} = 222</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:20:58.441333" elapsed="0.000263"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:20:58.441945" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:20:58.441772" elapsed="0.000197"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:20:58.476513" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:20:58.442526" elapsed="0.034218"/>
</kw>
<msg time="2026-10-16T01:20:58.476922" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:20:58.476964" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:58.442122" elapsed="0.034875"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:20:58.557566" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:58.477574" elapsed="0.080223"/>
</kw>
<msg time="2026-10-16T01:20:58.557965" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:20:58.558008" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:58.477158" elapsed="0.080886"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:58.558333" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:58.558119" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:58.558099" elapsed="0.000330"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:58.559001" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:58.558622" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:58.559346" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:58.559149" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:58.559133" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:20:58.559471" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:58.562039" 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-10-16T01:20:58.563794" elapsed="0.000456"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:20:58.565629" 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-10-16T01:20:58.560321" elapsed="0.005703"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:20:58.559779" elapsed="0.006362"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:20:58.440793" elapsed="0.125425"/>
</kw>
<msg time="2026-10-16T01:20:58.566300" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:58.566340" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:58.440182" elapsed="0.126193"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:20:58.566528" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:20:58.566444" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:58.566427" elapsed="0.000194"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:20:58.567013" 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-10-16T01:20:58.567309" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:20:58.567372" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:20:58.439590" elapsed="0.127865"/>
</kw>
<msg time="2026-10-16T01:20:58.567536" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:58.567574" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:58.437840" elapsed="0.129785"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:58.567922" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:58.567692" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:58.567676" elapsed="0.000317"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:20:58.437688" elapsed="0.130326"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:58.570576" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:58.570492" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:58.570475" elapsed="0.000178"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:58.571771" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:58.571662" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:58.571646" elapsed="0.000187"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:20:58.572200" 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-10-16T01:20:58.571975" elapsed="0.000249"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:20:58.572556" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:20:58.572383" elapsed="0.000214"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:20:58.605047" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:20:58.573182" elapsed="0.032035"/>
</kw>
<msg time="2026-10-16T01:20:58.605390" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:20:58.605431" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:58.572767" elapsed="0.032699"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:20:58.682494" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:58.606090" elapsed="0.076653"/>
</kw>
<msg time="2026-10-16T01:20:58.682912" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:20:58.682955" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:58.605645" elapsed="0.077345"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:58.683270" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:58.683071" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:58.683048" elapsed="0.000323"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:58.683927" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:58.683547" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:58.684267" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:58.684072" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:58.684056" elapsed="0.000302"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:20:58.684389" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:58.686860" elapsed="0.000470"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:20:58.688552" elapsed="0.000494"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:20:58.690395" 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-10-16T01:20:58.685175" elapsed="0.005621"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:20:58.684667" elapsed="0.006244"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:20:58.571389" elapsed="0.119598"/>
</kw>
<msg time="2026-10-16T01:20:58.691067" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:58.691106" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:58.570814" elapsed="0.120327"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:20:58.691292" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:20:58.691209" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:58.691192" elapsed="0.000176"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:20:58.691692" elapsed="0.000108"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:58.692084" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:20:58.692147" 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-10-16T01:20:58.570201" elapsed="0.122031"/>
</kw>
<msg time="2026-10-16T01:20:58.692314" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:58.692353" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:58.568256" elapsed="0.124131"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:58.692689" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:58.692454" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:58.692438" elapsed="0.000338"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:20:58.568121" elapsed="0.124677"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:58.695312" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:58.695229" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:58.695211" 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-10-16T01:20:58.696506" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:58.696423" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:58.696406" elapsed="0.000199"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:20:58.696991" 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-10-16T01:20:58.696768" elapsed="0.000248"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:20:58.697347" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:20:58.697176" elapsed="0.000195"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:20:58.730547" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:20:58.697977" elapsed="0.032777"/>
</kw>
<msg time="2026-10-16T01:20:58.730928" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:20:58.730969" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:58.697524" elapsed="0.033480"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:20:58.814624" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:58.731594" elapsed="0.083234"/>
</kw>
<msg time="2026-10-16T01:20:58.814990" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:20:58.815031" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:58.731165" elapsed="0.083900"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:58.815332" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:58.815134" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:58.815116" elapsed="0.000309"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:58.815972" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:58.815621" elapsed="0.000436"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:58.816312" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:58.816117" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:58.816101" elapsed="0.000303"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:20:58.816435" elapsed="0.000024"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:58.818909" elapsed="0.000471"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:20:58.820630" elapsed="0.000479"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:20:58.822302" 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-10-16T01:20:58.817225" elapsed="0.005470"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:20:58.816738" elapsed="0.006326"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:20:58.696167" elapsed="0.126974"/>
</kw>
<msg time="2026-10-16T01:20:58.823223" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:58.823262" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:58.695568" elapsed="0.127729"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:20:58.823448" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:20:58.823365" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:58.823348" 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-10-16T01:20:58.823960" 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-10-16T01:20:58.824262" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:20:58.824326" 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-10-16T01:20:58.694938" elapsed="0.129473"/>
</kw>
<msg time="2026-10-16T01:20:58.824493" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:58.824531" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:58.693041" elapsed="0.131525"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:58.824951" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:58.824648" elapsed="0.000352"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:58.824632" elapsed="0.000391"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:20:58.692906" elapsed="0.132138"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:20:58.437528" elapsed="0.387542"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:20:58.435423" elapsed="0.389698"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:20:58.433533" elapsed="0.391638"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:58.433153" elapsed="0.392059"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:20:58.432146" elapsed="0.393113"/>
</kw>
<kw name="Delete Sample Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:20:58.829259" 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-10-16T01:20:58.828002" elapsed="0.001291">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-10-16T01:20:58.431657" elapsed="0.397761">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-10-16T01:20:58.830809" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:20:58.830534" 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-10-16T01:20:58.831959" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:58.831874" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:58.831857" elapsed="0.000165"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:58.833884" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:58.833802" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:58.833786" elapsed="0.000160"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:20:58.834857" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:20:58.834497" elapsed="0.000385"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:20:58.835295" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:20:58.835029" elapsed="0.000290"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:20:58.835359" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:20:58.835483" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:20:58.834148" elapsed="0.001358"/>
</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-10-16T01:20:58.838014" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:58.837930" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:58.837913" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:58.839205" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:58.839122" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:58.839106" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:20:58.839647" level="INFO">${karaf_connection_index} = 222</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:20:58.839408" elapsed="0.000264"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:20:58.840023" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:20:58.839849" elapsed="0.000198"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:20:58.877239" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:20:58.840629" elapsed="0.036785"/>
</kw>
<msg time="2026-10-16T01:20:58.877571" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:20:58.877627" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:58.840199" elapsed="0.037464"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:20:58.949442" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:58.878273" elapsed="0.071365"/>
</kw>
<msg time="2026-10-16T01:20:58.949818" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:20:58.949860" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:58.877852" elapsed="0.072043"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:58.950164" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:58.949964" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:58.949946" elapsed="0.000312"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:58.950808" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:58.950436" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:58.951150" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:58.950950" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:58.950934" elapsed="0.000310"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:20:58.951275" elapsed="0.000024"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:58.953812" elapsed="0.000470"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:20:58.955493" elapsed="0.000487"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:20:58.957327" 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-10-16T01:20:58.952080" elapsed="0.005649"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:20:58.951537" elapsed="0.006446"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:20:58.838866" elapsed="0.119197"/>
</kw>
<msg time="2026-10-16T01:20:58.958146" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:58.958186" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:58.838257" elapsed="0.119965"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:20:58.958375" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:20:58.958290" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:58.958273" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:20:58.958907" 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-10-16T01:20:58.959206" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:20:58.959268" 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-10-16T01:20:58.837629" elapsed="0.121724"/>
</kw>
<msg time="2026-10-16T01:20:58.959435" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:58.959474" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:58.835862" elapsed="0.123646"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:58.959824" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:58.959575" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:58.959559" elapsed="0.000338"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:20:58.835723" elapsed="0.124196"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:58.962428" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:58.962345" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:58.962328" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:58.963612" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:58.963514" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:58.963497" elapsed="0.000180"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:20:58.964063" 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-10-16T01:20:58.963841" elapsed="0.000247"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:20:58.964417" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:20:58.964246" elapsed="0.000195"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:20:58.996735" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:20:58.965038" elapsed="0.031874"/>
</kw>
<msg time="2026-10-16T01:20:58.997066" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:20:58.997107" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:58.964607" elapsed="0.032534"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:20:59.065885" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:58.997759" elapsed="0.068305"/>
</kw>
<msg time="2026-10-16T01:20:59.066220" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:20:59.066261" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:58.997304" elapsed="0.068992"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:59.066565" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:59.066365" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:59.066347" elapsed="0.000327"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:59.067237" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:59.066904" elapsed="0.000416"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:59.067573" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:59.067380" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:59.067363" elapsed="0.000367"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:20:59.067762" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:59.070227" 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-10-16T01:20:59.071958" elapsed="0.000451"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:20:59.073599" 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-10-16T01:20:59.068527" elapsed="0.005465"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:20:59.068029" elapsed="0.006078"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:20:58.963257" elapsed="0.110926"/>
</kw>
<msg time="2026-10-16T01:20:59.074263" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:59.074303" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:58.962658" elapsed="0.111681"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:20:59.074490" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:20:59.074407" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:59.074390" elapsed="0.000177"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:20:59.075184" 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-10-16T01:20:59.075483" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:20:59.075547" 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-10-16T01:20:58.962056" elapsed="0.113594"/>
</kw>
<msg time="2026-10-16T01:20:59.075753" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:59.075794" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:58.960166" elapsed="0.115663"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:59.076111" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:59.075897" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:59.075881" elapsed="0.000300"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:20:58.960027" elapsed="0.116175"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:20:59.078688" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:59.078601" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:59.078565" 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-10-16T01:20:59.079874" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:20:59.079785" elapsed="0.000131"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:59.079769" elapsed="0.000168"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:20:59.080304" 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-10-16T01:20:59.080083" elapsed="0.000245"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:20:59.080673" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:20:59.080484" elapsed="0.000230"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:20:59.115541" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:20:59.081283" elapsed="0.034479"/>
</kw>
<msg time="2026-10-16T01:20:59.115936" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:20:59.115977" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:59.080868" elapsed="0.035144"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:20:59.192773" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:59.116650" elapsed="0.076306"/>
</kw>
<msg time="2026-10-16T01:20:59.193119" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:20:59.193160" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:59.116214" elapsed="0.076981"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:59.193466" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:59.193264" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:59.193246" elapsed="0.000313"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:59.194111" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:20:59.193773" elapsed="0.000420"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:59.194450" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:59.194253" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:59.194236" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:20:59.194574" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:59.197060" 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-10-16T01:20:59.198821" elapsed="0.000451"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:20:59.200454" 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-10-16T01:20:59.195357" elapsed="0.005509"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:20:59.194870" elapsed="0.006114"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:20:59.079491" elapsed="0.121570"/>
</kw>
<msg time="2026-10-16T01:20:59.201142" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:59.201181" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:59.078913" elapsed="0.122303"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:20:59.201368" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:20:59.201285" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:59.201268" elapsed="0.000177"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:20:59.202063" 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-10-16T01:20:59.202371" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:20:59.202435" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:20:59.078295" elapsed="0.124226"/>
</kw>
<msg time="2026-10-16T01:20:59.202615" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:20:59.202657" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:59.076443" elapsed="0.126249"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:59.202993" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:59.202777" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:59.202761" elapsed="0.000345"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:20:59.076309" elapsed="0.126819"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:20:58.835553" elapsed="0.367601"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:20:58.833483" elapsed="0.369721"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:20:58.831603" elapsed="0.371652"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:20:58.831208" elapsed="0.372087"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:20:58.830204" elapsed="0.373138"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:20:59.206377" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:20:59.206146" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-16T01:20:59.206129" elapsed="0.000325"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:20:59.206801" 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-10-16T01:20:59.206893" 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-10-16T01:20:59.206656" elapsed="0.000262"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:20:59.207391" level="INFO">Attempting to execute command "sudo mn -c" on remote system "10.30.171.104" 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-10-16T01:20:59.207106" elapsed="0.000328"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:20:59.207947" level="INFO">${conn_id} = 365</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-10-16T01:20:59.207627" elapsed="0.000344"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:20:59.208808" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:20:59.208878" 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-10-16T01:20:59.208512" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:20:59.209052" elapsed="0.000280"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:20:59.210142" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:20:59.599235" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:20:26 UTC 2026

  System load:  0.02               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:20:39 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:20:59.209910" elapsed="0.389405"/>
</kw>
<msg time="2026-10-16T01:20:59.599371" 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-10-16T01:20:59.209493" elapsed="0.389933"/>
</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-10-16T01:20:59.208163" elapsed="0.391337"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:20:59.599881" level="INFO">Executing command 'sudo mn -c'.</msg>
<msg time="2026-10-16T01:21:00.829761" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:21:00.830005" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:21:00.830113" 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-10-16T01:20:59.599728" elapsed="1.230447"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:00.830547" elapsed="0.000593"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:00.832242" 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-10-16T01:21:00.831661" 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-10-16T01:21:00.832788" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:00.832503" elapsed="0.000389"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:00.832460" elapsed="0.000481"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:21:00.833261" elapsed="0.000063"/>
</return>
<status status="PASS" start="2026-10-16T01:21:00.833052" elapsed="0.000350"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:00.833017" elapsed="0.000442"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:21:00.833537" elapsed="0.000028"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:00.835197" elapsed="0.000685"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:21:00.836291" elapsed="0.000690"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:00.837303" elapsed="0.000202"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:21:00.834256" elapsed="0.003379"/>
</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-10-16T01:20:59.205722" elapsed="1.632102"/>
</kw>
<msg time="2026-10-16T01:21:00.837935" 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-10-16T01:20:59.205018" elapsed="1.633022"/>
</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-10-16T01:20:59.204578" elapsed="1.633617"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:00.842433" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:00.841914" elapsed="0.000636"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:00.841873" elapsed="0.000752"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:00.843356" 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-10-16T01:21:00.843556" 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-10-16T01:21:00.843084" elapsed="0.000548"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:00.844762" 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.104" 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-10-16T01:21:00.844076" elapsed="0.000783"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:00.845954" level="INFO">${conn_id} = 367</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-10-16T01:21:00.845244" elapsed="0.000763"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:21:00.847852" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:21:00.848007" 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-10-16T01:21:00.847260" elapsed="0.000795"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:00.848384" elapsed="0.000686"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:21:00.850885" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:21:01.266480" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:20:26 UTC 2026

  System load:  0.02               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:20:59 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:21:00.850296" elapsed="0.416264"/>
</kw>
<msg time="2026-10-16T01:21:01.266630" 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-10-16T01:21:00.849427" elapsed="0.417257"/>
</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-10-16T01:21:00.846428" elapsed="0.420347"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:21:01.267127" 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-10-16T01:21:01.320674" level="INFO">Command exited with return code -1.</msg>
<msg time="2026-10-16T01:21:01.320925" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:21:01.321013" 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-10-16T01:21:01.266974" elapsed="0.054085"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:01.321401" elapsed="0.000796"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:01.323233" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:21:01.322679" elapsed="0.000639"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:21:01.323690" elapsed="0.000061"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:01.323458" elapsed="0.000357"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:01.323418" elapsed="0.000444"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:21:01.324149" elapsed="0.000052"/>
</return>
<status status="PASS" start="2026-10-16T01:21:01.323968" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:01.323937" elapsed="0.000378"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:21:01.324382" elapsed="0.000027"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:01.325948" elapsed="0.000628"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:21:01.327041" elapsed="0.000301"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:01.327674" elapsed="0.000230"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:21:01.325047" elapsed="0.002963"/>
</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-10-16T01:21:00.840923" elapsed="0.487238"/>
</kw>
<msg time="2026-10-16T01:21:01.328264" 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-10-16T01:21:00.839522" elapsed="0.488841"/>
</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-10-16T01:21:00.838537" elapsed="0.489982"/>
</kw>
<arg>${tools_system}</arg>
<status status="PASS" start="2026-10-16T01:20:59.204270" elapsed="2.124382"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:01.332857" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:01.332255" elapsed="0.000723"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:01.332215" elapsed="0.000816"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:01.333773" 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-10-16T01:21:01.333975" 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-10-16T01:21:01.333451" elapsed="0.000578"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:01.335309" level="INFO">Attempting to execute command "sudo ovs-vsctl del-manager" on remote system "10.30.171.104" 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-10-16T01:21:01.334629" elapsed="0.000774"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:01.336493" 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-10-16T01:21:01.335848" elapsed="0.000698"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:21:01.338434" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:21:01.338587" 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-10-16T01:21:01.337899" elapsed="0.000760"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:01.339020" elapsed="0.000800"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:21:01.341551" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:21:01.756755" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:20:26 UTC 2026

  System load:  0.02               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:21:01 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:21:01.341044" elapsed="0.415796"/>
</kw>
<msg time="2026-10-16T01:21:01.756899" 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-10-16T01:21:01.340185" elapsed="0.416772"/>
</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-10-16T01:21:01.337027" elapsed="0.420016"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:21:01.757405" level="INFO">Executing command 'sudo ovs-vsctl del-manager'.</msg>
<msg time="2026-10-16T01:21:01.780766" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:21:01.780941" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:21:01.781016" 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-10-16T01:21:01.757250" elapsed="0.023808"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:01.781331" elapsed="0.000358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:01.782456" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:21:01.782069" elapsed="0.000449"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:21:01.782835" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:01.782651" elapsed="0.000258"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:01.782595" elapsed="0.000349"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:21:01.783157" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-10-16T01:21:01.783023" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:01.783000" elapsed="0.000283"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:21:01.783334" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:01.784635" 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-10-16T01:21:01.785493" elapsed="0.000271"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:01.786005" 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-10-16T01:21:01.783875" elapsed="0.002359"/>
</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-10-16T01:21:01.331203" elapsed="0.455144"/>
</kw>
<msg time="2026-10-16T01:21:01.786427" 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-10-16T01:21:01.330031" elapsed="0.456475"/>
</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-10-16T01:21:01.329060" elapsed="0.457678"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:01.789808" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:01.789358" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:01.789329" elapsed="0.000610"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:01.790486" 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-10-16T01:21:01.790658" 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-10-16T01:21:01.790280" elapsed="0.000442"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:01.791532" level="INFO">Attempting to execute command "sudo /usr/share/openvswitch/scripts/ovs-ctl stop" on remote system "10.30.171.104" 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-10-16T01:21:01.791055" elapsed="0.000548"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:01.792434" 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-10-16T01:21:01.791945" elapsed="0.000530"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:21:01.793902" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:21:01.794015" 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-10-16T01:21:01.793450" elapsed="0.000602"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:01.794310" elapsed="0.000533"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:21:01.796189" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:21:02.203390" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:20:26 UTC 2026

  System load:  0.02               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:21:01 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:21:01.795794" elapsed="0.407714"/>
</kw>
<msg time="2026-10-16T01:21:02.203598" 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-10-16T01:21:01.795123" elapsed="0.408562"/>
</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-10-16T01:21:01.792847" elapsed="0.410955"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:21:02.204256" level="INFO">Executing command 'sudo /usr/share/openvswitch/scripts/ovs-ctl stop'.</msg>
<msg time="2026-10-16T01:21:02.490295" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:21:02.490541" level="INFO">${stdout} =  * Exiting ovs-vswitchd (4210)
 * Exiting ovsdb-server (4193)</msg>
<msg time="2026-10-16T01:21:02.490666" 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-10-16T01:21:02.204047" elapsed="0.286710"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:02.491117" elapsed="0.000442"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:02.492814" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:21:02.492124" elapsed="0.000780"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:21:02.493309" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:02.493069" elapsed="0.000340"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:02.493021" elapsed="0.000436"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:21:02.493800" elapsed="0.000054"/>
</return>
<status status="PASS" start="2026-10-16T01:21:02.493565" elapsed="0.000359"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:02.493535" elapsed="0.000439"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:21:02.494043" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:02.495676" 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-10-16T01:21:02.496900" elapsed="0.000321"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:02.497530" elapsed="0.000249"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:21:02.494744" elapsed="0.003143"/>
</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-10-16T01:21:01.788644" elapsed="0.709396"/>
</kw>
<msg time="2026-10-16T01:21:02.498148" 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-10-16T01:21:01.787769" elapsed="0.710481"/>
</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-10-16T01:21:01.787039" elapsed="0.711369"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:02.502532" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:02.502016" elapsed="0.000660"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:02.501975" elapsed="0.000785"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:02.503521" 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-10-16T01:21:02.503796" 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-10-16T01:21:02.503246" elapsed="0.000608"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:02.504960" level="INFO">Attempting to execute command "sudo rm -rf /etc/openvswitch/conf.db" on remote system "10.30.171.104" 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-10-16T01:21:02.504269" elapsed="0.000785"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:02.506151" 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-10-16T01:21:02.505440" elapsed="0.000764"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:21:02.508079" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:21:02.508233" 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-10-16T01:21:02.507471" elapsed="0.000811"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:02.508608" elapsed="0.000685"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:21:02.511071" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:21:02.910566" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:20:26 UTC 2026

  System load:  0.02               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:21:02 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:21:02.510511" elapsed="0.400174"/>
</kw>
<msg time="2026-10-16T01:21:02.910771" 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-10-16T01:21:02.509674" elapsed="0.401159"/>
</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-10-16T01:21:02.506655" elapsed="0.404263"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:21:02.911297" level="INFO">Executing command 'sudo rm -rf /etc/openvswitch/conf.db'.</msg>
<msg time="2026-10-16T01:21:02.934361" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:21:02.934501" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:21:02.934555" 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-10-16T01:21:02.911134" elapsed="0.023450"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:02.934902" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:02.935848" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:21:02.935462" elapsed="0.000440"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:21:02.936130" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:02.935994" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:02.935968" elapsed="0.000254"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:21:02.936399" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-10-16T01:21:02.936288" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:02.936268" elapsed="0.000239"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:21:02.936549" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:02.937531" elapsed="0.000430"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:21:02.938213" elapsed="0.000189"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:02.938595" elapsed="0.000160"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:21:02.936982" elapsed="0.001841"/>
</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-10-16T01:21:02.501030" elapsed="0.437887"/>
</kw>
<msg time="2026-10-16T01:21:02.938982" 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-10-16T01:21:02.499829" elapsed="0.439216"/>
</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-10-16T01:21:02.498851" elapsed="0.440291"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:02.941672" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:02.941332" elapsed="0.000433"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:02.941307" elapsed="0.000491"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:02.942232" 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-10-16T01:21:02.942358" 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-10-16T01:21:02.942061" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:02.943087" level="INFO">Attempting to execute command "sudo /usr/share/openvswitch/scripts/ovs-ctl start" on remote system "10.30.171.104" 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-10-16T01:21:02.942666" elapsed="0.000481"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:02.943833" 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-10-16T01:21:02.943387" elapsed="0.000481"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:21:02.944998" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:21:02.945094" 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-10-16T01:21:02.944635" elapsed="0.000489"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:02.945329" elapsed="0.000434"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:21:02.947091" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:21:03.336427" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:20:26 UTC 2026

  System load:  0.02               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:21:02 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:21:02.946501" elapsed="0.390082"/>
</kw>
<msg time="2026-10-16T01:21:03.336672" 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-10-16T01:21:02.945990" elapsed="0.390760"/>
</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-10-16T01:21:02.944132" elapsed="0.392703"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:21:03.337234" level="INFO">Executing command 'sudo /usr/share/openvswitch/scripts/ovs-ctl start'.</msg>
<msg time="2026-10-16T01:21:03.491767" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:21:03.491998" 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-10-16T01:21:03.492091" 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-10-16T01:21:03.337059" elapsed="0.155080"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:03.492481" elapsed="0.000483"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:03.494054" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:21:03.493442" 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-10-16T01:21:03.494511" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:03.494289" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:03.494248" elapsed="0.000438"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:21:03.495009" elapsed="0.000054"/>
</return>
<status status="PASS" start="2026-10-16T01:21:03.494828" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:03.494796" elapsed="0.000384"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:21:03.495249" elapsed="0.000028"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:03.496862" elapsed="0.000629"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:21:03.498695" elapsed="0.000501"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:03.499542" elapsed="0.000252"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:21:03.495930" elapsed="0.003969"/>
</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-10-16T01:21:02.940746" elapsed="0.559325"/>
</kw>
<msg time="2026-10-16T01:21:03.500181" 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-10-16T01:21:02.940000" elapsed="0.560315"/>
</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-10-16T01:21:02.939384" elapsed="0.561113"/>
</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-10-16T01:20:59.203933" elapsed="4.296726"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:21:03.501948" 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-10-16T01:21:03.501168" elapsed="0.000838"/>
</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-10-16T01:21:03.509503" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:21:03.508769" elapsed="0.000790"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:21:03.510556" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:21:03.509946" elapsed="0.000663"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:21:03.510748" elapsed="0.000060"/>
</return>
<msg time="2026-10-16T01:21:03.511036" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:21:03.507932" elapsed="0.003154"/>
</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-10-16T01:21:03.517498" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:21:03.516802" elapsed="0.001028"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:21:03.517939" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:21:03.518226" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:21:03.516001" elapsed="0.002276"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:03.520965" 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-10-16T01:21:03.520405" elapsed="0.000653"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:03.522122" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:21:03.521500" elapsed="0.000713"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:21:03.531417" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:21:03.531532" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:21:03.531815" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:21:03.522902" elapsed="0.009713">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:21:03.522346" elapsed="0.010490">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:21:03.533236" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:03.532906" elapsed="0.000458"/>
</branch>
<status status="FAIL" start="2026-10-16T01:21:03.522310" elapsed="0.011104">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:21:03.534218" elapsed="0.000052"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:21:03.534481" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:03.534409" elapsed="0.000156"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:21:03.534374" 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-10-16T01:21:03.534977" elapsed="0.000045"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:21:03.535117" 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-10-16T01:21:03.519009" elapsed="0.016319">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:21:03.535449" elapsed="0.000031"/>
</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-10-16T01:21:03.515033" elapsed="0.020629">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:21:03.536150" elapsed="0.000049"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:21:03.511459" elapsed="0.024844">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:21:03.511197" elapsed="0.025221">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:21:03.506739" elapsed="0.029862">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:21:04.543738" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:21:04.542859" elapsed="0.000948"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:21:04.544836" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:21:04.544154" elapsed="0.000738"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:21:04.544989" elapsed="0.000069"/>
</return>
<msg time="2026-10-16T01:21:04.545296" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:21:04.541991" elapsed="0.003356"/>
</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-10-16T01:21:04.551831" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:21:04.551089" elapsed="0.000800"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:21:04.551985" elapsed="0.000057"/>
</return>
<msg time="2026-10-16T01:21:04.552261" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:21:04.550322" elapsed="0.001991"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:04.555003" 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-10-16T01:21:04.554431" elapsed="0.000667"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:04.556060" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:21:04.555516" elapsed="0.000634"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:21:04.563828" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:21:04.563942" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:21:04.564150" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:21:04.556843" elapsed="0.008118">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:21:04.556289" elapsed="0.008833">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:21:04.565531" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:04.565194" elapsed="0.000490"/>
</branch>
<status status="FAIL" start="2026-10-16T01:21:04.556251" elapsed="0.009517">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:21:04.566501" elapsed="0.000052"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:21:04.566824" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:04.566747" elapsed="0.000165"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:21:04.566682" elapsed="0.000277"/>
</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-10-16T01:21:04.567264" elapsed="0.000043"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:21:04.567402" elapsed="0.000030"/>
</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-10-16T01:21:04.553024" elapsed="0.014588">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:21:04.567800" elapsed="0.000041"/>
</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-10-16T01:21:04.549348" elapsed="0.018657">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:21:04.568545" elapsed="0.000051"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:21:04.545765" elapsed="0.023023">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:21:04.545462" elapsed="0.023449">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:21:04.540575" elapsed="0.028523">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:21:05.572556" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:21:05.572139" elapsed="0.000450"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:21:05.573063" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:21:05.572779" elapsed="0.000309"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:21:05.573133" elapsed="0.000038"/>
</return>
<msg time="2026-10-16T01:21:05.573278" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:21:05.571769" elapsed="0.001532"/>
</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-10-16T01:21:05.576153" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:21:05.575879" elapsed="0.000300"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:21:05.576221" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:21:05.576342" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:21:05.575532" elapsed="0.000833"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:05.577538" 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-10-16T01:21:05.577300" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:05.578012" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:21:05.577792" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:21:05.582554" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:21:05.582620" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:21:05.582792" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:21:05.578345" elapsed="0.004932">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:21:05.578118" elapsed="0.005253">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:21:05.583559" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:05.583407" elapsed="0.000210"/>
</branch>
<status status="FAIL" start="2026-10-16T01:21:05.578098" elapsed="0.005557">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:21:05.584004" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:21:05.584187" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:05.584153" elapsed="0.000073"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:21:05.584136" elapsed="0.000110"/>
</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-10-16T01:21:05.584390" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:21:05.584452" 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-10-16T01:21:05.576681" elapsed="0.007868">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:21:05.584602" 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-10-16T01:21:05.575122" elapsed="0.009645">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:21:05.584977" elapsed="0.000023"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:21:05.573476" elapsed="0.011571">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:21:05.573360" elapsed="0.011739">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:21:05.571122" elapsed="0.014059">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:21:06.592521" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:21:06.591640" elapsed="0.000945"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:21:06.593640" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:21:06.592983" elapsed="0.000763"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:21:06.593845" elapsed="0.000070"/>
</return>
<msg time="2026-10-16T01:21:06.594148" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:21:06.590827" elapsed="0.003374"/>
</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-10-16T01:21:06.600409" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:21:06.599798" elapsed="0.000691"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:21:06.600589" elapsed="0.000082"/>
</return>
<msg time="2026-10-16T01:21:06.600932" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:21:06.599039" elapsed="0.001944"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:06.603620" 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-10-16T01:21:06.603115" elapsed="0.000656"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:06.604727" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:21:06.604193" 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-10-16T01:21:06.611524" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:21:06.611638" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:21:06.611913" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:21:06.605517" elapsed="0.007302">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:21:06.604990" elapsed="0.008001">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:21:06.613402" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:06.613065" elapsed="0.000470"/>
</branch>
<status status="FAIL" start="2026-10-16T01:21:06.604924" elapsed="0.008661">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:21:06.614386" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:21:06.614678" elapsed="0.000058"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:06.614582" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:21:06.614546" 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-10-16T01:21:06.615151" elapsed="0.000044"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:21:06.615293" elapsed="0.000030"/>
</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-10-16T01:21:06.601643" elapsed="0.013862">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:21:06.615626" elapsed="0.000054"/>
</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-10-16T01:21:06.598047" elapsed="0.017858">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:21:06.616370" elapsed="0.000048"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:21:06.594589" elapsed="0.021935">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:21:06.594316" elapsed="0.022322">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:21:06.589537" elapsed="0.027343">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:21:07.624451" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:21:07.623572" elapsed="0.000945"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:21:07.625543" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:21:07.624921" elapsed="0.000677"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:21:07.625767" elapsed="0.000094"/>
</return>
<msg time="2026-10-16T01:21:07.626102" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:21:07.622755" elapsed="0.003399"/>
</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-10-16T01:21:07.632359" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:21:07.631741" elapsed="0.000674"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:21:07.632512" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:21:07.632843" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:21:07.630782" elapsed="0.002115"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:07.635595" 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-10-16T01:21:07.635082" elapsed="0.000659"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:07.636643" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:21:07.636160" elapsed="0.000743"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:21:07.643739" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:21:07.643858" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:21:07.644091" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:21:07.637565" elapsed="0.007336">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:21:07.637053" elapsed="0.008013">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:21:07.645473" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:07.645139" elapsed="0.000466"/>
</branch>
<status status="FAIL" start="2026-10-16T01:21:07.637012" elapsed="0.008672">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:21:07.646466" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:21:07.646791" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:07.646685" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:21:07.646625" elapsed="0.000300"/>
</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-10-16T01:21:07.647229" elapsed="0.000044"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:21:07.647370" elapsed="0.000030"/>
</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-10-16T01:21:07.633629" elapsed="0.013954">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:21:07.647751" 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-10-16T01:21:07.629824" elapsed="0.018122">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:21:07.648406" elapsed="0.000050"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:21:07.626632" elapsed="0.021929">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:21:07.626366" elapsed="0.022362">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:21:07.621457" elapsed="0.027465">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:21:08.656444" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:21:08.655559" elapsed="0.000951"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:21:08.657547" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:21:08.656907" elapsed="0.000697"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:21:08.657753" elapsed="0.000072"/>
</return>
<msg time="2026-10-16T01:21:08.658064" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:21:08.654749" elapsed="0.003368"/>
</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-10-16T01:21:08.664126" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:21:08.663466" elapsed="0.000716"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:21:08.664276" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:21:08.664549" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:21:08.662755" elapsed="0.001846"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:08.667254" 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-10-16T01:21:08.666745" elapsed="0.000605"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:08.668299" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:21:08.667807" elapsed="0.000582"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:21:08.674914" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:21:08.675028" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:21:08.675258" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:21:08.669084" elapsed="0.007001">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:21:08.668529" elapsed="0.007721">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:21:08.676657" elapsed="0.000105"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:08.676320" elapsed="0.000530"/>
</branch>
<status status="FAIL" start="2026-10-16T01:21:08.668489" elapsed="0.008410">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:21:08.677637" elapsed="0.000102"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:21:08.677958" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:08.677883" elapsed="0.000161"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:21:08.677848" elapsed="0.000243"/>
</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-10-16T01:21:08.678395" elapsed="0.000044"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:21:08.678534" elapsed="0.000031"/>
</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-10-16T01:21:08.665311" elapsed="0.013491">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:21:08.678924" elapsed="0.000038"/>
</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-10-16T01:21:08.661795" elapsed="0.017355">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:21:08.679617" elapsed="0.000069"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:21:08.658600" elapsed="0.021404">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:21:08.658338" elapsed="0.021794">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:21:08.653446" elapsed="0.026945">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<msg time="2026-10-16T01:21:08.680611" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</msg>
<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="FAIL" start="2026-10-16T01:21:03.502448" elapsed="5.178415">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<doc>Cleans up test environment, close existing sessions.</doc>
<status status="FAIL" start="2026-10-16T01:20:59.203532" elapsed="9.477555">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<doc>Cleans up test environment, close existing sessions in teardown.</doc>
<status status="FAIL" start="2026-10-16T01:20:58.829750" elapsed="9.851615">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</test>
<kw name="Delete All Sessions" owner="RequestsLibrary" type="TEARDOWN">
<msg time="2026-10-16T01:21:08.682818" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects </doc>
<status status="PASS" start="2026-10-16T01:21:08.682595" elapsed="0.000417"/>
</kw>
<doc>Test suite for Ovsdb Southbound Cluster - Candidate failover and recover</doc>
<status status="FAIL" start="2026-10-16T01:17:45.911229" elapsed="202.771856"/>
</suite>
<status status="FAIL" start="2026-10-16T01:13:58.842317" elapsed="429.842754"/>
</suite>
<suite id="s1-s2" name="Southbound Cluster" source="/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/suites/ovsdb/Southbound_Cluster">
<suite id="s1-s2-s1" name="Ovsdb Southbound Cluster" source="/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:21:08.728626" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-16T01:21:08.727042" elapsed="0.001805"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-10-16T01:21:08.726716" elapsed="0.002232"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-10-16T01:21:08.731204" 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-10-16T01:21:08.729929" elapsed="0.001301"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-10-16T01:21:08.731390" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:08.731303" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:08.731284" elapsed="0.000167"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-16T01:21:08.731974" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-16T01:21:08.731621" elapsed="0.000394"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-10-16T01:21:08.732446" 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-10-16T01:21:08.732170" elapsed="0.000300"/>
</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-10-16T01:21:08.732997" elapsed="0.000254"/>
</kw>
<msg time="2026-10-16T01:21:08.733340" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:21:08.733382" 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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:08.732633" elapsed="0.000771"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:21:08.733955" 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-10-16T01:21:08.733604" elapsed="0.000377"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:21:08.734842" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:21:08.734558" elapsed="0.000309"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:21:08.735245" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:21:08.735005" elapsed="0.000265"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:21:08.735771" 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-10-16T01:21:08.735440" elapsed="0.000358"/>
</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-10-16T01:21:08.736632" elapsed="0.000196"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:21:08.737262" level="INFO">${member_ip} = 10.30.170.180</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:21:08.736987" elapsed="0.000300"/>
</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-10-16T01:21:08.737532" elapsed="0.000205"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:21:08.738609" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:21:08.738168" elapsed="0.000465"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:21:08.738689" elapsed="0.000046"/>
</return>
<msg time="2026-10-16T01:21:08.738836" 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-10-16T01:21:08.737909" elapsed="0.000951"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:21:08.739354" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.180:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a89a4396810&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-10-16T01:21:08.739029" elapsed="0.000445"/>
</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-10-16T01:21:08.739634" elapsed="0.000177"/>
</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-10-16T01:21:08.736197" elapsed="0.003669"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:21:08.736032" elapsed="0.003873"/>
</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-10-16T01:21:08.740812" elapsed="0.000160"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:21:08.741403" level="INFO">${member_ip} = 10.30.170.14</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:21:08.741125" elapsed="0.000303"/>
</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-10-16T01:21:08.741587" elapsed="0.000192"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:21:08.742469" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:21:08.742206" elapsed="0.000288"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:21:08.742534" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:21:08.742658" 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-10-16T01:21:08.741945" elapsed="0.000763"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:21:08.743176" level="INFO">Creating Session using : alias=ClusterManagement__session_2, url=http://10.30.170.14:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a899643d250&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-10-16T01:21:08.742876" elapsed="0.000403"/>
</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-10-16T01:21:08.743436" elapsed="0.000145"/>
</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-10-16T01:21:08.740342" elapsed="0.003292"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:21:08.739982" elapsed="0.003704"/>
</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-10-16T01:21:08.744364" elapsed="0.000144"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:21:08.744961" level="INFO">${member_ip} = 10.30.170.84</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:21:08.744657" elapsed="0.000328"/>
</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-10-16T01:21:08.745142" elapsed="0.000162"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:21:08.746036" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:21:08.745766" elapsed="0.000295"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:21:08.746102" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:21:08.746224" 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-10-16T01:21:08.745468" elapsed="0.000779"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:21:08.746756" level="INFO">Creating Session using : alias=ClusterManagement__session_3, url=http://10.30.170.84:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a89965eaf90&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-10-16T01:21:08.746410" elapsed="0.000485"/>
</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-10-16T01:21:08.747053" elapsed="0.000147"/>
</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-10-16T01:21:08.743936" elapsed="0.003317"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:21:08.743778" elapsed="0.003514"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-10-16T01:21:08.735847" elapsed="0.011472"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-16T01:21:08.747885" level="INFO">${ClusterManagement__member_index_list} = [1, 2, 3]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-16T01:21:08.747499" elapsed="0.000427"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-16T01:21:08.748455" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.180', 2: '10.30.170.14', 3: '10.30.170.84'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-16T01:21:08.748106" elapsed="0.000390"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-16T01:21:08.749045" 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 the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-16T01:21:08.748688" elapsed="0.000399"/>
</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-10-16T01:21:08.734195" elapsed="0.014943"/>
</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-10-16T01:21:08.729589" elapsed="0.019599"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:21:08.749335" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:08.749246" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:08.749230" elapsed="0.000167"/>
</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-10-16T01:21:08.750770" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:21:08.750409" elapsed="0.000388"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:21:08.751212" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:21:08.750943" elapsed="0.000293"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:21:08.751277" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:21:08.751401" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:21:08.749954" elapsed="0.001470"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:21:08.752386" level="INFO">${member_ip} = 10.30.170.180</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-10-16T01:21:08.752173" elapsed="0.000237"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:08.753133" 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-10-16T01:21:08.753225" 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-10-16T01:21:08.752985" elapsed="0.000265"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:08.756370" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:08.755734" elapsed="0.000734"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:08.755662" elapsed="0.000885"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:08.758190" 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-10-16T01:21:08.758521" 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-10-16T01:21:08.757498" elapsed="0.001144"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:08.759740" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.180" 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-10-16T01:21:08.759032" elapsed="0.000956"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:08.761077" 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-10-16T01:21:08.760301" elapsed="0.000895"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:21:08.762994" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:21:08.763071" 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-10-16T01:21:08.762419" elapsed="0.000675"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:08.763299" elapsed="0.000335"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:21:08.764849" level="INFO">Logging into '10.30.170.180:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:21:09.370317" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-194-generic x86_64)

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

 System information as of Fri Oct 16 01:21:08 UTC 2026

  System load:  0.16               Processes:             122
  Usage of /:   13.9% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.180
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:17:46 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:21:08.764303" elapsed="0.606199"/>
</kw>
<msg time="2026-10-16T01:21:09.370593" 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-10-16T01:21:08.763876" elapsed="0.606847"/>
</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-10-16T01:21:08.761609" elapsed="0.609387"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:21:09.372047" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-10-16T01:21:09.384764" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-10-16T01:21:09.385073" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:21:09.385262" 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-10-16T01:21:09.371446" elapsed="0.013954"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:09.385752" elapsed="0.000584"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:09.387837" 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-10-16T01:21:09.387169" elapsed="0.000849"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:21:09.388531" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:09.388201" elapsed="0.000416"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:09.388145" elapsed="0.000602"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:21:09.389185" elapsed="0.000068"/>
</return>
<status status="PASS" start="2026-10-16T01:21:09.388906" elapsed="0.000396"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:09.388863" elapsed="0.000529"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:21:09.389491" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:09.391205" elapsed="0.000398"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:21:09.391951" elapsed="0.000235"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:09.392435" elapsed="0.000166"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:21:09.390158" elapsed="0.002532"/>
</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-10-16T01:21:08.754902" elapsed="0.638146"/>
</kw>
<msg time="2026-10-16T01:21:09.393164" 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-10-16T01:21:08.754253" elapsed="0.638965"/>
</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-10-16T01:21:08.753873" elapsed="0.639491"/>
</kw>
<msg time="2026-10-16T01:21:09.393405" 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-10-16T01:21:08.753398" elapsed="0.640051"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:09.394196" elapsed="0.000285"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:21:09.394663" elapsed="0.000248"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:09.395056" elapsed="0.000092"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:21:09.393844" elapsed="0.001352"/>
</kw>
<msg time="2026-10-16T01:21:09.395284" 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-10-16T01:21:08.752603" elapsed="0.642705"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:09.395792" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:21:09.395521" elapsed="0.000313"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-10-16T01:21:09.395875" elapsed="0.000027"/>
</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-10-16T01:21:08.751753" elapsed="0.644229"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:21:08.751569" elapsed="0.644449"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:21:09.396910" level="INFO">${member_ip} = 10.30.170.14</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-10-16T01:21:09.396613" elapsed="0.000323"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:09.397643" 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-10-16T01:21:09.397780" 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-10-16T01:21:09.397499" elapsed="0.000307"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:09.401343" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:09.400617" elapsed="0.000835"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:09.400572" elapsed="0.000967"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:09.402359" 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-10-16T01:21:09.402644" 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-10-16T01:21:09.401928" elapsed="0.000900"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:09.403795" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.14" 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-10-16T01:21:09.403159" elapsed="0.000815"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:09.405301" level="INFO">${conn_id} = 380</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-10-16T01:21:09.404294" elapsed="0.001137"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:21:09.407008" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:21:09.407080" 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-10-16T01:21:09.406621" elapsed="0.000481"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:09.407302" elapsed="0.000300"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:21:09.408487" level="INFO">Logging into '10.30.170.14:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:21:10.045581" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-194-generic x86_64)

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

 System information as of Fri Oct 16 01:21:09 UTC 2026

  System load:  0.2                Processes:             121
  Usage of /:   14.0% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.14
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:17:47 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:21:09.408240" elapsed="0.637616"/>
</kw>
<msg time="2026-10-16T01:21:10.045935" 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-10-16T01:21:09.407860" elapsed="0.638161"/>
</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-10-16T01:21:09.405871" elapsed="0.640376"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:21:10.047197" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-10-16T01:21:10.060547" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-10-16T01:21:10.060853" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:21:10.061010" 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-10-16T01:21:10.046688" elapsed="0.014437"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:10.061404" elapsed="0.000534"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:10.063210" 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-10-16T01:21:10.062604" elapsed="0.000762"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:21:10.063894" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:10.063536" elapsed="0.000437"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:10.063484" 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-10-16T01:21:10.064438" elapsed="0.000060"/>
</return>
<status status="PASS" start="2026-10-16T01:21:10.064187" elapsed="0.000361"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:10.064148" elapsed="0.000479"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:21:10.064747" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:10.066386" 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-10-16T01:21:10.067064" elapsed="0.000216"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:10.067512" elapsed="0.000151"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:21:10.065288" elapsed="0.002514"/>
</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-10-16T01:21:09.399736" elapsed="0.668261"/>
</kw>
<msg time="2026-10-16T01:21:10.068100" 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-10-16T01:21:09.399069" elapsed="0.669079"/>
</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-10-16T01:21:09.398426" elapsed="0.669795"/>
</kw>
<msg time="2026-10-16T01:21:10.068257" 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-10-16T01:21:09.397962" elapsed="0.670336"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:10.068923" elapsed="0.000274"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:21:10.069376" elapsed="0.000131"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:10.069644" elapsed="0.000123"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:21:10.068566" elapsed="0.001248"/>
</kw>
<msg time="2026-10-16T01:21:10.069897" 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-10-16T01:21:09.397135" elapsed="0.672785"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:10.070347" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:21:10.070126" elapsed="0.000259"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-10-16T01:21:10.070424" elapsed="0.000026"/>
</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-10-16T01:21:09.396292" elapsed="0.674231"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:21:09.396121" elapsed="0.674478"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:21:10.071467" level="INFO">${member_ip} = 10.30.170.84</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-10-16T01:21:10.071253" elapsed="0.000239"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:10.072221" 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-10-16T01:21:10.072312" 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-10-16T01:21:10.072090" elapsed="0.000246"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:10.075414" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:10.074805" elapsed="0.000706"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:10.074762" elapsed="0.000827"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:10.076317" 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-10-16T01:21:10.076569" 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-10-16T01:21:10.075939" elapsed="0.000781"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:10.077563" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.84" 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-10-16T01:21:10.077030" elapsed="0.000873"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:10.078995" level="INFO">${conn_id} = 383</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-10-16T01:21:10.078201" elapsed="0.000907"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:21:10.080428" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:21:10.080497" 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-10-16T01:21:10.080166" elapsed="0.000354"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:10.080773" elapsed="0.000289"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:21:10.082058" level="INFO">Logging into '10.30.170.84:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:21:10.702589" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-194-generic x86_64)

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

 System information as of Fri Oct 16 01:21:10 UTC 2026

  System load:  0.02               Processes:             124
  Usage of /:   14.2% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.84
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:17:47 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:21:10.081815" elapsed="0.621157"/>
</kw>
<msg time="2026-10-16T01:21:10.703112" 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-10-16T01:21:10.081265" elapsed="0.621992"/>
</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-10-16T01:21:10.079468" elapsed="0.624124"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:21:10.704813" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-10-16T01:21:10.717378" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-10-16T01:21:10.717739" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:21:10.717927" 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-10-16T01:21:10.704169" elapsed="0.013893"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:10.718392" elapsed="0.000676"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:10.720415" 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-10-16T01:21:10.719820" elapsed="0.000848"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:21:10.721210" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:10.720889" elapsed="0.000403"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:10.720832" elapsed="0.000547"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:21:10.721838" elapsed="0.000071"/>
</return>
<status status="PASS" start="2026-10-16T01:21:10.721534" elapsed="0.000423"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:10.721492" elapsed="0.000552"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:21:10.722139" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:10.723543" 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-10-16T01:21:10.724332" elapsed="0.000230"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:10.724832" elapsed="0.000162"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:21:10.722759" elapsed="0.002309"/>
</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-10-16T01:21:10.073981" elapsed="0.651302"/>
</kw>
<msg time="2026-10-16T01:21:10.725395" 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-10-16T01:21:10.073360" elapsed="0.652089"/>
</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-10-16T01:21:10.072973" elapsed="0.652558"/>
</kw>
<msg time="2026-10-16T01:21:10.725570" 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-10-16T01:21:10.072486" elapsed="0.653127"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:10.726240" elapsed="0.000274"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:21:10.726735" elapsed="0.000137"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:10.727011" elapsed="0.000088"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:21:10.725910" elapsed="0.001234"/>
</kw>
<msg time="2026-10-16T01:21:10.727229" 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-10-16T01:21:10.071723" elapsed="0.655530"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:10.727679" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:21:10.727458" elapsed="0.000491"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-10-16T01:21:10.727987" elapsed="0.000026"/>
</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-10-16T01:21:10.070936" elapsed="0.657155"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:21:10.070766" elapsed="0.657359"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:21:08.751469" elapsed="1.976693"/>
</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-10-16T01:21:08.749589" elapsed="1.978632"/>
</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-10-16T01:21:10.728373" elapsed="0.000207"/>
</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-10-16T01:21:10.734196" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:10.734110" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:10.734092" elapsed="0.000168"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:10.734585" 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-10-16T01:21:10.734678" 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-10-16T01:21:10.734452" elapsed="0.000279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:10.735185" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:21:10.734953" elapsed="0.000273"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:10.735630" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:21:10.735411" elapsed="0.000259"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:21:10.736383" 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-10-16T01:21:10.736199" elapsed="0.000296">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-10-16T01:21:10.736590" level="INFO">${status} = FAIL</msg>
<msg time="2026-10-16T01:21:10.736630" 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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:10.735853" elapsed="0.000799"/>
</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-10-16T01:21:10.736962" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:10.736749" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:10.736731" elapsed="0.000320"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:21:10.737677" level="INFO">${ip_address} = 10.30.170.180</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_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-10-16T01:21:10.737468" elapsed="0.000258"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-10-16T01:21:10.737771" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:21:10.737895" level="INFO">${odl_ip} = 10.30.170.180</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-10-16T01:21:10.737230" elapsed="0.000688"/>
</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-10-16T01:21:10.738088" elapsed="0.000326"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:10.738765" level="INFO">index=386
host=10.30.170.180
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-10-16T01:21:10.738857" level="INFO">${karaf_connection_object} = index=386
host=10.30.170.180
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-10-16T01:21:10.738621" elapsed="0.000260"/>
</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-10-16T01:21:10.739039" elapsed="0.000240"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-10-16T01:21:10.739662" level="INFO">Logging into '10.30.170.180:8101' as 'karaf'.</msg>
<msg time="2026-10-16T01:21:10.998135" 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-10-16T01:21:10.739460" elapsed="0.258858"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:11.000340" elapsed="0.000408"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:21:11.000937" elapsed="0.000169"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:11.001249" 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-10-16T01:21:10.999590" elapsed="0.001808"/>
</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-10-16T01:21:10.998845" elapsed="0.002597"/>
</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-10-16T01:21:10.733870" elapsed="0.267620"/>
</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-10-16T01:21:10.729302" elapsed="0.272234"/>
</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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:10.728929" elapsed="0.272746"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:21:10.728789" elapsed="0.272953"/>
</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-10-16T01:21:11.007078" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:11.006980" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:11.006955" elapsed="0.000196"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:11.007474" 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-10-16T01:21:11.007571" 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-10-16T01:21:11.007347" elapsed="0.000248"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:11.008050" level="INFO">{1: 386}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:21:11.007811" elapsed="0.000279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:11.008491" level="INFO">2</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:21:11.008273" elapsed="0.000258"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:21:11.009250" 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-10-16T01:21:11.009059" elapsed="0.000304">Dictionary does not contain key '2'.</status>
</kw>
<msg time="2026-10-16T01:21:11.009460" level="INFO">${status} = FAIL</msg>
<msg time="2026-10-16T01:21:11.009501" 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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:11.008682" elapsed="0.000840"/>
</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-10-16T01:21:11.009856" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:11.009588" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:11.009572" elapsed="0.000376"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:21:11.010575" level="INFO">${ip_address} = 10.30.170.14</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_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-10-16T01:21:11.010367" elapsed="0.000233"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-10-16T01:21:11.010646" elapsed="0.000031"/>
</return>
<msg time="2026-10-16T01:21:11.010833" level="INFO">${odl_ip} = 10.30.170.14</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-10-16T01:21:11.010126" elapsed="0.000730"/>
</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-10-16T01:21:11.011028" elapsed="0.000325"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:11.011716" level="INFO">index=388
host=10.30.170.14
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-10-16T01:21:11.011816" level="INFO">${karaf_connection_object} = index=388
host=10.30.170.14
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-10-16T01:21:11.011562" elapsed="0.000278"/>
</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-10-16T01:21:11.012002" elapsed="0.000246"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-10-16T01:21:11.012628" level="INFO">Logging into '10.30.170.14:8101' as 'karaf'.</msg>
<msg time="2026-10-16T01:21:11.275211" 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-10-16T01:21:11.012427" elapsed="0.262998"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:11.277441" 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-10-16T01:21:11.278087" elapsed="0.000182"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:11.278442" elapsed="0.000117"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:21:11.277001" elapsed="0.001612"/>
</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-10-16T01:21:11.276044" elapsed="0.002616"/>
</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-10-16T01:21:11.006660" elapsed="0.272083"/>
</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-10-16T01:21:11.002381" elapsed="0.276425"/>
</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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:11.002002" elapsed="0.276868"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:21:11.001860" elapsed="0.277057"/>
</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-10-16T01:21:11.284648" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:11.284543" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:11.284516" elapsed="0.000238"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:11.285094" 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-10-16T01:21:11.285196" 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-10-16T01:21:11.284958" elapsed="0.000263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:11.285652" level="INFO">{1: 386, 2: 388}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:21:11.285410" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:11.286141" level="INFO">3</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:21:11.285917" elapsed="0.000265"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:21:11.286937" 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-10-16T01:21:11.286731" elapsed="0.000320">Dictionary does not contain key '3'.</status>
</kw>
<msg time="2026-10-16T01:21:11.287151" level="INFO">${status} = FAIL</msg>
<msg time="2026-10-16T01:21:11.287193" 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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:11.286335" elapsed="0.000881"/>
</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-10-16T01:21:11.287499" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:11.287284" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:11.287267" elapsed="0.000327"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:21:11.288265" level="INFO">${ip_address} = 10.30.170.84</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_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-10-16T01:21:11.288054" elapsed="0.000236"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-10-16T01:21:11.288333" elapsed="0.000033"/>
</return>
<msg time="2026-10-16T01:21:11.288466" level="INFO">${odl_ip} = 10.30.170.84</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-10-16T01:21:11.287808" elapsed="0.000682"/>
</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-10-16T01:21:11.288666" elapsed="0.000368"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:11.289368" level="INFO">index=390
host=10.30.170.84
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-10-16T01:21:11.289460" level="INFO">${karaf_connection_object} = index=390
host=10.30.170.84
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-10-16T01:21:11.289247" elapsed="0.000238"/>
</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-10-16T01:21:11.289649" elapsed="0.000276"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-10-16T01:21:11.290379" level="INFO">Logging into '10.30.170.84:8101' as 'karaf'.</msg>
<msg time="2026-10-16T01:21:11.524087" 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-10-16T01:21:11.290169" elapsed="0.234070"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:11.525813" 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-10-16T01:21:11.526325" elapsed="0.000158"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:11.526625" elapsed="0.000139"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:21:11.525413" elapsed="0.001403"/>
</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-10-16T01:21:11.524677" elapsed="0.002182"/>
</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-10-16T01:21:11.284273" elapsed="0.242632"/>
</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-10-16T01:21:11.279611" elapsed="0.247337"/>
</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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:11.279188" elapsed="0.247806"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:21:11.279041" elapsed="0.247988"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-10-16T01:21:10.728634" elapsed="0.798435"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-10-16T01:21:08.729214" elapsed="2.797917"/>
</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-10-16T01:21:11.528055" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:11.527959" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:11.527934" 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-10-16T01:21:11.530001" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:11.529918" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:11.529902" elapsed="0.000162"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:21:11.530945" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:21:11.530574" elapsed="0.000397"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:21:11.531389" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:21:11.531120" elapsed="0.000293"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:21:11.531454" elapsed="0.000034"/>
</return>
<msg time="2026-10-16T01:21:11.531589" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:21:11.530268" elapsed="0.001343"/>
</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-10-16T01:21:11.533970" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:11.533884" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:11.533867" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:21:11.535085" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:11.534981" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:11.534965" elapsed="0.000303"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:21:11.535816" level="INFO">${karaf_connection_index} = 386</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:21:11.535418" elapsed="0.000436"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:11.536307" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:21:11.536092" elapsed="0.000254"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:21:11.572246" 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-10-16T01:21:11.538065" elapsed="0.034329"/>
</kw>
<msg time="2026-10-16T01:21:11.572543" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:21:11.572612" 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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:11.536566" elapsed="0.036096"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:21:11.630948" 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 "- "m "a "n "g "a "n "e "s "e "/ "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 "[78Cn "[A[78Cd
 "_ "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-10-16T01:21:11.574296" elapsed="0.056825"/>
</kw>
<msg time="2026-10-16T01:21:11.631263" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:21:11.631329" 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 "- "m "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:11.572953" elapsed="0.058425"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:11.631818" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:11.631530" elapsed="0.000428"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:11.631511" elapsed="0.000473"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:11.632650" 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 "- "m "a "n "g "a "n "e "s "e "/ "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 "[78Cn "[A[78Cd
 "_ "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-10-16T01:21:11.632167" elapsed="0.000639"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:11.633165" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:11.632924" elapsed="0.000379"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:11.632906" elapsed="0.000422"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:21:11.633359" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:11.635333" elapsed="0.000277"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:21:11.635868" elapsed="0.000136"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:11.636184" elapsed="0.000091"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:21:11.634668" elapsed="0.001707"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:21:11.633624" elapsed="0.002849"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:21:11.534779" elapsed="0.101770"/>
</kw>
<msg time="2026-10-16T01:21:11.636630" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:21:11.636669" 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 "- "m "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:11.534179" elapsed="0.102606"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:21:11.636942" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:21:11.636857" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:11.636841" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:21:11.637377" 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-10-16T01:21:11.637870" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:21:11.637938" 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-10-16T01:21:11.533621" elapsed="0.104401"/>
</kw>
<msg time="2026-10-16T01:21:11.638106" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:21:11.638145" 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 "- "m "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:11.531980" elapsed="0.106200"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:11.638464" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:11.638248" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:11.638232" elapsed="0.000304"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:21:11.531840" elapsed="0.106718"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:21:11.640850" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:11.640765" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:11.640749" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:21:11.641945" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:11.641841" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:11.641824" elapsed="0.000253"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:21:11.642571" level="INFO">${karaf_connection_index} = 388</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:21:11.642220" elapsed="0.000390"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:11.643089" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:21:11.642878" elapsed="0.000249"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:21:11.680125" 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-10-16T01:21:11.644631" elapsed="0.035642"/>
</kw>
<msg time="2026-10-16T01:21:11.680413" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:21:11.680479" 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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:11.643344" elapsed="0.037185"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:21:11.739740" 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 "- "m "a "n "g "a "n "e "s "e "/ "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 "[78Cn "[A[78Cd
 "_ "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-10-16T01:21:11.682115" elapsed="0.057797"/>
</kw>
<msg time="2026-10-16T01:21:11.740050" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:21:11.740116" 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 "- "m "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:11.680807" elapsed="0.059357"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:11.740559" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:11.740315" elapsed="0.000405"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:11.740296" elapsed="0.000452"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:11.743133" 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 "- "m "a "n "g "a "n "e "s "e "/ "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 "[78Cn "[A[78Cd
 "_ "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-10-16T01:21:11.740930" elapsed="0.002331"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:11.743625" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:11.743380" elapsed="0.000418"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:11.743361" elapsed="0.000492"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:21:11.743889" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:11.745901" elapsed="0.000280"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:21:11.746406" elapsed="0.000136"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:11.746758" elapsed="0.000094"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:21:11.745234" elapsed="0.001721"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:21:11.744157" elapsed="0.002895"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:21:11.641601" elapsed="0.105527"/>
</kw>
<msg time="2026-10-16T01:21:11.747209" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:21:11.747248" 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 "- "m "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:11.641057" elapsed="0.106226"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:21:11.747435" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:21:11.747351" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:11.747335" elapsed="0.000176"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:21:11.747917" 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-10-16T01:21:11.748259" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:21:11.748325" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:21:11.640503" elapsed="0.107906"/>
</kw>
<msg time="2026-10-16T01:21:11.748490" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:21:11.748528" 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 "- "m "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:11.638833" elapsed="0.109730"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:11.748933" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:11.748630" elapsed="0.000353"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:11.748614" elapsed="0.000391"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:21:11.638669" elapsed="0.110358"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:21:11.751280" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:11.751196" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:11.751180" elapsed="0.000162"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:21:11.752370" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:11.752268" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:11.752252" elapsed="0.000251"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:21:11.753047" 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-10-16T01:21:11.752645" elapsed="0.000441"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:11.753529" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:21:11.753320" elapsed="0.000247"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:21:11.788328" 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-10-16T01:21:11.755114" elapsed="0.033381"/>
</kw>
<msg time="2026-10-16T01:21:11.788636" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:21:11.788734" 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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:11.753811" elapsed="0.034977"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:21:11.858441" 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 "- "m "a "n "g "a "n "e "s "e "/ "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 "[78Cn "[A[78Cd
 "_ "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-10-16T01:21:11.790386" elapsed="0.068405"/>
</kw>
<msg time="2026-10-16T01:21:11.859041" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:21:11.859139" 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 "- "m "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:11.789069" elapsed="0.070140"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:11.859917" elapsed="0.000068"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:11.859456" elapsed="0.000654"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:11.859412" elapsed="0.000742"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:11.861174" 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 "- "m "a "n "g "a "n "e "s "e "/ "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 "[78Cn "[A[78Cd
 "_ "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-10-16T01:21:11.860420" elapsed="0.000916"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:11.861813" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:11.861480" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:11.861457" elapsed="0.000546"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:21:11.862048" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:11.864944" elapsed="0.000324"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:21:11.865541" elapsed="0.000266"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:11.866019" 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-10-16T01:21:11.863811" elapsed="0.002451"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:21:11.862459" elapsed="0.003917"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:21:11.752065" elapsed="0.114404"/>
</kw>
<msg time="2026-10-16T01:21:11.866558" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:21:11.866606" 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 "- "m "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:11.751486" elapsed="0.115164"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:21:11.866895" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-10-16T01:21:11.866797" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:11.866773" 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-10-16T01:21:11.867419" 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-10-16T01:21:11.867897" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:21:11.867975" 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-10-16T01:21:11.750948" elapsed="0.117124"/>
</kw>
<msg time="2026-10-16T01:21:11.868175" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:21:11.868226" 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 "- "m "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:11.749267" elapsed="0.119010"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:11.868623" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:11.868364" elapsed="0.000409"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:11.868344" elapsed="0.000460"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:21:11.749133" elapsed="0.119695"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:21:11.531663" elapsed="0.337201"/>
</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-10-16T01:21:11.529662" elapsed="0.339277"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-10-16T01:21:11.527768" elapsed="0.341235"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:11.527286" elapsed="0.341765"/>
</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-10-16T01:21:08.726313" elapsed="3.142793"/>
</kw>
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-10-16T01:21:11.870093" 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-10-16T01:21:11.869737" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="PASS" start="2026-10-16T01:21:11.870296" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-10-16T01:21:11.870204" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:11.870181" elapsed="0.000206"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:11.870623" elapsed="0.000028"/>
</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-10-16T01:21:11.870893" elapsed="0.000026"/>
</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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:11.871111" elapsed="0.000027"/>
</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-10-16T01:21:11.871360" elapsed="0.000027"/>
</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-10-16T01:21:11.871665" elapsed="0.000064"/>
</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-10-16T01:21:11.869369" elapsed="0.002443"/>
</kw>
<status status="PASS" start="2026-10-16T01:21:08.725965" elapsed="3.145905"/>
</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-10-16T01:21:11.873518" elapsed="0.000272"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:21:11.873185" elapsed="0.000659"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:21:11.874817" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:11.874722" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:11.874676" 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-10-16T01:21:11.877015" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:11.876932" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:11.876915" elapsed="0.000164"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:21:11.878000" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:21:11.877632" elapsed="0.000393"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:21:11.878452" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:21:11.878177" elapsed="0.000299"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:21:11.878517" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:21:11.878647" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:21:11.877280" elapsed="0.001390"/>
</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-10-16T01:21:11.881124" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:11.881037" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:11.881020" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:21:11.882296" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:11.882209" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:11.882191" elapsed="0.000203"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:21:11.882813" level="INFO">${karaf_connection_index} = 386</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:21:11.882544" elapsed="0.000294"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:11.883190" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:21:11.883002" elapsed="0.000212"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:21:11.917803" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:21:11.883992" elapsed="0.034000"/>
</kw>
<msg time="2026-10-16T01:21:11.918150" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:21:11.918191" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:11.883368" elapsed="0.034859"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:21:11.981113" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:21:11.918862" elapsed="0.062427"/>
</kw>
<msg time="2026-10-16T01:21:11.981447" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:21:11.981488" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:11.918390" elapsed="0.063134"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:11.981827" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:11.981594" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:11.981575" elapsed="0.000349"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:11.982442" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:21:11.982105" elapsed="0.000415"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:11.982804" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:11.982581" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:11.982565" elapsed="0.000334"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:21:11.982929" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:11.985415" 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-10-16T01:21:11.987168" elapsed="0.000621"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:11.989159" elapsed="0.000309"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:21:11.983728" elapsed="0.005806"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:21:11.983208" elapsed="0.006442"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:21:11.881948" elapsed="0.107803"/>
</kw>
<msg time="2026-10-16T01:21:11.989836" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:21:11.989874" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:11.881334" elapsed="0.108576"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:21:11.990063" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:21:11.989980" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:11.989963" elapsed="0.000177"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:21:11.990455" 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-10-16T01:21:11.990848" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:21:11.990915" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:21:11.880745" elapsed="0.110257"/>
</kw>
<msg time="2026-10-16T01:21:11.991085" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:21:11.991124" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:11.879046" elapsed="0.112114"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:11.991442" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:11.991226" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:11.991211" elapsed="0.000303"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:21:11.878907" elapsed="0.112628"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:21:11.993984" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:11.993899" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:11.993881" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:21:11.995142" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:11.995058" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:11.995042" elapsed="0.000164"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:21:11.995570" level="INFO">${karaf_connection_index} = 388</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:21:11.995347" elapsed="0.000248"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:11.995976" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:21:11.995798" elapsed="0.000202"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:21:12.030476" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:21:11.996557" elapsed="0.034103"/>
</kw>
<msg time="2026-10-16T01:21:12.030876" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:21:12.030917" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:11.996152" elapsed="0.034801"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:21:12.094733" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:21:12.031552" elapsed="0.063361"/>
</kw>
<msg time="2026-10-16T01:21:12.095070" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:21:12.095111" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:12.031123" elapsed="0.064024"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:12.095422" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:12.095219" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:12.095200" elapsed="0.000315"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:12.096080" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:21:12.095738" elapsed="0.000425"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:12.096420" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:12.096224" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:12.096207" elapsed="0.000306"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:21:12.096544" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:12.099104" 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-10-16T01:21:12.100865" elapsed="0.000455"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:12.102495" elapsed="0.000502"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:21:12.097345" elapsed="0.005719"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:21:12.096851" elapsed="0.006330"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:21:11.994802" elapsed="0.108457"/>
</kw>
<msg time="2026-10-16T01:21:12.103342" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:21:12.103381" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:11.994192" elapsed="0.109225"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:21:12.103570" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:21:12.103486" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:12.103469" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:21:12.104253" 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-10-16T01:21:12.104557" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:21:12.104622" 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-10-16T01:21:11.993580" elapsed="0.111160"/>
</kw>
<msg time="2026-10-16T01:21:12.104827" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:21:12.104866" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:11.991888" elapsed="0.113014"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:12.105185" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:12.104970" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:12.104954" elapsed="0.000303"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:21:11.991643" elapsed="0.113636"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:21:12.107682" elapsed="0.000040"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:12.107592" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:12.107575" 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-10-16T01:21:12.108870" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:12.108783" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:12.108766" elapsed="0.000167"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:21:12.109296" 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-10-16T01:21:12.109073" elapsed="0.000248"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:12.109653" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:21:12.109479" elapsed="0.000198"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:21:12.145968" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:21:12.110274" elapsed="0.035870"/>
</kw>
<msg time="2026-10-16T01:21:12.146319" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:21:12.146361" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:12.109865" elapsed="0.036531"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:21:12.214748" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:21:12.147016" elapsed="0.067951"/>
</kw>
<msg time="2026-10-16T01:21:12.215128" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:21:12.215171" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:12.146558" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:12.215478" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:12.215277" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:12.215259" elapsed="0.000314"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:12.216135" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:21:12.215799" elapsed="0.000415"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:12.216471" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:12.216275" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:12.216258" elapsed="0.000306"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:21:12.216595" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:12.219085" elapsed="0.000471"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:21:12.220818" elapsed="0.000456"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:12.222440" elapsed="0.000690"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:21:12.217376" elapsed="0.005822"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:21:12.216889" elapsed="0.006423"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:21:12.108489" elapsed="0.114899"/>
</kw>
<msg time="2026-10-16T01:21:12.223468" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:21:12.223506" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:12.107920" elapsed="0.115621"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:21:12.223722" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-10-16T01:21:12.223610" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:12.223593" 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-10-16T01:21:12.224113" 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-10-16T01:21:12.224409" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:21:12.224473" 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-10-16T01:21:12.107302" elapsed="0.117256"/>
</kw>
<msg time="2026-10-16T01:21:12.224639" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:21:12.224679" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:12.105526" elapsed="0.119279"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:12.225098" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:12.224878" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:12.224862" elapsed="0.000307"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:21:12.105390" elapsed="0.119801"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:21:11.878754" elapsed="0.346464"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:21:11.876608" elapsed="0.348663"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:21:11.874425" elapsed="0.350933"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:11.874027" elapsed="0.351376"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:21:11.872735" elapsed="0.352718"/>
</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-10-16T01:21:12.233445" elapsed="0.000187"/>
</kw>
<msg time="2026-10-16T01:21:12.233676" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:12.232923" elapsed="0.000827"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:21:12.232510" elapsed="0.001311"/>
</kw>
<msg time="2026-10-16T01:21:12.233862" 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-10-16T01:21:12.229655" elapsed="0.004246"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:21:12.229296" elapsed="0.004671"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:12.234405" 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-10-16T01:21:12.234176" elapsed="0.000269"/>
</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-10-16T01:21:12.237286" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:21:12.236960" elapsed="0.000352"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:21:12.237767" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:21:12.237458" elapsed="0.000335"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:21:12.237833" elapsed="0.000190"/>
</return>
<msg time="2026-10-16T01:21:12.238130" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:21:12.236585" elapsed="0.001569"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:21:12.238304" elapsed="0.000129"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:21:12.238929" 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-10-16T01:21:12.238597" elapsed="0.000356"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:21:12.239327" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:21:12.239099" elapsed="0.000252"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:21:12.239740" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:21:12.239488" 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-10-16T01:21:12.241842" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:21:12.241550" elapsed="0.000316"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:21:12.241907" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:21:12.242027" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:21:12.241238" elapsed="0.000812"/>
</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-10-16T01:21:12.260016" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:21:12.259667" elapsed="0.000375"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:21:12.260776" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:21:12.260518" elapsed="0.000380">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:21:12.260986" 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-10-16T01:21:12.260199" elapsed="0.000810"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:21:12.261489" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:21:12.261178" elapsed="0.000336"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:21:12.261822" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:21:12.262143" 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-10-16T01:21:12.261679" elapsed="0.000489"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:12.262587" 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-10-16T01:21:12.262363" elapsed="0.000270"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:12.263542" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:21:12.263312" elapsed="0.000270"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:21:12.264116" 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-10-16T01:21:12.263845" 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-10-16T01:21:12.264420" elapsed="0.000020"/>
</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-10-16T01:21:12.264602" elapsed="0.000022"/>
</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-10-16T01:21:12.264807" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:21:12.264293" elapsed="0.000568"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:21:12.264184" elapsed="0.000703"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:21:12.264926" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:21:12.265055" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:21:12.262977" elapsed="0.002100"/>
</kw>
<status status="PASS" start="2026-10-16T01:21:12.262723" 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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:12.265270" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:12.265129" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:12.262677" elapsed="0.002663"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:21:12.265915" 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-10-16T01:21:12.265495" elapsed="0.000446"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:21:12.265984" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:21:12.259158" elapsed="0.006925"/>
</kw>
<msg time="2026-10-16T01:21:12.266132" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:12.254768" elapsed="0.011456"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:12.270502" elapsed="0.000066"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:12.274748" elapsed="0.000077"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:12.279176" elapsed="0.000067"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:12.279569" 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-10-16T01:21:12.280008" elapsed="0.000052"/>
</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-10-16T01:21:12.280492" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:12.280348" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:21:12.280334" 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-10-16T01:21:12.280748" 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-10-16T01:21:12.280926" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:12.281084" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:21:12.280306" elapsed="0.000826"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:21:12.280182" elapsed="0.000985"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:12.281476" elapsed="0.000051"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:21:12.281622" elapsed="0.000028"/>
</return>
<msg time="2026-10-16T01:21:12.281856" 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-10-16T01:21:12.252519" elapsed="0.029385"/>
</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-10-16T01:21:12.284220" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:21:12.284012" elapsed="0.000269">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:21:12.284464" 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-10-16T01:21:12.283565" elapsed="0.000942"/>
</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-10-16T01:21:12.285101" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:12.284637" elapsed="0.000538"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:21:12.285741" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:21:12.285448" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-10-16T01:21:12.285231" elapsed="0.000593"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:12.284598" elapsed="0.001279"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:21:12.286759" 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-10-16T01:21:12.286192" elapsed="0.000614"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:21:12.286896" elapsed="0.000059"/>
</return>
<msg time="2026-10-16T01:21:12.287147" 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-manganese/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-10-16T01:21:12.282669" elapsed="0.004525"/>
</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-10-16T01:21:12.289505" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:21:12.289214" elapsed="0.000350">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:21:12.289875" 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-10-16T01:21:12.288812" elapsed="0.001108"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:21:12.290245" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-16T01:21:12.290053" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:12.290014" elapsed="0.000383"/>
</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-10-16T01:21:12.290830" 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-10-16T01:21:12.291215" elapsed="0.000051"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:21:12.291352" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:21:12.291585" 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-manganese/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-10-16T01:21:12.287939" elapsed="0.003693"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:12.295179" 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-10-16T01:21:12.294875" elapsed="0.000395"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:12.295955" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:21:12.295626" 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-10-16T01:21:12.303178" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:21:12.303233" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:21:12.303332" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:21:12.296489" elapsed="0.007297">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:21:12.296170" elapsed="0.007774">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:21:12.304220" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:12.304010" elapsed="0.000291"/>
</branch>
<status status="FAIL" start="2026-10-16T01:21:12.296131" elapsed="0.008226">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:21:12.305033" elapsed="0.000066"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:21:12.305324" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:12.305233" elapsed="0.000151"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:21:12.305193" elapsed="0.000243"/>
</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-10-16T01:21:12.305760" elapsed="0.000053"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:21:12.305902" elapsed="0.000027"/>
</return>
<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="FAIL" start="2026-10-16T01:21:12.292370" elapsed="0.013663">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:21:12.306262" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:21:12.244129" elapsed="0.062293">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:21:12.306732" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:12.306539" elapsed="0.000591"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:21:12.306523" elapsed="0.000633"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:21:12.307187" elapsed="0.000014"/>
</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="FAIL" start="2026-10-16T01:21:12.243498" elapsed="0.063781">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:21:12.242109" elapsed="0.065232">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:21:12.242093" elapsed="0.065277">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:12.307633" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:21:12.307898" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:12.308065" elapsed="0.000019"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:21:12.308264" elapsed="0.000021"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:21:12.308465" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:21:12.308629" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:21:12.308906" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:21:12.308967" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:21:12.240748" elapsed="0.068313">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:21:12.309122" elapsed="0.000014"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:21:12.240126" elapsed="0.069083">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:12.309425" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:12.309287" elapsed="0.000187"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:12.309631" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:12.309496" elapsed="0.000183"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:12.309866" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:12.309724" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:21:12.309271" elapsed="0.000663"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:21:12.239976" elapsed="0.069996">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:21:12.239809" elapsed="0.070215">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:21:12.310071" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:21:12.236006" elapsed="0.074154">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:12.310370" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:12.310589" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:12.310450" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:21:12.310434" elapsed="0.000224"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:12.310811" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:12.310981" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:21:12.311039" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:21:12.235303" elapsed="0.075827">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:21:12.235107" elapsed="0.076085">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:21:12.234999" elapsed="0.076241">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:21:12.234645" elapsed="0.076674">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:12.311525" elapsed="0.000021"/>
</kw>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:21:12.225656" elapsed="0.085972">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:21:11.871954" elapsed="0.439845">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:21:12.313207" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:21:12.312964" elapsed="0.000498"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:21:12.314361" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:12.314276" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:12.314259" elapsed="0.000165"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:21:12.316465" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:12.316383" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:12.316367" elapsed="0.000161"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:21:12.317428" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:21:12.317104" elapsed="0.000349"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:21:12.317900" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:21:12.317600" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:21:12.317964" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:21:12.318091" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:21:12.316751" elapsed="0.001362"/>
</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-10-16T01:21:12.320589" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:12.320505" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:12.320488" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:21:12.321774" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:12.321658" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:12.321641" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:21:12.322238" level="INFO">${karaf_connection_index} = 386</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:21:12.322010" elapsed="0.000252"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:12.322600" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:21:12.322422" elapsed="0.000202"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:21:12.357262" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:21:12.323219" elapsed="0.034220"/>
</kw>
<msg time="2026-10-16T01:21:12.357599" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:21:12.357641" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:12.322803" elapsed="0.034875"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:21:12.427485" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:21:12.358299" elapsed="0.069460"/>
</kw>
<msg time="2026-10-16T01:21:12.427963" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:21:12.428004" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:12.357878" elapsed="0.070163"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:12.428407" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:12.428142" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:12.428111" elapsed="0.000401"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:12.429135" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:21:12.428724" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:12.429471" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:12.429276" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:12.429259" elapsed="0.000306"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:21:12.429599" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:12.432248" elapsed="0.000706"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:21:12.434214" elapsed="0.000670"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:12.436078" 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-10-16T01:21:12.430499" elapsed="0.005962"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:21:12.429966" elapsed="0.006614"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:21:12.321401" elapsed="0.115256"/>
</kw>
<msg time="2026-10-16T01:21:12.436831" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:21:12.436872" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:12.320825" elapsed="0.116083"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:21:12.437062" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:21:12.436978" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:12.436961" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:21:12.437474" 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-10-16T01:21:12.437827" elapsed="0.000075"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:21:12.437946" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:21:12.320217" elapsed="0.117815"/>
</kw>
<msg time="2026-10-16T01:21:12.438117" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:21:12.438156" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:12.318433" elapsed="0.119759"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:12.438475" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:12.438258" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:12.438242" elapsed="0.000305"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:21:12.318295" elapsed="0.120273"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:21:12.441100" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:12.441015" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:12.440997" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:21:12.442264" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:12.442180" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:12.442163" elapsed="0.000164"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:21:12.442729" level="INFO">${karaf_connection_index} = 388</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:21:12.442467" elapsed="0.000290"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:12.443099" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:21:12.442917" elapsed="0.000207"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:21:12.479080" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:21:12.443685" elapsed="0.035737"/>
</kw>
<msg time="2026-10-16T01:21:12.479754" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:21:12.479818" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:12.443275" elapsed="0.036594"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:21:12.552238" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:21:12.480984" elapsed="0.071577"/>
</kw>
<msg time="2026-10-16T01:21:12.552839" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:21:12.552887" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:12.480201" elapsed="0.072722"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:12.553366" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:12.553038" elapsed="0.000407"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:12.553003" elapsed="0.000471"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:12.554134" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:21:12.553657" elapsed="0.000560"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:12.554475" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:12.554278" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:12.554261" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:21:12.554603" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:12.557307" 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-10-16T01:21:12.559167" elapsed="0.000496"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:12.561043" elapsed="0.002364"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:21:12.555528" elapsed="0.007950"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:21:12.554979" elapsed="0.008618"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:21:12.441923" elapsed="0.121754"/>
</kw>
<msg time="2026-10-16T01:21:12.563879" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:21:12.563920" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:12.441308" elapsed="0.122648"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:21:12.564111" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-10-16T01:21:12.564025" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:12.564008" elapsed="0.000185"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:21:12.564527" 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-10-16T01:21:12.564862" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:21:12.564928" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:21:12.440694" elapsed="0.124318"/>
</kw>
<msg time="2026-10-16T01:21:12.565094" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:21:12.565134" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:12.438956" elapsed="0.126213"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:12.565449" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:12.565234" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:12.565219" elapsed="0.000301"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:21:12.438685" elapsed="0.126856"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:21:12.568080" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:12.567996" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:12.567979" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:21:12.569238" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:12.569155" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:12.569139" elapsed="0.000161"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:21:12.569681" 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-10-16T01:21:12.569443" elapsed="0.000304"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:12.570096" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:21:12.569911" elapsed="0.000210"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:21:12.602016" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:21:12.570684" elapsed="0.031630"/>
</kw>
<msg time="2026-10-16T01:21:12.602546" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:21:12.602590" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:12.570273" elapsed="0.032354"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:21:12.660190" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:21:12.603479" elapsed="0.057034"/>
</kw>
<msg time="2026-10-16T01:21:12.660749" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:21:12.660794" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:12.602920" elapsed="0.057912"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:12.661233" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:12.660943" elapsed="0.000366"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:12.660908" elapsed="0.000433"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:12.661980" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:21:12.661528" elapsed="0.000533"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:12.662324" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:12.662122" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:12.662105" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:21:12.662453" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:12.665166" elapsed="0.000488"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:21:12.666952" elapsed="0.000504"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:12.668935" elapsed="0.000542"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:21:12.663383" elapsed="0.006169"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:21:12.662836" elapsed="0.006957"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:21:12.568899" elapsed="0.100986"/>
</kw>
<msg time="2026-10-16T01:21:12.669971" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:21:12.670013" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:12.568288" elapsed="0.101762"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:21:12.670231" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:21:12.670134" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:12.670113" elapsed="0.000201"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:21:12.670653" 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-10-16T01:21:12.670998" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:21:12.671063" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:21:12.567642" elapsed="0.103506"/>
</kw>
<msg time="2026-10-16T01:21:12.671233" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:21:12.671272" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:12.565850" elapsed="0.105457"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:12.671591" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:12.671373" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:12.671358" elapsed="0.000304"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:21:12.565662" elapsed="0.106021"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:21:12.318160" elapsed="0.353675"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:21:12.316089" elapsed="0.355806"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:21:12.314024" elapsed="0.358018"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:12.313607" elapsed="0.358483"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:21:12.312602" elapsed="0.359539"/>
</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-10-16T01:21:12.674876" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:21:12.674503" elapsed="0.000399"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:21:12.675328" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:21:12.675054" elapsed="0.000300"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:21:12.675395" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:21:12.675522" 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-10-16T01:21:12.674110" elapsed="0.001436"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:12.677891" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:12.677621" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:12.677603" elapsed="0.000367"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:12.678307" 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-10-16T01:21:12.678400" 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-10-16T01:21:12.678168" elapsed="0.000257"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:12.678950" level="INFO">Attempting to execute command "sudo mn -c" on remote system "10.30.171.104" 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-10-16T01:21:12.678615" elapsed="0.000379"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:12.679523" level="INFO">${conn_id} = 401</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-10-16T01:21:12.679170" elapsed="0.000386"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:21:12.680433" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:21:12.680505" 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-10-16T01:21:12.680157" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:12.680681" elapsed="0.000336"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:21:12.682031" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:21:13.045752" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:20:26 UTC 2026

  System load:  0.02               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:21:03 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:21:12.681786" elapsed="0.364149"/>
</kw>
<msg time="2026-10-16T01:21:13.046025" 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-10-16T01:21:12.681186" elapsed="0.364928"/>
</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-10-16T01:21:12.679791" elapsed="0.366443"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:21:13.046823" level="INFO">Executing command 'sudo mn -c'.</msg>
<msg time="2026-10-16T01:21:14.225493" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:21:14.225940" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:21:14.226157" 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-10-16T01:21:13.046542" elapsed="1.179676"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:14.226766" elapsed="0.000572"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:14.228576" 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-10-16T01:21:14.227936" elapsed="0.000761"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:21:14.229183" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:14.228926" elapsed="0.000367"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:14.228875" elapsed="0.000470"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:21:14.229654" elapsed="0.000117"/>
</return>
<status status="PASS" start="2026-10-16T01:21:14.229463" elapsed="0.000385"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:14.229430" elapsed="0.000472"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:21:14.229978" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:14.231695" elapsed="0.000784"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:21:14.233009" elapsed="0.000340"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:14.233686" elapsed="0.000270"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:21:14.230673" elapsed="0.003399"/>
</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-10-16T01:21:12.677051" elapsed="1.557188"/>
</kw>
<msg time="2026-10-16T01:21:14.234352" 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-10-16T01:21:12.676496" elapsed="1.557968"/>
</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-10-16T01:21:12.676085" elapsed="1.558546"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:14.239172" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:14.238496" elapsed="0.000805"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:14.238450" elapsed="0.000907"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:14.240166" 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-10-16T01:21:14.240384" 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-10-16T01:21:14.239868" elapsed="0.000573"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:14.241632" 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.104" 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-10-16T01:21:14.240941" elapsed="0.000845"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:14.242970" level="INFO">${conn_id} = 403</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-10-16T01:21:14.242223" elapsed="0.001003"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:21:14.245525" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:21:14.245682" 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-10-16T01:21:14.244528" elapsed="0.001257"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:14.246276" elapsed="0.000729"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:21:14.248972" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:21:14.613852" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:20:26 UTC 2026

  System load:  0.02               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:21:12 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:21:14.248353" elapsed="0.365668"/>
</kw>
<msg time="2026-10-16T01:21:14.614104" 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-10-16T01:21:14.247404" elapsed="0.366783"/>
</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-10-16T01:21:14.243665" elapsed="0.370633"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:21:14.614847" 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-10-16T01:21:14.657871" level="INFO">Command exited with return code -1.</msg>
<msg time="2026-10-16T01:21:14.658118" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:21:14.658210" 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-10-16T01:21:14.614590" elapsed="0.043667"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:14.658605" elapsed="0.000535"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:14.660320" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:21:14.659682" 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-10-16T01:21:14.660882" elapsed="0.000041"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:14.660568" elapsed="0.000433"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:14.660520" elapsed="0.000533"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:21:14.661341" elapsed="0.000054"/>
</return>
<status status="PASS" start="2026-10-16T01:21:14.661160" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:14.661130" elapsed="0.000383"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:21:14.661583" elapsed="0.000028"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:14.663258" elapsed="0.000694"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:21:14.664359" elapsed="0.000318"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:14.665047" elapsed="0.000200"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:21:14.662286" elapsed="0.003066"/>
</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-10-16T01:21:14.237376" elapsed="0.428129"/>
</kw>
<msg time="2026-10-16T01:21:14.665610" 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-10-16T01:21:14.236109" elapsed="0.429646"/>
</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-10-16T01:21:14.235051" elapsed="0.430868"/>
</kw>
<arg>${tools_system}</arg>
<status status="PASS" start="2026-10-16T01:21:12.675764" elapsed="1.990267"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:21:14.666930" level="INFO">${ovs_opt} = </msg>
<var>${ovs_opt}</var>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:21:14.666358" elapsed="0.000625"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-10-16T01:21:14.668614" level="INFO">${ovs_opt} =   tcp:10.30.170.180:6640</msg>
<var>${ovs_opt}</var>
<arg>${ovs_opt}</arg>
<arg>${SPACE}tcp:${ODL_SYSTEM_${index}_IP}:${ovs_mgr_port}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-10-16T01:21:14.667674" elapsed="0.000995"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:14.669663" level="INFO">  tcp:10.30.170.180:6640</msg>
<arg>${ovs_opt}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:21:14.669178" elapsed="0.000636"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:21:14.667359" elapsed="0.002646"/>
</iter>
<iter>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-10-16T01:21:14.671273" level="INFO">${ovs_opt} =   tcp:10.30.170.180:6640  tcp:10.30.170.14:6640</msg>
<var>${ovs_opt}</var>
<arg>${ovs_opt}</arg>
<arg>${SPACE}tcp:${ODL_SYSTEM_${index}_IP}:${ovs_mgr_port}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-10-16T01:21:14.670497" elapsed="0.000831"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:14.672284" level="INFO">  tcp:10.30.170.180:6640  tcp:10.30.170.14:6640</msg>
<arg>${ovs_opt}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:21:14.671797" elapsed="0.000576"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:21:14.670191" elapsed="0.002249"/>
</iter>
<iter>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-10-16T01:21:14.673686" level="INFO">${ovs_opt} =   tcp:10.30.170.180:6640  tcp:10.30.170.14:6640  tcp:10.30.170.84:6640</msg>
<var>${ovs_opt}</var>
<arg>${ovs_opt}</arg>
<arg>${SPACE}tcp:${ODL_SYSTEM_${index}_IP}:${ovs_mgr_port}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-10-16T01:21:14.672971" elapsed="0.000824"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:14.674747" level="INFO">  tcp:10.30.170.180:6640  tcp:10.30.170.14:6640  tcp:10.30.170.84:6640</msg>
<arg>${ovs_opt}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:21:14.674223" elapsed="0.000621"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:21:14.672618" elapsed="0.002294"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:21:14.667092" elapsed="0.007880"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:14.679650" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:14.679124" elapsed="0.000697"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:14.679086" elapsed="0.000786"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:14.680573" 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-10-16T01:21:14.680825" 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-10-16T01:21:14.680303" elapsed="0.000582"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:14.681999" level="INFO">Attempting to execute command "sudo ovs-vsctl set-manager   tcp:10.30.170.180:6640  tcp:10.30.170.14:6640  tcp:10.30.170.84:6640" on remote system "10.30.171.104" 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-10-16T01:21:14.681302" elapsed="0.000793"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:14.683319" 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-10-16T01:21:14.682487" elapsed="0.000887"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:21:14.685086" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:21:14.685181" 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-10-16T01:21:14.684651" elapsed="0.000560"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:14.685417" elapsed="0.000445"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:21:14.686958" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:21:15.107791" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:20:26 UTC 2026

  System load:  0.02               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:21:14 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:21:14.686602" elapsed="0.421356"/>
</kw>
<msg time="2026-10-16T01:21:15.108045" 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-10-16T01:21:14.686089" elapsed="0.422041"/>
</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-10-16T01:21:14.683857" elapsed="0.424386"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:21:15.108797" level="INFO">Executing command 'sudo ovs-vsctl set-manager   tcp:10.30.170.180:6640  tcp:10.30.170.14:6640  tcp:10.30.170.84:6640'.</msg>
<msg time="2026-10-16T01:21:15.152315" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:21:15.152627" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:21:15.152783" 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-10-16T01:21:15.108535" elapsed="0.044314"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:15.153508" elapsed="0.000576"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:15.155490" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:21:15.154776" 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-10-16T01:21:15.156101" elapsed="0.000048"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:15.155831" elapsed="0.000401"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:15.155776" 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-10-16T01:21:15.156659" elapsed="0.000106"/>
</return>
<status status="PASS" start="2026-10-16T01:21:15.156445" elapsed="0.000405"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:15.156405" elapsed="0.000514"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:21:15.157018" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:15.159049" elapsed="0.000813"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:21:15.160352" elapsed="0.000397"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:15.161158" elapsed="0.000234"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:21:15.157870" elapsed="0.003657"/>
</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-10-16T01:21:14.678123" elapsed="0.483633"/>
</kw>
<msg time="2026-10-16T01:21:15.161903" 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-10-16T01:21:14.676385" elapsed="0.485638"/>
</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-10-16T01:21:14.675360" elapsed="0.486877"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:15.176797" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:15.176529" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:15.176511" elapsed="0.000364"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:15.177190" 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-10-16T01:21:15.177282" 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-10-16T01:21:15.177066" elapsed="0.000241"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:15.177815" level="INFO">Attempting to execute command "sudo ovs-vsctl show" on remote system "10.30.171.104" 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-10-16T01:21:15.177492" elapsed="0.000365"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:15.178325" 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-10-16T01:21:15.178032" elapsed="0.000317"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:21:15.179175" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:21:15.179243" 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-10-16T01:21:15.178921" elapsed="0.000344"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:15.179410" elapsed="0.000284"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:21:15.180837" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:21:15.581636" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:20:26 UTC 2026

  System load:  0.02               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:21:15 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:21:15.180243" elapsed="0.401651"/>
</kw>
<msg time="2026-10-16T01:21:15.581974" 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-10-16T01:21:15.179882" elapsed="0.402169"/>
</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-10-16T01:21:15.178538" elapsed="0.403620"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:21:15.582685" level="INFO">Executing command 'sudo ovs-vsctl show'.</msg>
<msg time="2026-10-16T01:21:15.605739" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:21:15.605897" level="INFO">${stdout} = 0e76e2bd-8e57-4bde-8dbb-e8a185cf6522
    Manager "tcp:10.30.170.180:6640"
    Manager "tcp:10.30.170.14:6640"
    Manager "tcp:10.30.170.84:6640"
    ovs_version: "2.17.11"</msg>
<msg time="2026-10-16T01:21:15.605953" 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-10-16T01:21:15.582442" elapsed="0.023541"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:15.606200" elapsed="0.000257"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:15.607221" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:21:15.606825" elapsed="0.000451"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:21:15.607557" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:15.607384" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:15.607349" elapsed="0.000307"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:21:15.607873" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-10-16T01:21:15.607757" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:15.607735" elapsed="0.000245"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:21:15.608022" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:15.609051" 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-10-16T01:21:15.609752" elapsed="0.000207"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:15.610155" 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-10-16T01:21:15.608441" elapsed="0.001903"/>
</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-10-16T01:21:15.176109" elapsed="0.434330"/>
</kw>
<msg time="2026-10-16T01:21:15.610507" 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-10-16T01:21:15.174977" elapsed="0.435594"/>
</kw>
<msg time="2026-10-16T01:21:15.610748" level="INFO">${output} = 0e76e2bd-8e57-4bde-8dbb-e8a185cf6522
    Manager "tcp:10.30.170.180:6640"
    Manager "tcp:10.30.170.14:6640"
    Manager "tcp:10.30.170.84: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-10-16T01:21:15.173976" elapsed="0.436809"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:15.611364" level="INFO">0e76e2bd-8e57-4bde-8dbb-e8a185cf6522
    Manager "tcp:10.30.170.180:6640"
    Manager "tcp:10.30.170.14:6640"
    Manager "tcp:10.30.170.84: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-10-16T01:21:15.611053" elapsed="0.000369"/>
</kw>
<if>
<branch type="IF" condition="&quot;${should_match}&quot; == &quot;True&quot;">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-10-16T01:21:15.612295" level="FAIL">'0e76e2bd-8e57-4bde-8dbb-e8a185cf6522
    Manager "tcp:10.30.170.180:6640"
    Manager "tcp:10.30.170.14:6640"
    Manager "tcp:10.30.170.84:6640"
    ovs_version: "2.17.11"' does not contain 'is_connected'</msg>
<arg>${output}</arg>
<arg>${expected_output}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="FAIL" start="2026-10-16T01:21:15.611825" elapsed="0.000565">'0e76e2bd-8e57-4bde-8dbb-e8a185cf6522
    Manager "tcp:10.30.170.180:6640"
    Manager "tcp:10.30.170.14:6640"
    Manager "tcp:10.30.170.84:6640"
    ovs_version: "2.17.11"' does not contain 'is_connected'</status>
</kw>
<status status="FAIL" start="2026-10-16T01:21:15.611504" elapsed="0.000978">'0e76e2bd-8e57-4bde-8dbb-e8a185cf6522
    Manager "tcp:10.30.170.180:6640"
    Manager "tcp:10.30.170.14:6640"
    Manager "tcp:10.30.170.84:6640"
    ovs_version: "2.17.11"' does not contain 'is_connected'</status>
</branch>
<status status="FAIL" start="2026-10-16T01:21:15.611482" elapsed="0.001044">'0e76e2bd-8e57-4bde-8dbb-e8a185cf6522
    Manager "tcp:10.30.170.180:6640"
    Manager "tcp:10.30.170.14:6640"
    Manager "tcp:10.30.170.84: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 the `container` contains the `item`.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:15.612867" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:15.612614" elapsed="0.000326"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:21:15.612591" elapsed="0.000381"/>
</if>
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-10-16T01:21:15.613014" elapsed="0.000019"/>
</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-10-16T01:21:15.173039" elapsed="0.440157">'0e76e2bd-8e57-4bde-8dbb-e8a185cf6522
    Manager "tcp:10.30.170.180:6640"
    Manager "tcp:10.30.170.14:6640"
    Manager "tcp:10.30.170.84:6640"
    ovs_version: "2.17.11"' does not contain 'is_connected'</status>
</kw>
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-10-16T01:21:15.613276" elapsed="0.000020"/>
</return>
<arg>${tools_system}</arg>
<doc>Uses "vsctl show" to check for string "is_connected"</doc>
<status status="FAIL" start="2026-10-16T01:21:15.164085" elapsed="0.449316">'0e76e2bd-8e57-4bde-8dbb-e8a185cf6522
    Manager "tcp:10.30.170.180:6640"
    Manager "tcp:10.30.170.14:6640"
    Manager "tcp:10.30.170.84: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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:16.625817" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:16.625185" elapsed="0.000779"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:16.625135" elapsed="0.000887"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:16.626861" 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-10-16T01:21:16.627111" 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-10-16T01:21:16.626477" elapsed="0.000692"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:16.628450" level="INFO">Attempting to execute command "sudo ovs-vsctl show" on remote system "10.30.171.104" 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-10-16T01:21:16.627626" elapsed="0.000959"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:16.629950" 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-10-16T01:21:16.629203" elapsed="0.000803"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:21:16.632345" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:21:16.632500" 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-10-16T01:21:16.631777" elapsed="0.000772"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:16.632932" elapsed="0.000652"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:21:16.635935" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:21:17.052802" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:20:26 UTC 2026

  System load:  0.02               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:21:15 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:21:16.634881" elapsed="0.418162"/>
</kw>
<msg time="2026-10-16T01:21:17.053133" 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-10-16T01:21:16.634014" elapsed="0.419212"/>
</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-10-16T01:21:16.630435" elapsed="0.422909"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:21:17.053956" level="INFO">Executing command 'sudo ovs-vsctl show'.</msg>
<msg time="2026-10-16T01:21:17.087500" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:21:17.087753" level="INFO">${stdout} = 0e76e2bd-8e57-4bde-8dbb-e8a185cf6522
    Manager "tcp:10.30.170.180:6640"
        is_connected: true
    Manager "tcp:10.30.170.14:6640"
        is_connected: true
    Manager "tcp:10.30.170.84:6640"
...</msg>
<msg time="2026-10-16T01:21:17.087821" 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-10-16T01:21:17.053667" elapsed="0.034186"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:17.088165" elapsed="0.000374"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:17.089421" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:21:17.088963" elapsed="0.000517"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:21:17.089827" elapsed="0.000123"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:17.089599" elapsed="0.000412"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:17.089563" 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-10-16T01:21:17.090274" elapsed="0.000044"/>
</return>
<status status="PASS" start="2026-10-16T01:21:17.090128" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:17.090104" elapsed="0.000297"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:21:17.090449" elapsed="0.000027"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:17.091633" 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-10-16T01:21:17.092451" elapsed="0.000243"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:17.092956" 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-10-16T01:21:17.090980" elapsed="0.002183"/>
</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-10-16T01:21:16.624173" elapsed="0.469096"/>
</kw>
<msg time="2026-10-16T01:21:17.093346" 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-10-16T01:21:16.622892" elapsed="0.470536"/>
</kw>
<msg time="2026-10-16T01:21:17.093604" level="INFO">${output} = 0e76e2bd-8e57-4bde-8dbb-e8a185cf6522
    Manager "tcp:10.30.170.180:6640"
        is_connected: true
    Manager "tcp:10.30.170.14:6640"
        is_connected: true
    Manager "tcp:10.30.170.84: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-10-16T01:21:16.621868" elapsed="0.471774"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:17.094349" level="INFO">0e76e2bd-8e57-4bde-8dbb-e8a185cf6522
    Manager "tcp:10.30.170.180:6640"
        is_connected: true
    Manager "tcp:10.30.170.14:6640"
        is_connected: true
    Manager "tcp:10.30.170.84: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-10-16T01:21:17.093975" elapsed="0.000437"/>
</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 the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-16T01:21:17.094868" elapsed="0.000463"/>
</kw>
<status status="PASS" start="2026-10-16T01:21:17.094502" elapsed="0.000882"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:17.094477" elapsed="0.000942"/>
</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 the `container` contains the `item`.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:17.095896" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:17.095505" elapsed="0.000473"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:17.095475" elapsed="0.000537"/>
</if>
<return>
<value>${output}</value>
<status status="PASS" start="2026-10-16T01:21:17.096058" elapsed="0.000037"/>
</return>
<msg time="2026-10-16T01:21:17.096281" level="INFO">${output} = 0e76e2bd-8e57-4bde-8dbb-e8a185cf6522
    Manager "tcp:10.30.170.180:6640"
        is_connected: true
    Manager "tcp:10.30.170.14:6640"
        is_connected: true
    Manager "tcp:10.30.170.84: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-10-16T01:21:16.620906" elapsed="0.475414"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-10-16T01:21:17.096393" elapsed="0.000037"/>
</return>
<arg>${tools_system}</arg>
<doc>Uses "vsctl show" to check for string "is_connected"</doc>
<status status="PASS" start="2026-10-16T01:21:16.614249" elapsed="0.482291"/>
</kw>
<msg time="2026-10-16T01:21:17.096651" level="INFO">${output} = 0e76e2bd-8e57-4bde-8dbb-e8a185cf6522
    Manager "tcp:10.30.170.180:6640"
        is_connected: true
    Manager "tcp:10.30.170.14:6640"
        is_connected: true
    Manager "tcp:10.30.170.84: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-10-16T01:21:15.162759" elapsed="1.933927"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:17.097388" level="INFO">0e76e2bd-8e57-4bde-8dbb-e8a185cf6522
    Manager "tcp:10.30.170.180:6640"
        is_connected: true
    Manager "tcp:10.30.170.14:6640"
        is_connected: true
    Manager "tcp:10.30.170.84: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-10-16T01:21:17.097047" elapsed="0.000404"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-10-16T01:21:17.097995" 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-10-16T01:21:17.097727" elapsed="0.000303"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:21:17.099318" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:21:17.098912" elapsed="0.000442"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:21:17.099417" elapsed="0.000037"/>
</return>
<msg time="2026-10-16T01:21:17.099648" 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-10-16T01:21:17.098372" elapsed="0.001312"/>
</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-10-16T01:21:17.104426" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:21:17.103990" elapsed="0.000472"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:21:17.109958" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:21:17.110038" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:21:17.110229" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:21:17.104691" elapsed="0.006266">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:21:17.111372" elapsed="0.000036"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:21:17.111734" elapsed="0.000058"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:21:17.112026" elapsed="0.000028"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:17.112301" elapsed="0.000030"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:21:17.112553" elapsed="0.000027"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:17.112924" elapsed="0.000032"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:21:17.113350" elapsed="0.000030"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:21:17.113631" elapsed="0.000029"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:17.114460" elapsed="0.000116"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:17.115245" elapsed="0.000069"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:21:17.115964" elapsed="0.000054"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:21:17.113150" elapsed="0.003103"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:21:17.113033" elapsed="0.003294"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:21:17.116468" elapsed="0.000062"/>
</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="FAIL" start="2026-10-16T01:21:17.103344" elapsed="0.013515">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:21:19.122863" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:21:19.122114" elapsed="0.000812"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:21:19.129753" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:21:19.129897" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:21:19.130223" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:21:19.123315" elapsed="0.007854">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:21:19.131833" elapsed="0.000056"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:21:19.132303" elapsed="0.000051"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:21:19.132687" elapsed="0.000097"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:19.133138" elapsed="0.000045"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:21:19.133510" elapsed="0.000043"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:19.134031" elapsed="0.000047"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:21:19.134637" elapsed="0.000043"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:21:19.135080" elapsed="0.000045"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:19.135471" elapsed="0.000042"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:19.135916" elapsed="0.000045"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:21:19.136382" elapsed="0.000042"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:21:19.134339" elapsed="0.002165"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:21:19.134179" elapsed="0.002381"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:21:19.136646" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:21:19.121022" elapsed="0.015913">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:21:21.143515" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:21:21.142823" elapsed="0.000753"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:21:21.150174" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:21:21.150289" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:21:21.150523" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:21:21.143985" elapsed="0.007466">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:21:21.152112" elapsed="0.000054"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:21:21.152554" elapsed="0.000046"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:21:21.152973" elapsed="0.000043"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:21.153351" elapsed="0.000040"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:21:21.153734" elapsed="0.000058"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:21.154313" elapsed="0.000042"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:21:21.154949" elapsed="0.000043"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:21:21.155333" elapsed="0.000040"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:21.155741" elapsed="0.000060"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:21.156148" elapsed="0.000041"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:21:21.156622" elapsed="0.000041"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:21:21.154614" elapsed="0.002154"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:21:21.154453" elapsed="0.002389"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:21:21.156929" elapsed="0.000033"/>
</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="FAIL" start="2026-10-16T01:21:21.141731" elapsed="0.015426">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:21:23.163389" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:21:23.162627" elapsed="0.000824"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:21:23.170128" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:21:23.170244" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:21:23.170458" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:21:23.163856" elapsed="0.007531">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:21:23.172055" elapsed="0.000055"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:21:23.172502" elapsed="0.000046"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:21:23.172925" elapsed="0.000043"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:23.173305" elapsed="0.000040"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:21:23.173661" elapsed="0.000067"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:23.174157" elapsed="0.000040"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:21:23.174776" elapsed="0.000064"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:21:23.175186" elapsed="0.000041"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:23.175569" elapsed="0.000040"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:23.175995" elapsed="0.000042"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:21:23.176592" elapsed="0.000042"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:21:23.174460" elapsed="0.002280"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:21:23.174296" elapsed="0.002521"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:21:23.176911" elapsed="0.000034"/>
</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="FAIL" start="2026-10-16T01:21:23.161440" elapsed="0.015703">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:21:25.184414" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:21:25.183609" elapsed="0.000873"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:21:25.191191" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:21:25.191311" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:21:25.191559" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:21:25.184898" elapsed="0.007683">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:21:25.193263" elapsed="0.000054"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:21:25.193750" elapsed="0.000050"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:21:25.194154" elapsed="0.000044"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:25.194538" elapsed="0.000041"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:21:25.194952" elapsed="0.000043"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:25.195407" elapsed="0.000041"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:21:25.196051" elapsed="0.000041"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:21:25.196436" elapsed="0.000041"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:25.196874" elapsed="0.000042"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:25.197255" elapsed="0.000041"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:21:25.197743" elapsed="0.000042"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:21:25.195737" elapsed="0.002144"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:21:25.195548" elapsed="0.002390"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:21:25.198026" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:21:25.182346" elapsed="0.015911">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:21:27.204937" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:21:27.204084" elapsed="0.000928"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:21:27.212517" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:21:27.212641" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:21:27.212956" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:21:27.205384" elapsed="0.008655">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:21:27.214742" elapsed="0.000057"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:21:27.215228" elapsed="0.000047"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:21:27.215604" elapsed="0.000041"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:27.216034" elapsed="0.000041"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:21:27.216396" elapsed="0.000040"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:27.216896" elapsed="0.000043"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:21:27.217531" elapsed="0.000040"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:21:27.217964" elapsed="0.000042"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:27.218361" elapsed="0.000041"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:27.218767" elapsed="0.000043"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:21:27.219284" elapsed="0.000041"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:21:27.217238" elapsed="0.002163"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:21:27.217056" elapsed="0.002406"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:21:27.219563" elapsed="0.000038"/>
</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="FAIL" start="2026-10-16T01:21:27.202809" elapsed="0.017058">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:21:29.225965" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:21:29.225332" elapsed="0.000687"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:21:29.231644" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:21:29.231761" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:21:29.231989" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:21:29.226256" elapsed="0.006652">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:21:29.233359" elapsed="0.000036"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:21:29.233633" elapsed="0.000027"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:21:29.233899" elapsed="0.000027"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:29.234127" elapsed="0.000024"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:21:29.234343" elapsed="0.000024"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:29.234618" elapsed="0.000023"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:21:29.235061" elapsed="0.000025"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:21:29.235288" elapsed="0.000024"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:29.235523" elapsed="0.000026"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:29.235781" elapsed="0.000026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:21:29.236131" elapsed="0.000026"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:21:29.234882" elapsed="0.001322"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:21:29.234744" elapsed="0.001500"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:21:29.236320" 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="FAIL" start="2026-10-16T01:21:29.224294" elapsed="0.012209">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:21:31.241177" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:21:31.240545" elapsed="0.000683"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:21:31.246955" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:21:31.247090" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:21:31.247356" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:21:31.241446" elapsed="0.007194">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:21:31.249450" elapsed="0.000074"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:21:31.250061" elapsed="0.000051"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:21:31.250506" elapsed="0.000049"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:31.251065" elapsed="0.000057"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:21:31.251456" elapsed="0.000042"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:31.252240" elapsed="0.000062"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:21:31.253189" elapsed="0.000066"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:21:31.253928" elapsed="0.000065"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:31.254440" elapsed="0.000051"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:31.255004" elapsed="0.000050"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:21:31.255607" elapsed="0.000051"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:21:31.252676" elapsed="0.003113"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:21:31.252455" elapsed="0.003441"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:21:31.256048" elapsed="0.000059"/>
</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="FAIL" start="2026-10-16T01:21:31.239548" elapsed="0.016845">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:21:33.268458" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:21:33.267104" elapsed="0.001440"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:21:33.275939" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:21:33.276086" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:21:33.276370" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:21:33.269032" elapsed="0.008509">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:21:33.278258" elapsed="0.000058"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:21:33.278807" elapsed="0.000063"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:21:33.279248" elapsed="0.000045"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:33.279635" elapsed="0.000043"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:21:33.280065" elapsed="0.000045"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:33.280530" elapsed="0.000058"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:21:33.281269" elapsed="0.000059"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:21:33.281771" elapsed="0.000051"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:33.282242" elapsed="0.000045"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:33.282662" elapsed="0.000075"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:21:33.283198" elapsed="0.000045"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:21:33.280958" elapsed="0.002516"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:21:33.280746" elapsed="0.002794"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:21:33.283642" elapsed="0.000040"/>
</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="FAIL" start="2026-10-16T01:21:33.265753" elapsed="0.018214">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:21:35.291921" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:21:35.290959" elapsed="0.001041"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:21:35.299648" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:21:35.299826" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:21:35.300138" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:21:35.292436" elapsed="0.008931">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:21:35.302139" elapsed="0.000062"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:21:35.302669" elapsed="0.000086"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:21:35.303148" elapsed="0.000047"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:35.303611" elapsed="0.000046"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:21:35.304100" elapsed="0.000046"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:35.304613" elapsed="0.000044"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:21:35.305351" elapsed="0.000068"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:21:35.305853" elapsed="0.000248"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:35.306492" elapsed="0.000045"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:35.306985" elapsed="0.000047"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:21:35.307494" elapsed="0.000044"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:21:35.305047" elapsed="0.002569"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:21:35.304816" elapsed="0.002859"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:21:35.307810" elapsed="0.000050"/>
</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="FAIL" start="2026-10-16T01:21:35.289426" elapsed="0.018695">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:21:37.315432" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:21:37.314610" elapsed="0.000891"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:21:37.322386" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:21:37.322656" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:21:37.322985" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:21:37.315896" elapsed="0.008196">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:21:37.324766" elapsed="0.000057"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:21:37.325258" elapsed="0.000049"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:21:37.325638" elapsed="0.000044"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:37.326108" elapsed="0.000045"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:21:37.326482" elapsed="0.000042"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:37.326989" elapsed="0.000045"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:21:37.327616" elapsed="0.000043"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:21:37.328061" elapsed="0.000044"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:37.328460" elapsed="0.000042"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:37.328873" elapsed="0.000063"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:21:37.329369" elapsed="0.000042"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:21:37.327323" elapsed="0.002167"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:21:37.327147" elapsed="0.002403"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:21:37.329648" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:21:37.313379" elapsed="0.016579">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:21:39.333771" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:21:39.333355" elapsed="0.000453"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:21:39.338337" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:21:39.338401" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:21:39.338541" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:21:39.333999" elapsed="0.005158">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:21:39.339462" elapsed="0.000135"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:21:39.339813" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:21:39.340002" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:39.340175" elapsed="0.000018"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:21:39.340338" elapsed="0.000017"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:39.340543" elapsed="0.000018"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:21:39.340863" elapsed="0.000019"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:21:39.341052" elapsed="0.000019"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:39.341235" elapsed="0.000018"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:39.341405" elapsed="0.000018"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:21:39.341622" elapsed="0.000018"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:21:39.340727" elapsed="0.000947"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:21:39.340619" elapsed="0.001102"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:21:39.341779" elapsed="0.000019"/>
</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="FAIL" start="2026-10-16T01:21:39.332639" elapsed="0.009269">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:21:41.348390" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:21:41.347614" elapsed="0.000837"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:21:41.354872" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:21:41.355018" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:21:41.355268" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:21:41.348843" elapsed="0.007443">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:21:41.356937" elapsed="0.000076"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:21:41.357417" elapsed="0.000048"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:21:41.357828" elapsed="0.000044"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:41.358234" elapsed="0.000042"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:21:41.358594" elapsed="0.000039"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:41.359089" elapsed="0.000043"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:21:41.359687" elapsed="0.000075"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:21:41.360257" elapsed="0.000045"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:41.360655" elapsed="0.000042"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:41.361098" elapsed="0.000043"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:21:41.361560" elapsed="0.000042"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:21:41.359398" elapsed="0.002279"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:21:41.359236" elapsed="0.002531"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:21:41.361862" elapsed="0.000038"/>
</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="FAIL" start="2026-10-16T01:21:41.346530" elapsed="0.015595">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:21:43.368530" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:21:43.367752" elapsed="0.000844"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:21:43.375194" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:21:43.375317" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:21:43.375557" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:21:43.369016" elapsed="0.007587">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:21:43.377309" elapsed="0.000059"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:21:43.377815" elapsed="0.000053"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:21:43.378235" elapsed="0.000046"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:43.378633" elapsed="0.000043"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:21:43.379067" elapsed="0.000046"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:43.379535" elapsed="0.000044"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:21:43.380205" elapsed="0.000044"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:21:43.380602" elapsed="0.000045"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:43.381061" elapsed="0.000046"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:43.381460" elapsed="0.000042"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:21:43.381962" elapsed="0.000069"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:21:43.379884" elapsed="0.002233"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:21:43.379685" elapsed="0.002491"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:21:43.382454" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:21:43.366544" elapsed="0.016306">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:21:45.390102" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:21:45.389261" elapsed="0.000912"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:21:45.396680" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:21:45.396845" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:21:45.397248" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:21:45.390544" elapsed="0.007805">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:21:45.399031" elapsed="0.000058"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:21:45.399530" elapsed="0.000052"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:21:45.399945" elapsed="0.000073"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:45.400362" elapsed="0.000041"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:21:45.400750" elapsed="0.000043"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:45.401233" elapsed="0.000042"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:21:45.401882" elapsed="0.000044"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:21:45.402300" elapsed="0.000041"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:45.402691" elapsed="0.000071"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:45.403125" elapsed="0.000042"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:21:45.403588" elapsed="0.000041"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:21:45.401555" elapsed="0.002177"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:21:45.401383" elapsed="0.002412"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:21:45.403892" elapsed="0.000037"/>
</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="FAIL" start="2026-10-16T01:21:45.388032" elapsed="0.016126">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:21:47.410623" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:21:47.409835" elapsed="0.000857"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:21:47.417430" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:21:47.417557" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:21:47.418030" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:21:47.411111" elapsed="0.007979">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:21:47.419765" elapsed="0.000058"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:21:47.420264" elapsed="0.000052"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:21:47.420658" elapsed="0.000074"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:47.421114" elapsed="0.000045"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:21:47.421494" elapsed="0.000043"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:47.421985" elapsed="0.000065"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:21:47.422629" elapsed="0.000043"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:21:47.423083" elapsed="0.000046"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:47.423489" elapsed="0.000045"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:47.423916" elapsed="0.000045"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:21:47.424422" elapsed="0.000045"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:21:47.422330" elapsed="0.002217"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:21:47.422163" elapsed="0.002443"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:21:47.424729" elapsed="0.000041"/>
</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="FAIL" start="2026-10-16T01:21:47.408585" elapsed="0.016393">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<msg time="2026-10-16T01:21:47.425209" level="FAIL">Keyword 'OVSDB.Get OVSDB UUID' failed after retrying for 30 seconds. The last error was: Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:21:17.099995" elapsed="30.325418">Keyword 'OVSDB.Get OVSDB UUID' failed after retrying for 30 seconds. The last error was: Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<return>
<value>${ovsdb_uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:21:47.425547" elapsed="0.000035"/>
</return>
<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="FAIL" start="2026-10-16T01:21:12.673667" elapsed="34.752119">Keyword 'OVSDB.Get OVSDB UUID' failed after retrying for 30 seconds. The last error was: Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${ovsdb_uuid}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:47.426291" elapsed="0.000048"/>
</kw>
<doc>Connect OVS to all cluster instances.</doc>
<status status="FAIL" start="2026-10-16T01:21:12.312137" elapsed="35.114501">Keyword 'OVSDB.Get OVSDB UUID' failed after retrying for 30 seconds. The last error was: Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</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-10-16T01:21:47.430380" elapsed="0.001028"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:21:47.429799" elapsed="0.001729"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:21:47.434040" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:47.433780" elapsed="0.000363"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:47.433698" elapsed="0.000495"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:21:47.438473" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:47.438283" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:47.438246" elapsed="0.000369"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:21:47.440848" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:21:47.440063" elapsed="0.000845"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:21:47.441918" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:21:47.441270" elapsed="0.000703"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:21:47.442087" elapsed="0.000065"/>
</return>
<msg time="2026-10-16T01:21:47.442383" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:21:47.439129" elapsed="0.003307"/>
</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-10-16T01:21:47.447939" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:47.447742" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:47.447672" elapsed="0.000437"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:21:47.450822" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:47.450595" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:47.450558" elapsed="0.000411"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:21:47.451883" level="INFO">${karaf_connection_index} = 386</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:21:47.451315" elapsed="0.000625"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:47.452605" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:21:47.452338" elapsed="0.000302"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:21:47.487894" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:21:47.453496" elapsed="0.034697"/>
</kw>
<msg time="2026-10-16T01:21:47.488418" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:21:47.488477" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:47.452888" elapsed="0.035639"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:21:47.588392" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:21:47.489415" elapsed="0.099176"/>
</kw>
<msg time="2026-10-16T01:21:47.588776" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:21:47.588819" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:47.488793" elapsed="0.100063"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:47.589172" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:47.588929" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:47.588910" elapsed="0.000360"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:47.589814" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:21:47.589450" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:47.590345" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:47.590141" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:47.589959" elapsed="0.000482"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:21:47.590474" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:47.593110" elapsed="0.000486"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:21:47.594931" elapsed="0.000510"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:47.596816" 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-10-16T01:21:47.591350" elapsed="0.005864"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:21:47.590793" elapsed="0.006540"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:21:47.449990" elapsed="0.147421"/>
</kw>
<msg time="2026-10-16T01:21:47.597495" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:21:47.597537" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:47.448437" elapsed="0.149137"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:21:47.597778" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-16T01:21:47.597643" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:47.597626" 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-10-16T01:21:47.598213" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:47.598570" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:21:47.598636" 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-10-16T01:21:47.447059" elapsed="0.151698"/>
</kw>
<msg time="2026-10-16T01:21:47.598843" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:21:47.598884" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:47.443233" elapsed="0.155688"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:47.599225" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:47.598989" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:47.598972" elapsed="0.000325"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:21:47.442895" elapsed="0.156424"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:21:47.601857" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:47.601767" elapsed="0.000133"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:47.601749" elapsed="0.000172"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:21:47.603059" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:47.602959" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:47.602943" elapsed="0.000181"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:21:47.603503" level="INFO">${karaf_connection_index} = 388</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:21:47.603269" elapsed="0.000259"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:47.604169" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:21:47.603961" elapsed="0.000233"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:21:47.641944" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:21:47.604796" elapsed="0.037371"/>
</kw>
<msg time="2026-10-16T01:21:47.642330" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:21:47.642371" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:47.604349" elapsed="0.038059"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:21:47.735788" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:21:47.643051" elapsed="0.093018"/>
</kw>
<msg time="2026-10-16T01:21:47.736229" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:21:47.736271" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:47.642574" elapsed="0.093733"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:47.736600" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:47.736380" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:47.736361" elapsed="0.000334"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:47.737268" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:21:47.736903" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:47.737619" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:47.737423" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:47.737407" elapsed="0.000324"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:21:47.737763" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:47.740440" 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-10-16T01:21:47.742173" elapsed="0.000457"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:47.744049" elapsed="0.000308"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:21:47.738555" elapsed="0.005869"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:21:47.738060" elapsed="0.006480"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:21:47.602665" elapsed="0.141951"/>
</kw>
<msg time="2026-10-16T01:21:47.744715" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:21:47.744757" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:47.602084" elapsed="0.142709"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:21:47.744947" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:21:47.744863" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:47.744846" 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-10-16T01:21:47.745387" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:47.745684" elapsed="0.000119"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:21:47.745847" 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-10-16T01:21:47.601454" elapsed="0.144478"/>
</kw>
<msg time="2026-10-16T01:21:47.746028" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:21:47.746069" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:47.599566" elapsed="0.146539"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:47.746392" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:47.746172" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:47.746157" elapsed="0.000306"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:21:47.599429" elapsed="0.147055"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:21:47.748962" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:47.748874" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:47.748857" 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-10-16T01:21:47.750206" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:47.750118" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:47.750101" elapsed="0.000168"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:21:47.750638" 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-10-16T01:21:47.750411" elapsed="0.000251"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:47.751038" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:21:47.750842" elapsed="0.000221"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:21:47.784320" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:21:47.751628" elapsed="0.032896"/>
</kw>
<msg time="2026-10-16T01:21:47.784685" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:21:47.784754" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:47.751216" elapsed="0.033576"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:21:47.878758" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:21:47.785397" elapsed="0.093552"/>
</kw>
<msg time="2026-10-16T01:21:47.879127" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:21:47.879168" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:47.784958" elapsed="0.094246"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:47.879487" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:47.879278" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:47.879258" elapsed="0.000324"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:47.880237" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:21:47.879854" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:47.880591" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:47.880392" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:47.880375" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:21:47.880736" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:47.883213" elapsed="0.000471"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:21:47.884938" elapsed="0.000464"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:47.886586" elapsed="0.000716"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:21:47.881524" elapsed="0.005845"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:21:47.881028" elapsed="0.006457"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:21:47.749841" elapsed="0.137722"/>
</kw>
<msg time="2026-10-16T01:21:47.887647" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:21:47.887687" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:47.749235" elapsed="0.138507"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:21:47.887897" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:21:47.887812" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:47.887795" elapsed="0.000311"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:21:47.888427" 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-10-16T01:21:47.888779" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:21:47.888846" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:21:47.748558" elapsed="0.140374"/>
</kw>
<msg time="2026-10-16T01:21:47.889031" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:21:47.889074" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:47.746745" elapsed="0.142364"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:47.889396" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:47.889179" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:47.889163" elapsed="0.000304"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:21:47.746593" elapsed="0.142895"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:21:47.442540" elapsed="0.446976"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:21:47.437564" elapsed="0.452007"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:21:47.433140" elapsed="0.456483"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:47.432111" elapsed="0.457557"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:21:47.428978" elapsed="0.460828"/>
</kw>
<kw name="Get Ovsdb Entity Owner Status For One Device" owner="ClusterOvsdb">
<msg time="2026-10-16T01:21:47.893552" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:21:47.892335" elapsed="0.001258">Variable '${ovsdb_uuid}' not found.</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-10-16T01:21:47.893782" elapsed="0.000020"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${original_owner}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:47.893983" elapsed="0.000019"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${original_candidate_list}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:47.894189" elapsed="0.000018"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${original_candidate}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:47.894373" elapsed="0.000018"/>
</kw>
<doc>Check Entity Owner Status and identify owner and candidate.</doc>
<status status="FAIL" start="2026-10-16T01:21:47.427638" elapsed="0.466890">Variable '${ovsdb_uuid}' not found.</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-10-16T01:21:47.896141" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:21:47.895872" 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-10-16T01:21:47.897318" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:47.897230" elapsed="0.000132"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:47.897214" elapsed="0.000169"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:21:47.899306" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:47.899222" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:47.899205" elapsed="0.000164"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:21:47.900295" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:21:47.899948" elapsed="0.000372"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:21:47.900762" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:21:47.900473" elapsed="0.000313"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:21:47.900827" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:21:47.900996" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:21:47.899575" elapsed="0.001459"/>
</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-10-16T01:21:47.903617" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:47.903534" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:47.903517" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:21:47.904836" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:47.904751" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:47.904733" elapsed="0.000166"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:21:47.905310" level="INFO">${karaf_connection_index} = 386</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:21:47.905077" elapsed="0.000259"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:47.905733" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:21:47.905534" elapsed="0.000225"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:21:47.941385" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:21:47.906353" elapsed="0.035240"/>
</kw>
<msg time="2026-10-16T01:21:47.941774" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:21:47.941817" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:47.905914" elapsed="0.035938"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:21:48.016856" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:21:47.942459" elapsed="0.074614"/>
</kw>
<msg time="2026-10-16T01:21:48.017234" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:21:48.017275" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:47.942033" elapsed="0.075278"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:48.017591" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:48.017383" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:48.017363" elapsed="0.000321"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:48.018276" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:21:48.017892" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:48.018617" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:48.018420" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:48.018403" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:21:48.018761" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:48.021261" 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-10-16T01:21:48.023002" elapsed="0.000469"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:48.024676" 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-10-16T01:21:48.019541" elapsed="0.005756"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:21:48.019046" elapsed="0.006368"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:21:47.904467" elapsed="0.121028"/>
</kw>
<msg time="2026-10-16T01:21:48.025617" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:21:48.025658" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:47.903845" elapsed="0.121849"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:21:48.025869" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:21:48.025783" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:48.025765" elapsed="0.000182"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:21:48.026283" 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-10-16T01:21:48.026584" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:21:48.026648" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:21:47.903246" elapsed="0.123584"/>
</kw>
<msg time="2026-10-16T01:21:48.026915" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:21:48.026954" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:47.901376" elapsed="0.125614"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:48.027294" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:48.027075" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:48.027059" elapsed="0.000306"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:21:47.901238" elapsed="0.126149"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:21:48.029948" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:48.029863" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:48.029846" elapsed="0.000182"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:21:48.031141" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:48.031056" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:48.031039" elapsed="0.000164"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:21:48.031569" level="INFO">${karaf_connection_index} = 388</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:21:48.031345" elapsed="0.000249"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:48.031951" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:21:48.031772" elapsed="0.000203"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:21:48.066180" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:21:48.032560" elapsed="0.033803"/>
</kw>
<msg time="2026-10-16T01:21:48.066526" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:21:48.066568" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:48.032143" elapsed="0.034460"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:21:48.144755" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:21:48.067234" elapsed="0.077727"/>
</kw>
<msg time="2026-10-16T01:21:48.145175" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:21:48.145217" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:48.066793" elapsed="0.078460"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:48.145530" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:48.145325" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:48.145306" elapsed="0.000357"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:48.146239" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:21:48.145870" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:48.146582" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:48.146384" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:48.146368" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:21:48.146724" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:48.149224" 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-10-16T01:21:48.150964" elapsed="0.000473"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:48.152632" 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-10-16T01:21:48.147510" elapsed="0.005747"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:21:48.146995" elapsed="0.006380"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:21:48.030785" elapsed="0.122668"/>
</kw>
<msg time="2026-10-16T01:21:48.153534" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:21:48.153574" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:48.030178" elapsed="0.123433"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:21:48.153784" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:21:48.153679" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:48.153662" elapsed="0.000200"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:21:48.154196" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:48.154498" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:21:48.154563" 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-10-16T01:21:48.029547" elapsed="0.125101"/>
</kw>
<msg time="2026-10-16T01:21:48.154826" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:21:48.154869" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:48.027634" elapsed="0.127275"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:48.155211" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:48.154978" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:48.154962" elapsed="0.000322"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:21:48.027498" elapsed="0.127808"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:21:48.157885" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:48.157800" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:48.157783" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:21:48.159073" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:48.158972" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:48.158955" elapsed="0.000182"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:21:48.159503" 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-10-16T01:21:48.159278" elapsed="0.000250"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:48.159884" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:21:48.159688" elapsed="0.000251"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:21:48.192107" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:21:48.160533" elapsed="0.031756"/>
</kw>
<msg time="2026-10-16T01:21:48.192476" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:21:48.192518" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:48.160113" elapsed="0.032442"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:21:48.261623" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:21:48.193206" elapsed="0.068631"/>
</kw>
<msg time="2026-10-16T01:21:48.261995" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:21:48.262051" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:48.192751" elapsed="0.069337"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:48.262379" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:48.262167" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:48.262144" elapsed="0.000331"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:48.263032" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:21:48.262659" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:48.263375" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:48.263180" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:48.263163" elapsed="0.000304"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:21:48.263499" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:48.266056" elapsed="0.000478"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:21:48.267782" elapsed="0.000486"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:48.269617" 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-10-16T01:21:48.264327" elapsed="0.005683"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:21:48.263807" elapsed="0.006333"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:21:48.158690" elapsed="0.111529"/>
</kw>
<msg time="2026-10-16T01:21:48.270300" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:21:48.270339" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:48.158109" elapsed="0.112267"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:21:48.270528" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:21:48.270445" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:48.270428" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:21:48.270982" 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-10-16T01:21:48.271320" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:21:48.271384" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:21:48.157484" elapsed="0.113985"/>
</kw>
<msg time="2026-10-16T01:21:48.271606" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:21:48.271647" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:48.155553" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:48.272035" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:48.271798" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:48.271780" elapsed="0.000328"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:21:48.155416" elapsed="0.116714"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:21:47.901087" elapsed="0.371073"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:21:47.898915" elapsed="0.373302"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:21:47.896955" elapsed="0.375315"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:47.896539" elapsed="0.375776"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:21:47.895517" elapsed="0.376847"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:48.276135" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:48.275887" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:48.275870" elapsed="0.000341"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:48.276541" 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-10-16T01:21:48.276634" 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-10-16T01:21:48.276401" elapsed="0.000257"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:48.277181" level="INFO">Attempting to execute command "sudo ovs-vsctl add-br br-s1" on remote system "10.30.171.104" 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-10-16T01:21:48.276863" elapsed="0.000361"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:48.277728" level="INFO">${conn_id} = 417</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-10-16T01:21:48.277397" elapsed="0.000356"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:21:48.278610" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:21:48.278680" 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-10-16T01:21:48.278321" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:48.278866" elapsed="0.000298"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:21:48.279939" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:21:48.938100" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:21:48 UTC 2026

  System load:  0.12               Processes:             106
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:21:16 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:21:48.279688" elapsed="0.658537"/>
</kw>
<msg time="2026-10-16T01:21:48.938300" 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-10-16T01:21:48.279324" elapsed="0.659049"/>
</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-10-16T01:21:48.277946" elapsed="0.660527"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:21:48.939053" level="INFO">Executing command 'sudo ovs-vsctl add-br br-s1'.</msg>
<msg time="2026-10-16T01:21:49.004314" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:21:49.004569" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:21:49.004659" 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-10-16T01:21:48.938822" elapsed="0.065928"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:49.005139" elapsed="0.000454"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:49.006786" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:21:49.006153" elapsed="0.000726"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:21:49.007329" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:49.007070" elapsed="0.000363"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:49.006993" elapsed="0.000491"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:21:49.007819" elapsed="0.000056"/>
</return>
<status status="PASS" start="2026-10-16T01:21:49.007595" elapsed="0.000352"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:49.007563" elapsed="0.000436"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:21:49.008093" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:49.009730" elapsed="0.000710"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:21:49.010879" elapsed="0.000440"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:49.011732" elapsed="0.000206"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:21:49.008779" elapsed="0.003292"/>
</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-10-16T01:21:48.275441" elapsed="0.736790"/>
</kw>
<msg time="2026-10-16T01:21:49.012339" 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-10-16T01:21:48.274887" elapsed="0.737555"/>
</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-10-16T01:21:48.274455" elapsed="0.738144"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:21:49.013900" 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-10-16T01:21:49.013169" elapsed="0.000789"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:21:49.015101" 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-10-16T01:21:49.014406" elapsed="0.000754"/>
</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-10-16T01:21:49.025207" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:21:49.024408" elapsed="0.000858"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:21:49.026277" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:21:49.025601" elapsed="0.000732"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:21:49.026426" elapsed="0.000060"/>
</return>
<msg time="2026-10-16T01:21:49.026744" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:21:49.023559" elapsed="0.003239"/>
</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-10-16T01:21:49.032770" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:21:49.032084" elapsed="0.000743"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:21:49.032920" elapsed="0.000057"/>
</return>
<msg time="2026-10-16T01:21:49.033223" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:21:49.031318" elapsed="0.001956"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:49.035876" 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-10-16T01:21:49.035506" elapsed="0.000429"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:49.036610" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:21:49.036299" elapsed="0.000375"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:21:49.043471" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:21:49.043550" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:21:49.043740" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:21:49.037128" elapsed="0.007253">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:21:49.036781" elapsed="0.007721">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:21:49.044779" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:49.044544" elapsed="0.000319"/>
</branch>
<status status="FAIL" start="2026-10-16T01:21:49.036757" elapsed="0.008138">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:21:49.045403" elapsed="0.000034"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:21:49.045571" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:49.045525" elapsed="0.000099"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:21:49.045503" elapsed="0.000149"/>
</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-10-16T01:21:49.045867" elapsed="0.000028"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:21:49.045956" 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-10-16T01:21:49.034093" elapsed="0.012020">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:21:49.046191" 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-10-16T01:21:49.030336" elapsed="0.015974">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:21:49.046604" elapsed="0.000030"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:21:49.027194" elapsed="0.019527">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:21:49.026911" elapsed="0.019888">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:21:49.022437" elapsed="0.024477">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:21:50.056858" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:21:50.056238" elapsed="0.000668"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:21:50.057420" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:21:50.057111" elapsed="0.000335"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:21:50.057504" elapsed="0.000068"/>
</return>
<msg time="2026-10-16T01:21:50.057837" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:21:50.055789" elapsed="0.002073"/>
</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-10-16T01:21:50.060803" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:21:50.060502" elapsed="0.000327"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:21:50.060872" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:21:50.060995" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:21:50.060167" elapsed="0.000853"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:50.062319" 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-10-16T01:21:50.062061" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:50.062797" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:21:50.062551" 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-10-16T01:21:50.070358" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:21:50.070424" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:21:50.070574" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:21:50.063209" elapsed="0.007945">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:21:50.062932" elapsed="0.008314">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:21:50.071445" elapsed="0.000346"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:50.071288" elapsed="0.000546"/>
</branch>
<status status="FAIL" start="2026-10-16T01:21:50.062903" elapsed="0.008957">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:21:50.072251" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:21:50.072378" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:50.072343" elapsed="0.000073"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:21:50.072327" elapsed="0.000109"/>
</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-10-16T01:21:50.072596" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:21:50.072660" 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-10-16T01:21:50.061397" elapsed="0.011382">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:21:50.072834" 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-10-16T01:21:50.059713" elapsed="0.013220">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:21:50.073173" elapsed="0.000023"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:21:50.058122" elapsed="0.015123">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:21:50.057945" elapsed="0.015359">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:21:50.054832" elapsed="0.018599">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:21:51.084567" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:21:51.083504" elapsed="0.001141"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:21:51.085758" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:21:51.085086" elapsed="0.000729"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:21:51.085925" elapsed="0.000102"/>
</return>
<msg time="2026-10-16T01:21:51.086320" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:21:51.082568" elapsed="0.003804"/>
</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-10-16T01:21:51.092523" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:21:51.091885" elapsed="0.000693"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:21:51.092673" elapsed="0.000090"/>
</return>
<msg time="2026-10-16T01:21:51.092986" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:21:51.091136" elapsed="0.001900"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:51.096007" 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-10-16T01:21:51.095443" elapsed="0.000682"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:51.097108" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:21:51.096547" 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-10-16T01:21:51.104675" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:21:51.104864" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:21:51.105138" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:21:51.097923" elapsed="0.008116">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:21:51.097364" elapsed="0.008884">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:21:51.106684" elapsed="0.000091"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:51.106328" elapsed="0.000538"/>
</branch>
<status status="FAIL" start="2026-10-16T01:21:51.097318" elapsed="0.009600">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:21:51.108237" elapsed="0.000055"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:21:51.108510" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:51.108436" elapsed="0.000159"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:21:51.108399" 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-10-16T01:21:51.108983" elapsed="0.000045"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:21:51.109148" 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-10-16T01:21:51.093901" elapsed="0.015576">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:21:51.109602" 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-10-16T01:21:51.090137" elapsed="0.019689">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:21:51.110326" elapsed="0.000051"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:21:51.086830" elapsed="0.023656">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:21:51.086510" elapsed="0.024106">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:21:51.080839" elapsed="0.030025">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:21:52.121468" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:21:52.120402" elapsed="0.001141"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:21:52.122621" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:21:52.121949" elapsed="0.000727"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:21:52.122818" elapsed="0.000101"/>
</return>
<msg time="2026-10-16T01:21:52.123204" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:21:52.119490" elapsed="0.003767"/>
</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-10-16T01:21:52.129478" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:21:52.128800" elapsed="0.000736"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:21:52.129633" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:21:52.129954" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:21:52.127941" elapsed="0.002064"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:52.132773" 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-10-16T01:21:52.132219" elapsed="0.000654"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:52.133840" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:21:52.133316" 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-10-16T01:21:52.141197" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:21:52.141317" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:21:52.141554" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:21:52.134638" elapsed="0.007806">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:21:52.134116" elapsed="0.008503">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:21:52.143090" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:52.142695" elapsed="0.000644"/>
</branch>
<status status="FAIL" start="2026-10-16T01:21:52.134044" elapsed="0.009350">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:21:52.144250" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:21:52.144520" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:52.144446" elapsed="0.000160"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:21:52.144410" elapsed="0.000250"/>
</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-10-16T01:21:52.145095" elapsed="0.000048"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:21:52.145244" elapsed="0.000031"/>
</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-10-16T01:21:52.130771" elapsed="0.014691">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:21:52.145583" 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-10-16T01:21:52.126961" elapsed="0.018920">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:21:52.147005" elapsed="0.000073"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:21:52.123677" elapsed="0.023517">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:21:52.123391" elapsed="0.023926">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:21:52.117984" elapsed="0.029520">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:21:53.158388" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:21:53.157372" elapsed="0.001090"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:21:53.159518" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:21:53.158859" elapsed="0.000712"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:21:53.159677" elapsed="0.000126"/>
</return>
<msg time="2026-10-16T01:21:53.160079" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:21:53.156469" elapsed="0.003665"/>
</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-10-16T01:21:53.166242" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:21:53.165568" elapsed="0.000730"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:21:53.166391" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:21:53.166660" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:21:53.164790" elapsed="0.001952"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:53.169500" 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-10-16T01:21:53.168956" elapsed="0.000639"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:53.170584" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:21:53.170090" elapsed="0.000585"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:21:53.178272" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:21:53.178392" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:21:53.178784" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:21:53.171437" elapsed="0.008195">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:21:53.170867" elapsed="0.008974">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:21:53.180280" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:53.179916" elapsed="0.000535"/>
</branch>
<status status="FAIL" start="2026-10-16T01:21:53.170821" elapsed="0.009694">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:21:53.181340" elapsed="0.000054"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:21:53.181607" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:53.181534" elapsed="0.000259"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:21:53.181499" elapsed="0.000364"/>
</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-10-16T01:21:53.182309" elapsed="0.000064"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:21:53.182515" elapsed="0.000046"/>
</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-10-16T01:21:53.167483" elapsed="0.015383">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:21:53.183028" elapsed="0.000076"/>
</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-10-16T01:21:53.163819" elapsed="0.019476">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:21:53.183828" elapsed="0.000059"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:21:53.160543" elapsed="0.023453">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:21:53.160267" elapsed="0.023871">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:21:53.154604" elapsed="0.029778">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:21:54.195411" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:21:54.194411" elapsed="0.001076"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:21:54.196537" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:21:54.195880" elapsed="0.000711"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:21:54.196691" elapsed="0.000124"/>
</return>
<msg time="2026-10-16T01:21:54.197065" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:21:54.193536" elapsed="0.003607"/>
</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-10-16T01:21:54.203106" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:21:54.202444" elapsed="0.000719"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:21:54.203257" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:21:54.203528" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:21:54.201678" elapsed="0.001901"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:54.206303" 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-10-16T01:21:54.205759" elapsed="0.000639"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:54.207492" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:21:54.206846" elapsed="0.000739"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:21:54.214964" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:21:54.215105" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:21:54.215356" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:21:54.208319" elapsed="0.007911">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:21:54.207771" elapsed="0.008631">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:21:54.216849" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:54.216475" elapsed="0.000518"/>
</branch>
<status status="FAIL" start="2026-10-16T01:21:54.207696" elapsed="0.009349">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:21:54.217863" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:21:54.218155" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:54.218056" elapsed="0.000184"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:21:54.218020" elapsed="0.000265"/>
</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-10-16T01:21:54.218593" elapsed="0.000043"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:21:54.218761" 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-10-16T01:21:54.204309" elapsed="0.014668">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:21:54.219119" 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-10-16T01:21:54.200743" elapsed="0.018567">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:21:54.219802" elapsed="0.000050"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:21:54.197535" elapsed="0.022421">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:21:54.197267" elapsed="0.022831">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:21:54.192110" elapsed="0.028178">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<msg time="2026-10-16T01:21:54.220485" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<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="FAIL" start="2026-10-16T01:21:49.015595" elapsed="5.205084">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${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="NOT RUN" start="2026-10-16T01:21:54.221248" elapsed="0.000045"/>
</kw>
<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-10-16T01:21:48.274080" elapsed="5.947485">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<doc>Create bridge with OVS command and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-10-16T01:21:47.894938" elapsed="6.326960">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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-10-16T01:21:54.225795" elapsed="0.000482"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:21:54.225196" elapsed="0.001195"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:21:54.228634" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:54.228434" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:54.228364" elapsed="0.000446"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:21:54.233266" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:54.233051" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:54.233013" elapsed="0.000393"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:21:54.235513" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:21:54.234763" elapsed="0.000835"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:21:54.236686" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:21:54.236014" elapsed="0.000771"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:21:54.236907" elapsed="0.000081"/>
</return>
<msg time="2026-10-16T01:21:54.237320" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:21:54.233924" elapsed="0.003464"/>
</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-10-16T01:21:54.242246" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:54.242121" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:54.242097" elapsed="0.000236"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:21:54.243938" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:54.243821" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:54.243797" elapsed="0.000230"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:21:54.244576" level="INFO">${karaf_connection_index} = 386</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:21:54.244253" elapsed="0.000358"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:54.245155" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:21:54.244866" elapsed="0.000324"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:21:54.279627" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:21:54.246029" elapsed="0.033921"/>
</kw>
<msg time="2026-10-16T01:21:54.280201" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:21:54.280263" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:54.245409" elapsed="0.034907"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:21:54.352390" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:21:54.281334" elapsed="0.071257"/>
</kw>
<msg time="2026-10-16T01:21:54.352799" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:21:54.352842" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:54.280575" elapsed="0.072304"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:54.353241" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:54.353002" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:54.352980" elapsed="0.000362"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:54.353912" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:21:54.353532" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:54.354277" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:54.354059" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:54.354042" elapsed="0.000330"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:21:54.354403" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:54.356956" 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-10-16T01:21:54.358809" elapsed="0.000538"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:54.360764" 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-10-16T01:21:54.355256" elapsed="0.005906"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:21:54.354734" elapsed="0.006545"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:21:54.243428" elapsed="0.117927"/>
</kw>
<msg time="2026-10-16T01:21:54.361437" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:21:54.361477" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:54.242538" elapsed="0.118975"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:21:54.361666" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:21:54.361581" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:54.361564" elapsed="0.000255"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:21:54.362166" 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-10-16T01:21:54.362466" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:21:54.362529" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:21:54.241687" elapsed="0.120927"/>
</kw>
<msg time="2026-10-16T01:21:54.362697" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:21:54.362758" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:54.238306" elapsed="0.124491"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:54.363096" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:54.362865" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:54.362849" elapsed="0.000320"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:21:54.237907" elapsed="0.125283"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:21:54.365933" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:54.365847" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:54.365829" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:21:54.367118" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:54.367016" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:54.367000" elapsed="0.000180"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:21:54.367596" level="INFO">${karaf_connection_index} = 388</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:21:54.367366" elapsed="0.000256"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:54.367988" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:21:54.367806" elapsed="0.000207"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:21:54.404725" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:21:54.368601" elapsed="0.036362"/>
</kw>
<msg time="2026-10-16T01:21:54.405184" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:21:54.405225" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:54.368187" elapsed="0.037105"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:21:54.480244" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:21:54.406112" elapsed="0.074325"/>
</kw>
<msg time="2026-10-16T01:21:54.480596" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:21:54.480636" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:54.405535" elapsed="0.075137"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:54.481054" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:54.480796" elapsed="0.000363"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:54.480764" elapsed="0.000428"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:54.481791" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:21:54.481404" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:54.482186" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:54.481961" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:54.481942" elapsed="0.000344"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:21:54.482323" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:54.485401" 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-10-16T01:21:54.487217" elapsed="0.000672"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:54.489066" 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-10-16T01:21:54.483601" elapsed="0.005862"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:21:54.482735" elapsed="0.006847"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:21:54.366762" elapsed="0.122898"/>
</kw>
<msg time="2026-10-16T01:21:54.489823" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:21:54.489864" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:54.366160" elapsed="0.123741"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:21:54.490057" elapsed="0.000044"/>
</return>
<status status="PASS" start="2026-10-16T01:21:54.489972" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:54.489954" 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-10-16T01:21:54.490487" 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-10-16T01:21:54.490871" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:21:54.490938" 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-10-16T01:21:54.365536" elapsed="0.125489"/>
</kw>
<msg time="2026-10-16T01:21:54.491129" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:21:54.491170" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:54.363662" elapsed="0.127542"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:54.491492" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:54.491272" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:54.491256" elapsed="0.000310"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:21:54.363522" elapsed="0.128067"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:21:54.494198" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:54.494112" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:54.494094" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:21:54.495355" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:54.495270" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:54.495253" elapsed="0.000164"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:21:54.495820" 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-10-16T01:21:54.495562" elapsed="0.000282"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:54.496208" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:21:54.496006" elapsed="0.000226"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:21:54.528750" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:21:54.496811" elapsed="0.032122"/>
</kw>
<msg time="2026-10-16T01:21:54.529114" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:21:54.529156" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:54.496385" elapsed="0.032807"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:21:54.607329" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:21:54.529812" elapsed="0.077804"/>
</kw>
<msg time="2026-10-16T01:21:54.607869" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:21:54.607911" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:54.529364" elapsed="0.078583"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:54.608434" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:54.608116" elapsed="0.000394"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:54.608029" elapsed="0.000515"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:54.609230" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:21:54.608757" elapsed="0.000559"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:54.609576" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:54.609376" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:54.609360" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:21:54.609734" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:54.612611" 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-10-16T01:21:54.614421" elapsed="0.000878"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:54.616660" 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-10-16T01:21:54.610807" elapsed="0.006258"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:21:54.610138" elapsed="0.007093"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:21:54.494994" elapsed="0.122315"/>
</kw>
<msg time="2026-10-16T01:21:54.617393" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:21:54.617433" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:54.494404" elapsed="0.123064"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:21:54.617621" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:21:54.617537" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:54.617520" 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 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-10-16T01:21:54.618120" 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-10-16T01:21:54.618431" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:21:54.618495" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:21:54.493793" elapsed="0.124786"/>
</kw>
<msg time="2026-10-16T01:21:54.618665" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:21:54.618721" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:54.491982" elapsed="0.126776"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:54.619045" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:54.618826" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:54.618810" elapsed="0.000346"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:21:54.491840" elapsed="0.127338"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:21:54.237524" elapsed="0.381691"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:21:54.232270" elapsed="0.387010"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:21:54.227803" elapsed="0.391534"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:21:54.226803" elapsed="0.392582"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:21:54.223980" elapsed="0.395462"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:21:54.623097" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:54.622845" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:54.622827" elapsed="0.000346"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:54.623506" 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-10-16T01:21:54.623601" 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-10-16T01:21:54.623367" elapsed="0.000258"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:54.624130" 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.104" 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-10-16T01:21:54.623828" elapsed="0.000345"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:21:54.624713" level="INFO">${conn_id} = 422</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-10-16T01:21:54.624382" elapsed="0.000357"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:21:54.625580" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:21:54.625649" 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-10-16T01:21:54.625304" elapsed="0.000366"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:54.625834" elapsed="0.000299"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:21:54.626905" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:21:55.045005" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:21:48 UTC 2026

  System load:  0.12               Processes:             106
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:21:48 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:21:54.626656" elapsed="0.418586"/>
</kw>
<msg time="2026-10-16T01:21:55.045346" 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-10-16T01:21:54.626295" elapsed="0.419166"/>
</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-10-16T01:21:54.624934" elapsed="0.420675"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:21:55.046343" level="INFO">Executing command 'sudo ovs-vsctl add-port br-s1 vx1 -- set Interface vx1 type=vxlan'.</msg>
<msg time="2026-10-16T01:21:55.089905" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:21:55.090187" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:21:55.090281" 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-10-16T01:21:55.045998" elapsed="0.044334"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:55.090691" elapsed="0.000577"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:55.092522" 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-10-16T01:21:55.091854" elapsed="0.000764"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:21:55.093116" elapsed="0.000041"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:55.092832" elapsed="0.000402"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:55.092772" 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-10-16T01:21:55.093605" elapsed="0.000062"/>
</return>
<status status="PASS" start="2026-10-16T01:21:55.093409" elapsed="0.000360"/>
</branch>
<status status="PASS" start="2026-10-16T01:21:55.093377" elapsed="0.000452"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:21:55.093910" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:21:55.095641" elapsed="0.000736"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:21:55.096816" elapsed="0.000364"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:21:55.097491" elapsed="0.000198"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:21:55.094633" elapsed="0.003194"/>
</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-10-16T01:21:54.622406" elapsed="0.475578"/>
</kw>
<msg time="2026-10-16T01:21:55.098110" 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-10-16T01:21:54.621870" elapsed="0.476348"/>
</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-10-16T01:21:54.621424" elapsed="0.477075"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:21:55.099677" 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-10-16T01:21:55.098974" elapsed="0.000789"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:21:55.100885" 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-10-16T01:21:55.100216" elapsed="0.000731"/>
</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-10-16T01:21:55.111317" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:21:55.110524" elapsed="0.000848"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:21:55.112383" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:21:55.111745" elapsed="0.000690"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:21:55.112526" elapsed="0.000059"/>
</return>
<msg time="2026-10-16T01:21:55.112856" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:21:55.109685" elapsed="0.003231"/>
</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-10-16T01:21:55.116623" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:21:55.116245" elapsed="0.000413"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:21:55.116737" elapsed="0.000037"/>
</return>
<msg time="2026-10-16T01:21:55.116910" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:21:55.115786" elapsed="0.001156"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:55.118579" 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-10-16T01:21:55.118270" elapsed="0.000368"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:55.119521" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:21:55.118919" elapsed="0.000660"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:21:55.124598" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:21:55.124671" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:21:55.124853" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:21:55.120008" elapsed="0.005431">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:21:55.119664" elapsed="0.005889">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:21:55.125828" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:55.125596" elapsed="0.000315"/>
</branch>
<status status="FAIL" start="2026-10-16T01:21:55.119641" elapsed="0.006303">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:21:55.126482" elapsed="0.000034"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:21:55.126648" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:55.126603" elapsed="0.000121"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:21:55.126582" elapsed="0.000173"/>
</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-10-16T01:21:55.126946" elapsed="0.000082"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:21:55.127113" 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-10-16T01:21:55.117392" elapsed="0.009861">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:21:55.127327" 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-10-16T01:21:55.115193" elapsed="0.012249">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:21:55.127766" elapsed="0.000032"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:21:55.113225" elapsed="0.014639">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:21:55.113021" elapsed="0.014917">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:21:55.108532" elapsed="0.019521">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:21:56.137888" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:21:56.136987" elapsed="0.000968"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:21:56.139002" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:21:56.138331" elapsed="0.000733"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:21:56.139190" elapsed="0.000074"/>
</return>
<msg time="2026-10-16T01:21:56.139501" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:21:56.136139" elapsed="0.003413"/>
</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-10-16T01:21:56.145834" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:21:56.145192" elapsed="0.000699"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:21:56.146124" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:21:56.146406" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:21:56.144419" elapsed="0.002037"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:56.149172" 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-10-16T01:21:56.148579" elapsed="0.000690"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:56.154133" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:21:56.149683" elapsed="0.004549"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:21:56.161345" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:21:56.161460" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:21:56.161694" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:21:56.154937" elapsed="0.007588">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:21:56.154379" elapsed="0.008449">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:21:56.163299" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:56.162917" elapsed="0.000514"/>
</branch>
<status status="FAIL" start="2026-10-16T01:21:56.154338" elapsed="0.009143">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:21:56.164279" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:21:56.164544" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:56.164471" elapsed="0.000158"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:21:56.164437" 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-10-16T01:21:56.165012" elapsed="0.000044"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:21:56.165179" elapsed="0.000031"/>
</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-10-16T01:21:56.147180" elapsed="0.018213">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:21:56.165511" elapsed="0.000031"/>
</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-10-16T01:21:56.143454" elapsed="0.022273">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:21:56.166208" elapsed="0.000049"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:21:56.140218" elapsed="0.026146">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:21:56.139664" elapsed="0.026813">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:21:56.134690" elapsed="0.031968">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:21:57.176585" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:21:57.175582" elapsed="0.001069"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:21:57.177746" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:21:57.177063" elapsed="0.000740"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:21:57.177899" elapsed="0.000077"/>
</return>
<msg time="2026-10-16T01:21:57.178236" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:21:57.174678" elapsed="0.003609"/>
</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-10-16T01:21:57.184348" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:21:57.183685" elapsed="0.000720"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:21:57.184499" elapsed="0.000056"/>
</return>
<msg time="2026-10-16T01:21:57.184802" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:21:57.182935" elapsed="0.001920"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:57.187517" 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-10-16T01:21:57.186979" elapsed="0.000633"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:57.188570" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:21:57.188058" elapsed="0.000605"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:21:57.196165" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:21:57.196388" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:21:57.196605" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:21:57.189369" elapsed="0.008050">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:21:57.188837" elapsed="0.008748">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:21:57.198062" elapsed="0.000085"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:57.197657" elapsed="0.000594"/>
</branch>
<status status="FAIL" start="2026-10-16T01:21:57.188796" elapsed="0.009515">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:21:57.199090" elapsed="0.000076"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:21:57.199384" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:57.199309" elapsed="0.000164"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:21:57.199274" elapsed="0.000245"/>
</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-10-16T01:21:57.199858" elapsed="0.000046"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:21:57.200001" elapsed="0.000031"/>
</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-10-16T01:21:57.185539" elapsed="0.014697">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:21:57.200359" 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-10-16T01:21:57.181958" elapsed="0.018591">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:21:57.201066" elapsed="0.000082"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:21:57.178653" elapsed="0.022604">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:21:57.178401" elapsed="0.022972">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:21:57.173380" elapsed="0.028175">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:21:58.211395" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:21:58.210491" elapsed="0.000970"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:21:58.212489" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:21:58.211845" elapsed="0.000699"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:21:58.212640" elapsed="0.000105"/>
</return>
<msg time="2026-10-16T01:21:58.212984" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:21:58.209616" elapsed="0.003419"/>
</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-10-16T01:21:58.218996" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:21:58.218350" elapsed="0.000708"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:21:58.219300" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:21:58.219582" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:21:58.217586" elapsed="0.002048"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:58.222344" 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-10-16T01:21:58.221796" elapsed="0.000644"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:58.223403" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:21:58.222886" elapsed="0.000607"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:21:58.229753" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:21:58.229870" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:21:58.230082" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:21:58.224206" elapsed="0.006695">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:21:58.223635" elapsed="0.007430">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:21:58.231939" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:58.231159" elapsed="0.000919"/>
</branch>
<status status="FAIL" start="2026-10-16T01:21:58.223596" elapsed="0.008557">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:21:58.232928" elapsed="0.000062"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:21:58.233263" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:58.233182" elapsed="0.000167"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:21:58.233139" elapsed="0.000256"/>
</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-10-16T01:21:58.233731" elapsed="0.000048"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:21:58.233876" elapsed="0.000031"/>
</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-10-16T01:21:58.220358" elapsed="0.013732">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:21:58.234233" 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-10-16T01:21:58.216583" elapsed="0.017846">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:21:58.234924" elapsed="0.000056"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:21:58.213424" elapsed="0.021679">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:21:58.213169" elapsed="0.022099">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:21:58.208320" elapsed="0.027147">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:21:59.245220" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:21:59.244322" elapsed="0.001071"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:21:59.246438" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:21:59.245781" elapsed="0.000714"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:21:59.246591" elapsed="0.000105"/>
</return>
<msg time="2026-10-16T01:21:59.247000" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:21:59.243442" elapsed="0.003612"/>
</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-10-16T01:21:59.253489" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:21:59.252738" elapsed="0.000809"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:21:59.253644" elapsed="0.000088"/>
</return>
<msg time="2026-10-16T01:21:59.253957" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:21:59.251683" elapsed="0.002328"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:59.256737" 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-10-16T01:21:59.256194" elapsed="0.000641"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:21:59.258100" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:21:59.257553" elapsed="0.000670"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:21:59.264698" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:21:59.264854" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:21:59.265066" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:21:59.258911" elapsed="0.006960">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:21:59.258367" elapsed="0.007668">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:21:59.266484" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:21:59.266109" elapsed="0.000509"/>
</branch>
<status status="FAIL" start="2026-10-16T01:21:59.258328" elapsed="0.008341">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:21:59.267926" elapsed="0.000056"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:21:59.268229" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:21:59.268149" elapsed="0.000168"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:21:59.268090" elapsed="0.000274"/>
</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-10-16T01:21:59.268673" elapsed="0.000078"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:21:59.268851" 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-10-16T01:21:59.254741" elapsed="0.014327">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:21:59.269222" 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-10-16T01:21:59.250724" elapsed="0.018698">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:21:59.270000" elapsed="0.000052"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:21:59.247442" elapsed="0.022748">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:21:59.247191" elapsed="0.023121">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:21:59.242191" elapsed="0.028309">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:22:00.280293" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:00.279399" elapsed="0.000961"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:00.281429" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:00.280739" elapsed="0.000748"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:00.281584" elapsed="0.000072"/>
</return>
<msg time="2026-10-16T01:22:00.281926" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:00.278522" elapsed="0.003458"/>
</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-10-16T01:22:00.288046" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:22:00.287400" elapsed="0.000711"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:22:00.288252" elapsed="0.000060"/>
</return>
<msg time="2026-10-16T01:22:00.288527" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:22:00.286626" elapsed="0.001951"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:00.291527" 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-10-16T01:22:00.290875" elapsed="0.000753"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:00.292621" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:00.292094" elapsed="0.000650"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:22:00.299549" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:22:00.299693" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:22:00.300012" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:22:00.293481" elapsed="0.007570">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:00.292889" elapsed="0.008367">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:22:00.301671" elapsed="0.000077"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:00.301329" elapsed="0.000508"/>
</branch>
<status status="FAIL" start="2026-10-16T01:22:00.292850" elapsed="0.009036">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:22:00.302668" elapsed="0.000083"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:00.303075" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:00.302998" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:00.302960" elapsed="0.000274"/>
</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-10-16T01:22:00.303551" elapsed="0.000045"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:22:00.303695" elapsed="0.000062"/>
</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-10-16T01:22:00.289342" elapsed="0.014602">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:00.304066" 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-10-16T01:22:00.285647" elapsed="0.018637">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:22:00.305213" elapsed="0.000054"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:22:00.282370" elapsed="0.023010">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:22:00.282091" elapsed="0.023406">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:22:00.277266" elapsed="0.028419">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<msg time="2026-10-16T01:22:00.305914" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<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="FAIL" start="2026-10-16T01:21:55.101414" elapsed="5.204696">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${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="NOT RUN" start="2026-10-16T01:22:00.306632" elapsed="0.000045"/>
</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="FAIL" start="2026-10-16T01:21:54.621038" elapsed="5.685872">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<doc>Add port with OVS command and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-10-16T01:21:54.222750" elapsed="6.084470">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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-10-16T01:22:00.310383" elapsed="0.000494"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:22:00.309803" elapsed="0.001189"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:00.313210" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:00.312986" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:00.312947" elapsed="0.000409"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:00.317734" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:00.317517" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:00.317481" elapsed="0.000401"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:00.319995" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:00.319193" elapsed="0.000861"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:00.321096" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:00.320449" elapsed="0.000730"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:00.321274" elapsed="0.000059"/>
</return>
<msg time="2026-10-16T01:22:00.321560" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:00.318355" elapsed="0.003327"/>
</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-10-16T01:22:00.326760" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:00.326620" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:00.326595" 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-10-16T01:22:00.328510" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:00.328392" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:00.328368" elapsed="0.000230"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:00.329184" level="INFO">${karaf_connection_index} = 386</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:22:00.328825" elapsed="0.000404"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:00.329788" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:00.329505" elapsed="0.000318"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:00.362528" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:00.330638" elapsed="0.032162"/>
</kw>
<msg time="2026-10-16T01:22:00.363020" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:00.363078" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:00.330039" elapsed="0.033110"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:00.419724" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:00.363993" elapsed="0.055954"/>
</kw>
<msg time="2026-10-16T01:22:00.420148" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:00.420194" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:00.363381" elapsed="0.056849"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:00.420579" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:00.420323" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:00.420296" elapsed="0.000385"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:00.421299" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:00.420897" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:00.421661" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:00.421455" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:00.421438" elapsed="0.000340"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:00.421813" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:00.424553" 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-10-16T01:22:00.426325" elapsed="0.000500"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:00.428030" 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-10-16T01:22:00.422740" elapsed="0.005684"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:00.422158" elapsed="0.006384"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:00.327953" elapsed="0.100667"/>
</kw>
<msg time="2026-10-16T01:22:00.428896" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:00.428995" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:00.327059" elapsed="0.101974"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:00.429207" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:22:00.429105" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:00.429087" elapsed="0.000200"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:00.429616" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:00.429940" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:00.430005" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:22:00.326154" elapsed="0.103938"/>
</kw>
<msg time="2026-10-16T01:22:00.430196" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:00.430237" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:00.322482" elapsed="0.107790"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:00.430561" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:00.430343" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:00.430327" elapsed="0.000305"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:22:00.322171" elapsed="0.108483"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:00.433384" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:00.433300" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:00.433282" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:00.434547" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:00.434464" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:00.434447" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:00.435009" level="INFO">${karaf_connection_index} = 388</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:22:00.434781" elapsed="0.000253"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:00.435394" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:00.435214" elapsed="0.000205"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:00.470383" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:00.436006" elapsed="0.034553"/>
</kw>
<msg time="2026-10-16T01:22:00.470734" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:00.470777" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:00.435572" elapsed="0.035240"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:00.533819" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:00.471418" elapsed="0.062575"/>
</kw>
<msg time="2026-10-16T01:22:00.534163" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:00.534205" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:00.470975" elapsed="0.063266"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:00.534522" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:00.534320" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:00.534302" elapsed="0.000314"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:00.535178" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:00.534822" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:00.535553" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:00.535352" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:00.535336" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:00.535679" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:00.538254" 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-10-16T01:22:00.539994" elapsed="0.000471"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:00.541669" elapsed="0.000550"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:22:00.536481" elapsed="0.005804"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:00.535972" elapsed="0.006432"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:00.434209" elapsed="0.108272"/>
</kw>
<msg time="2026-10-16T01:22:00.542562" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:00.542601" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:00.433593" elapsed="0.109043"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:00.542806" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:22:00.542720" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:00.542687" elapsed="0.000195"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:00.543208" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:00.543501" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:00.543565" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:22:00.432977" elapsed="0.110671"/>
</kw>
<msg time="2026-10-16T01:22:00.543822" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:00.543863" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:00.431038" elapsed="0.112860"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:00.544197" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:00.543966" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:00.543950" elapsed="0.000320"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:22:00.430899" elapsed="0.113393"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:00.546828" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:00.546740" elapsed="0.000133"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:00.546720" elapsed="0.000184"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:00.548027" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:00.547942" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:00.547925" elapsed="0.000167"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:00.548480" 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-10-16T01:22:00.548255" elapsed="0.000250"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:00.548857" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:00.548665" elapsed="0.000216"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:00.581873" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:00.549501" elapsed="0.032543"/>
</kw>
<msg time="2026-10-16T01:22:00.582235" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:00.582276" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:00.549033" elapsed="0.033279"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:00.640672" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:00.582908" elapsed="0.058388"/>
</kw>
<msg time="2026-10-16T01:22:00.641793" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:00.641895" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:00.582473" elapsed="0.059502"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:00.642890" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:00.642227" elapsed="0.000835"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:00.642156" elapsed="0.000969"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:00.644560" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:00.643571" elapsed="0.001219"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:00.645409" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:00.644931" elapsed="0.000639"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:00.644893" elapsed="0.000731"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:00.645755" elapsed="0.000079"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:00.650807" elapsed="0.000752"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:22:00.653380" elapsed="0.000713"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:00.656179" 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-10-16T01:22:00.647820" elapsed="0.008915"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:00.646498" elapsed="0.010408"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:00.547662" elapsed="0.109356"/>
</kw>
<msg time="2026-10-16T01:22:00.657161" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:00.657220" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:00.547063" elapsed="0.110207"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:00.657489" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-10-16T01:22:00.657369" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:00.657345" 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-10-16T01:22:00.658199" elapsed="0.000034"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:00.658638" elapsed="0.000031"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:00.658750" 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-10-16T01:22:00.546420" elapsed="0.112454"/>
</kw>
<msg time="2026-10-16T01:22:00.658998" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:00.659056" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:00.544534" elapsed="0.114665"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:00.659618" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:00.659305" elapsed="0.000382"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:00.659282" elapsed="0.000518"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:22:00.544400" elapsed="0.115434"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:22:00.321827" elapsed="0.338071"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:22:00.316781" elapsed="0.343201"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:22:00.312381" elapsed="0.347679"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:00.311408" elapsed="0.348714"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:22:00.308984" elapsed="0.351234"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:00.664015" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:00.663662" elapsed="0.000427"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:00.663636" elapsed="0.000485"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:00.664611" 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-10-16T01:22:00.664764" 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-10-16T01:22:00.664422" elapsed="0.000378"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:00.665686" level="INFO">Attempting to execute command "ip tuntap add mode tap vport1" on remote system "10.30.171.104" 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-10-16T01:22:00.665277" elapsed="0.000499"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:00.666483" level="INFO">${conn_id} = 427</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-10-16T01:22:00.666024" elapsed="0.000494"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:22:00.667732" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:22:00.667832" 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-10-16T01:22:00.667343" elapsed="0.000520"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:00.668067" elapsed="0.000417"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:22:00.669639" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:22:01.070335" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:21:48 UTC 2026

  System load:  0.12               Processes:             106
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:21:54 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:22:00.669313" elapsed="0.401186"/>
</kw>
<msg time="2026-10-16T01:22:01.070583" 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-10-16T01:22:00.668728" elapsed="0.401940"/>
</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-10-16T01:22:00.666811" elapsed="0.403993"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:22:01.071380" level="INFO">Executing command 'ip tuntap add mode tap vport1'.</msg>
<msg time="2026-10-16T01:22:01.085125" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-10-16T01:22:01.085500" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:22:01.085589" 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-10-16T01:22:01.071109" elapsed="0.014697"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:01.086314" elapsed="0.000565"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:01.088087" 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-10-16T01:22:01.087441" elapsed="0.000770"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:22:01.088621" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:01.088375" elapsed="0.000385"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:01.088327" elapsed="0.000487"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:22:01.089107" elapsed="0.000096"/>
</return>
<status status="PASS" start="2026-10-16T01:22:01.088927" elapsed="0.000349"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:01.088895" elapsed="0.000432"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:22:01.089398" elapsed="0.000028"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:01.091087" elapsed="0.000743"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:22:01.092325" elapsed="0.000339"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:01.093065" elapsed="0.000230"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:22:01.090101" elapsed="0.003305"/>
</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-10-16T01:22:00.662680" elapsed="0.430885"/>
</kw>
<msg time="2026-10-16T01:22:01.093672" 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-10-16T01:22:00.661939" elapsed="0.431875"/>
</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-10-16T01:22:00.661024" elapsed="0.432951"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:01.099501" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:01.098934" elapsed="0.000686"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:01.098894" elapsed="0.000783"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:01.100451" 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-10-16T01:22:01.100655" 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-10-16T01:22:01.100170" elapsed="0.000571"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:01.101888" level="INFO">Attempting to execute command "ip tuntap add mode tap vport2" on remote system "10.30.171.104" 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-10-16T01:22:01.101197" elapsed="0.000785"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:01.103085" level="INFO">${conn_id} = 429</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-10-16T01:22:01.102400" elapsed="0.000760"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:22:01.105030" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:22:01.105214" 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-10-16T01:22:01.104446" elapsed="0.000818"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:01.105592" elapsed="0.000695"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:22:01.108053" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:22:01.514932" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:21:48 UTC 2026

  System load:  0.12               Processes:             106
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:22:00 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:22:01.107511" elapsed="0.407759"/>
</kw>
<msg time="2026-10-16T01:22:01.515380" 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-10-16T01:22:01.106645" elapsed="0.408842"/>
</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-10-16T01:22:01.103587" elapsed="0.412034"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:22:01.516361" level="INFO">Executing command 'ip tuntap add mode tap vport2'.</msg>
<msg time="2026-10-16T01:22:01.530129" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-10-16T01:22:01.530337" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:22:01.530391" 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-10-16T01:22:01.516027" elapsed="0.014394"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:01.530728" elapsed="0.000351"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:01.531870" 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-10-16T01:22:01.531447" elapsed="0.000479"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:22:01.532233" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:01.532041" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:01.532003" elapsed="0.000331"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:22:01.532511" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-10-16T01:22:01.532402" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:01.532383" elapsed="0.000241"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:22:01.532673" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:01.533725" elapsed="0.000392"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:22:01.534384" elapsed="0.000201"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:01.534790" elapsed="0.000398"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:22:01.533114" elapsed="0.002143"/>
</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-10-16T01:22:01.097863" elapsed="0.437489"/>
</kw>
<msg time="2026-10-16T01:22:01.535420" 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-10-16T01:22:01.095443" elapsed="0.440041"/>
</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-10-16T01:22:01.094447" elapsed="0.441133"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:01.538052" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:01.537731" elapsed="0.000390"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:01.537689" elapsed="0.000483"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:01.538636" 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-10-16T01:22:01.538784" 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-10-16T01:22:01.538455" elapsed="0.000367"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:01.539509" level="INFO">Attempting to execute command "ifconfig vport1 up" on remote system "10.30.171.104" 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-10-16T01:22:01.539107" elapsed="0.000455"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:01.540227" 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-10-16T01:22:01.539818" elapsed="0.000443"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:22:01.541441" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:22:01.541542" 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-10-16T01:22:01.541058" elapsed="0.000517"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:01.541859" elapsed="0.000389"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:22:01.543334" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:22:01.940088" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:21:48 UTC 2026

  System load:  0.12               Processes:             106
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:22:01 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:22:01.542996" elapsed="0.397257"/>
</kw>
<msg time="2026-10-16T01:22:01.940333" 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-10-16T01:22:01.542465" elapsed="0.397949"/>
</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-10-16T01:22:01.540534" elapsed="0.399987"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:22:01.941042" level="INFO">Executing command 'ifconfig vport1 up'.</msg>
<msg time="2026-10-16T01:22:01.954851" level="INFO">Command exited with return code 255.</msg>
<msg time="2026-10-16T01:22:01.955063" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:22:01.955139" 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-10-16T01:22:01.940815" elapsed="0.014381"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:01.955434" elapsed="0.000610"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:01.956844" 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-10-16T01:22:01.956415" elapsed="0.000493"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:22:01.957206" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:01.957018" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:01.956986" elapsed="0.000327"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:22:01.957504" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-10-16T01:22:01.957385" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:01.957366" elapsed="0.000251"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:22:01.957663" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:01.958787" 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-10-16T01:22:01.959506" elapsed="0.000252"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:01.959965" elapsed="0.000129"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:22:01.958139" elapsed="0.002040"/>
</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-10-16T01:22:01.537157" elapsed="0.423122"/>
</kw>
<msg time="2026-10-16T01:22:01.960347" 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-10-16T01:22:01.536414" elapsed="0.423999"/>
</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-10-16T01:22:01.535843" elapsed="0.424671"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:01.963238" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:01.962879" elapsed="0.000436"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:01.962853" elapsed="0.000496"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:01.963833" 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-10-16T01:22:01.964041" 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-10-16T01:22:01.963628" elapsed="0.000449"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:01.964821" level="INFO">Attempting to execute command "ifconfig vport2 up" on remote system "10.30.171.104" 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-10-16T01:22:01.964374" elapsed="0.000510"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:01.965594" 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-10-16T01:22:01.965158" elapsed="0.000472"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:22:01.966868" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:22:01.966971" 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-10-16T01:22:01.966481" elapsed="0.000524"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:01.967240" elapsed="0.000420"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:22:01.968834" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:22:02.386312" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:21:48 UTC 2026

  System load:  0.12               Processes:             106
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:22:01 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:22:01.968471" elapsed="0.417931"/>
</kw>
<msg time="2026-10-16T01:22:02.386463" 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-10-16T01:22:01.967920" elapsed="0.418599"/>
</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-10-16T01:22:01.965935" elapsed="0.420668"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:22:02.387009" level="INFO">Executing command 'ifconfig vport2 up'.</msg>
<msg time="2026-10-16T01:22:02.400091" level="INFO">Command exited with return code 255.</msg>
<msg time="2026-10-16T01:22:02.400250" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:22:02.400305" 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-10-16T01:22:02.386830" elapsed="0.013506"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:02.400554" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:02.401502" 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-10-16T01:22:02.401169" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:22:02.401814" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:02.401653" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:02.401626" elapsed="0.000282"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:22:02.402089" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-10-16T01:22:02.401975" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:02.401956" elapsed="0.000256"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:22:02.402255" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:02.403244" elapsed="0.000392"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:22:02.403915" elapsed="0.000193"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:02.404322" 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-10-16T01:22:02.402649" elapsed="0.001862"/>
</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-10-16T01:22:01.962236" elapsed="0.442370"/>
</kw>
<msg time="2026-10-16T01:22:02.404756" 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-10-16T01:22:01.961440" elapsed="0.443383"/>
</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-10-16T01:22:01.960792" elapsed="0.444132"/>
</kw>
<doc>Create Tap Device vport1 and vport2 to add to the bridge br-s1 using OVS command.</doc>
<status status="PASS" start="2026-10-16T01:22:00.660546" elapsed="1.744451"/>
</kw>
<doc>Create tap devices to add to the bridge in ovs</doc>
<status status="PASS" start="2026-10-16T01:22:00.307907" elapsed="2.097234"/>
</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-10-16T01:22:02.407051" elapsed="0.000314"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:22:02.406651" elapsed="0.000783"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:02.408733" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:02.408590" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:02.408564" elapsed="0.000262"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:02.411620" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:02.411504" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:02.411480" elapsed="0.000249"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:02.413005" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:02.412526" elapsed="0.000513"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:02.413639" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:02.413263" elapsed="0.000409"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:02.413751" elapsed="0.000036"/>
</return>
<msg time="2026-10-16T01:22:02.413929" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:02.412016" elapsed="0.001945"/>
</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-10-16T01:22:02.458336" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:02.458218" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:02.458127" 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-10-16T01:22:02.459724" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:02.459613" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:02.459596" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:02.460201" level="INFO">${karaf_connection_index} = 386</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:22:02.459934" elapsed="0.000294"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:02.460571" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:02.460390" elapsed="0.000205"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:02.493516" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:02.461201" elapsed="0.032495"/>
</kw>
<msg time="2026-10-16T01:22:02.493881" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:02.493922" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:02.460763" elapsed="0.033194"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:02.566142" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:02.494581" elapsed="0.071757"/>
</kw>
<msg time="2026-10-16T01:22:02.566496" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:02.566537" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:02.494135" elapsed="0.072435"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:02.566942" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:02.566731" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:02.566685" elapsed="0.000354"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:02.567584" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:02.567240" elapsed="0.000423"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:02.567938" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:02.567742" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:02.567724" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:02.568061" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:02.570564" 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-10-16T01:22:02.572328" elapsed="0.000480"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:02.573990" 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-10-16T01:22:02.568889" elapsed="0.005496"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:02.568374" elapsed="0.006132"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:02.459352" elapsed="0.115230"/>
</kw>
<msg time="2026-10-16T01:22:02.574664" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:02.574732" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:02.458599" elapsed="0.116169"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:02.574922" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:22:02.574838" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:02.574821" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:02.575334" 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-10-16T01:22:02.575630" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:02.575733" 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-10-16T01:22:02.457729" elapsed="0.118095"/>
</kw>
<msg time="2026-10-16T01:22:02.575908" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:02.575947" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:02.414459" elapsed="0.161521"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:02.576280" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:02.576047" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:02.576031" elapsed="0.000322"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:22:02.414262" elapsed="0.162113"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:02.578987" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:02.578903" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:02.578886" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:02.580378" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:02.580294" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:02.580277" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:02.580865" level="INFO">${karaf_connection_index} = 388</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:22:02.580613" elapsed="0.000277"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:02.581237" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:02.581048" elapsed="0.000214"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:02.617277" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:02.581838" elapsed="0.035608"/>
</kw>
<msg time="2026-10-16T01:22:02.617632" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:02.617673" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:02.581414" elapsed="0.036309"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:02.712499" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:02.618318" elapsed="0.094558"/>
</kw>
<msg time="2026-10-16T01:22:02.713134" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:02.713193" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:02.617886" elapsed="0.095343"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:02.713740" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:02.713367" elapsed="0.000468"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:02.713320" elapsed="0.000548"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:02.714553" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:02.714064" elapsed="0.000577"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:02.714929" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:02.714727" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:02.714686" elapsed="0.000338"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:02.715063" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:02.717948" 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-10-16T01:22:02.719789" elapsed="0.000506"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:02.721517" elapsed="0.000543"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:22:02.716065" elapsed="0.006064"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:02.715453" elapsed="0.006812"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:02.580007" elapsed="0.142341"/>
</kw>
<msg time="2026-10-16T01:22:02.722437" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:02.722478" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:02.579212" elapsed="0.143302"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:02.722675" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-10-16T01:22:02.722587" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:02.722570" 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 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-10-16T01:22:02.723126" 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-10-16T01:22:02.723528" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:02.723593" 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-10-16T01:22:02.578584" elapsed="0.145099"/>
</kw>
<msg time="2026-10-16T01:22:02.723864" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:02.723906" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:02.576627" elapsed="0.147314"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:02.724247" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:02.724012" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:02.723996" elapsed="0.000325"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:22:02.576491" elapsed="0.147852"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:02.727063" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:02.726976" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:02.726958" elapsed="0.000168"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:02.728283" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:02.728197" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:02.728143" elapsed="0.000203"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:02.728744" 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-10-16T01:22:02.728489" elapsed="0.000280"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:02.729116" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:02.728930" elapsed="0.000210"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:02.764265" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:02.729770" elapsed="0.034695"/>
</kw>
<msg time="2026-10-16T01:22:02.764643" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:02.764684" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:02.729309" elapsed="0.035426"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:02.845093" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:02.765417" elapsed="0.079891"/>
</kw>
<msg time="2026-10-16T01:22:02.845466" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:02.845507" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:02.764925" elapsed="0.080616"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:02.845870" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:02.845624" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:02.845600" elapsed="0.000368"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:02.846520" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:02.846171" elapsed="0.000433"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:02.846885" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:02.846665" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:02.846648" elapsed="0.000331"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:02.847012" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:02.849729" 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-10-16T01:22:02.851554" elapsed="0.000556"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:02.853335" 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-10-16T01:22:02.847941" elapsed="0.005956"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:02.847338" elapsed="0.006680"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:02.727902" elapsed="0.126196"/>
</kw>
<msg time="2026-10-16T01:22:02.854198" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:02.854239" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:02.727292" elapsed="0.126981"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:02.854431" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:22:02.854345" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:02.854328" elapsed="0.000183"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:02.854862" 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-10-16T01:22:02.855330" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:02.855396" 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-10-16T01:22:02.726650" elapsed="0.128834"/>
</kw>
<msg time="2026-10-16T01:22:02.855571" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:02.855611" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:02.724617" elapsed="0.131028"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:02.856075" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:02.855852" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:02.855832" elapsed="0.000315"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:22:02.724476" elapsed="0.131710"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:22:02.414034" elapsed="0.442186"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:22:02.411080" elapsed="0.445200"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:22:02.408227" elapsed="0.448111"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:02.407637" elapsed="0.448746"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:22:02.406183" elapsed="0.450253"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:02.860140" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:02.859908" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:02.859891" elapsed="0.000363"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:02.860582" 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-10-16T01:22:02.860674" 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-10-16T01:22:02.860447" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:02.861217" 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.104" 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-10-16T01:22:02.860905" elapsed="0.000357"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:02.861837" level="INFO">${conn_id} = 438</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-10-16T01:22:02.861511" elapsed="0.000351"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:22:02.862688" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:22:02.862774" 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-10-16T01:22:02.862424" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:02.862943" elapsed="0.000301"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:22:02.864021" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:22:03.246385" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:21:48 UTC 2026

  System load:  0.12               Processes:             106
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:22:02 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:22:02.863787" elapsed="0.382776"/>
</kw>
<msg time="2026-10-16T01:22:03.246651" 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-10-16T01:22:02.863406" elapsed="0.383352"/>
</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-10-16T01:22:02.862054" elapsed="0.384827"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:22:03.247479" level="INFO">Executing command 'sudo ovs-vsctl add-port br-s1 vport1 -- add-port br-s1 vport2'.</msg>
<msg time="2026-10-16T01:22:03.291900" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:22:03.292145" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:22:03.292261" 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-10-16T01:22:03.247211" elapsed="0.045103"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:03.292658" elapsed="0.000477"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:03.294313" 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-10-16T01:22:03.293671" 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-10-16T01:22:03.294856" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:03.294574" elapsed="0.000389"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:03.294526" 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-10-16T01:22:03.295356" elapsed="0.000061"/>
</return>
<status status="PASS" start="2026-10-16T01:22:03.295125" elapsed="0.000367"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:03.295095" elapsed="0.000446"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:22:03.295609" elapsed="0.000028"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:03.297291" elapsed="0.000681"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:22:03.298402" elapsed="0.000359"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:03.299075" elapsed="0.000225"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:22:03.296327" elapsed="0.003083"/>
</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-10-16T01:22:02.859476" elapsed="0.440084"/>
</kw>
<msg time="2026-10-16T01:22:03.299661" 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-10-16T01:22:02.858950" elapsed="0.440942"/>
</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-10-16T01:22:02.858518" elapsed="0.441540"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:22:03.301361" 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-10-16T01:22:03.300575" elapsed="0.000842"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:22:03.302555" 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-10-16T01:22:03.301877" elapsed="0.000733"/>
</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-10-16T01:22:03.312740" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:03.311992" elapsed="0.000784"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:03.313383" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:03.312986" elapsed="0.000430"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:03.313474" elapsed="0.000037"/>
</return>
<msg time="2026-10-16T01:22:03.313651" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:03.311070" elapsed="0.002614"/>
</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-10-16T01:22:03.317483" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:22:03.317061" elapsed="0.000457"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:22:03.317576" elapsed="0.000035"/>
</return>
<msg time="2026-10-16T01:22:03.317792" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:22:03.316596" elapsed="0.001230"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:03.319470" 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-10-16T01:22:03.319138" elapsed="0.000390"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:03.320113" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:03.319811" elapsed="0.000376"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:22:03.325844" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:22:03.325918" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:22:03.326087" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:22:03.320585" elapsed="0.006054">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:03.320271" elapsed="0.006499">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:22:03.327025" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:03.326815" elapsed="0.000299"/>
</branch>
<status status="FAIL" start="2026-10-16T01:22:03.320248" elapsed="0.006897">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:22:03.327642" elapsed="0.000032"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:03.327877" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:03.327786" elapsed="0.000149"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:03.327763" 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-10-16T01:22:03.328176" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:22:03.328267" elapsed="0.000019"/>
</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-10-16T01:22:03.318277" elapsed="0.010128">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:03.328480" 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-10-16T01:22:03.316003" elapsed="0.012594">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:22:03.328908" elapsed="0.000031"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:22:03.313962" elapsed="0.015044">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:22:03.313788" elapsed="0.015293">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:22:03.309962" elapsed="0.019251">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:22:04.338959" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:04.338063" elapsed="0.000963"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:04.340056" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:04.339403" elapsed="0.000708"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:04.340232" elapsed="0.000075"/>
</return>
<msg time="2026-10-16T01:22:04.340545" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:04.337196" elapsed="0.003400"/>
</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-10-16T01:22:04.346573" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:22:04.345945" elapsed="0.000683"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:22:04.346751" elapsed="0.000059"/>
</return>
<msg time="2026-10-16T01:22:04.347025" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:22:04.345207" elapsed="0.001869"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:04.349731" 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-10-16T01:22:04.349202" elapsed="0.000627"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:04.350779" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:04.350264" elapsed="0.000605"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:22:04.357932" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:22:04.358047" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:22:04.358284" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:22:04.351545" elapsed="0.007544">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:04.351014" elapsed="0.008378">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:22:04.359840" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:04.359467" elapsed="0.000507"/>
</branch>
<status status="FAIL" start="2026-10-16T01:22:04.350973" elapsed="0.009052">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:22:04.360817" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:04.361084" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:04.361010" elapsed="0.000180"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:04.360975" elapsed="0.000263"/>
</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-10-16T01:22:04.361544" elapsed="0.000043"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:22:04.361684" elapsed="0.000060"/>
</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-10-16T01:22:04.347794" elapsed="0.014135">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:04.362050" elapsed="0.000031"/>
</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-10-16T01:22:04.344235" elapsed="0.018029">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:22:04.362758" elapsed="0.000051"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:22:04.341001" elapsed="0.021914">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:22:04.340741" elapsed="0.022290">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:22:04.335908" elapsed="0.027393">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:22:05.372974" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:05.372073" elapsed="0.000970"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:05.374074" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:05.373417" elapsed="0.000714"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:05.374250" elapsed="0.000074"/>
</return>
<msg time="2026-10-16T01:22:05.374562" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:05.371228" elapsed="0.003385"/>
</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-10-16T01:22:05.380508" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:22:05.379879" elapsed="0.000686"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:22:05.380658" elapsed="0.000088"/>
</return>
<msg time="2026-10-16T01:22:05.380962" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:22:05.379114" elapsed="0.001898"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:05.383687" 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-10-16T01:22:05.383154" elapsed="0.000661"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:05.384797" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:05.384275" 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-10-16T01:22:05.391663" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:22:05.391812" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:22:05.392028" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:22:05.385676" elapsed="0.007357">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:05.385138" elapsed="0.008087">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:22:05.393673" elapsed="0.000080"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:05.393300" elapsed="0.000543"/>
</branch>
<status status="FAIL" start="2026-10-16T01:22:05.385095" elapsed="0.008800">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:22:05.394659" elapsed="0.000082"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:05.394963" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:05.394887" elapsed="0.000162"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:05.394852" elapsed="0.000245"/>
</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-10-16T01:22:05.395426" elapsed="0.000045"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:22:05.395569" elapsed="0.000031"/>
</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-10-16T01:22:05.381757" elapsed="0.014057">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:05.395936" 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-10-16T01:22:05.378154" elapsed="0.017973">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:22:05.396610" elapsed="0.000049"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:22:05.375016" elapsed="0.021779">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:22:05.374758" elapsed="0.022151">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:22:05.369930" elapsed="0.027162">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:22:06.406860" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:06.405981" elapsed="0.000944"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:06.407934" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:06.407295" elapsed="0.000694"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:06.408085" elapsed="0.000069"/>
</return>
<msg time="2026-10-16T01:22:06.408404" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:06.405125" elapsed="0.003330"/>
</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-10-16T01:22:06.414401" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:22:06.413788" elapsed="0.000668"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:22:06.414549" elapsed="0.000057"/>
</return>
<msg time="2026-10-16T01:22:06.414845" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:22:06.413040" elapsed="0.001855"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:06.417498" 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-10-16T01:22:06.416984" elapsed="0.000632"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:06.418608" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:06.418086" elapsed="0.000611"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:22:06.425441" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:22:06.425553" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:22:06.425793" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:22:06.419391" elapsed="0.007184">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:06.418869" elapsed="0.007901">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:22:06.427207" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:06.426845" elapsed="0.000498"/>
</branch>
<status status="FAIL" start="2026-10-16T01:22:06.418830" elapsed="0.008562">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:22:06.428172" elapsed="0.000071"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:06.428460" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:06.428386" elapsed="0.000160"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:06.428351" 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-10-16T01:22:06.428933" elapsed="0.000044"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:22:06.429115" 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-10-16T01:22:06.415566" elapsed="0.013814">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:06.429503" elapsed="0.000031"/>
</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-10-16T01:22:06.412089" elapsed="0.017655">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:22:06.430228" elapsed="0.000050"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:22:06.408953" elapsed="0.021431">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:22:06.408670" elapsed="0.021830">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:22:06.403871" elapsed="0.026813">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:22:07.441023" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:07.440139" elapsed="0.000950"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:07.442115" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:07.441461" elapsed="0.000709"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:07.442291" elapsed="0.000072"/>
</return>
<msg time="2026-10-16T01:22:07.442595" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:07.439289" elapsed="0.003360"/>
</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-10-16T01:22:07.448646" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:22:07.448011" elapsed="0.000850"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:22:07.448971" elapsed="0.000059"/>
</return>
<msg time="2026-10-16T01:22:07.449277" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:22:07.447267" elapsed="0.002064"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:07.452030" 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-10-16T01:22:07.451483" elapsed="0.000643"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:07.453142" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:07.452571" elapsed="0.000689"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:22:07.460282" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:22:07.460400" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:22:07.460608" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:22:07.453944" elapsed="0.007480">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:07.453402" elapsed="0.008185">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:22:07.462034" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:07.461659" elapsed="0.000510"/>
</branch>
<status status="FAIL" start="2026-10-16T01:22:07.453363" elapsed="0.008880">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:22:07.463016" elapsed="0.000052"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:07.463308" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:07.463231" elapsed="0.000164"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:07.463174" elapsed="0.000266"/>
</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-10-16T01:22:07.463777" elapsed="0.000051"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:22:07.463924" elapsed="0.000030"/>
</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-10-16T01:22:07.450037" elapsed="0.014099">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:07.464372" elapsed="0.000036"/>
</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-10-16T01:22:07.446295" elapsed="0.018276">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:22:07.465065" elapsed="0.000050"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:22:07.443045" elapsed="0.022203">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:22:07.442793" elapsed="0.022572">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:22:07.437678" elapsed="0.027871">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:22:08.474637" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:08.473817" elapsed="0.000915"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:08.475742" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:08.475077" elapsed="0.000723"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:08.475894" elapsed="0.000064"/>
</return>
<msg time="2026-10-16T01:22:08.476185" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:08.472964" elapsed="0.003298"/>
</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-10-16T01:22:08.482084" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:22:08.481454" elapsed="0.000685"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:22:08.482255" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:22:08.482527" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:22:08.480693" elapsed="0.001885"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:08.485200" 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-10-16T01:22:08.484672" elapsed="0.000644"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:08.486258" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:08.485757" elapsed="0.000595"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:22:08.493100" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:22:08.493233" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:22:08.493439" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:22:08.487017" elapsed="0.007181">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:08.486489" elapsed="0.007900">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:22:08.494826" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:08.494459" elapsed="0.000501"/>
</branch>
<status status="FAIL" start="2026-10-16T01:22:08.486450" elapsed="0.008561">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:22:08.495803" elapsed="0.000132"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:08.496161" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:08.496085" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:08.496048" elapsed="0.000275"/>
</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-10-16T01:22:08.496628" elapsed="0.000044"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:22:08.496803" 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-10-16T01:22:08.483278" elapsed="0.013742">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:08.497142" 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-10-16T01:22:08.479763" elapsed="0.017595">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:22:08.497920" elapsed="0.000054"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:22:08.476614" elapsed="0.021471">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:22:08.476369" elapsed="0.021829">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:22:08.471808" elapsed="0.026605">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<msg time="2026-10-16T01:22:08.498604" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<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="FAIL" start="2026-10-16T01:22:03.303080" elapsed="5.195754">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${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="NOT RUN" start="2026-10-16T01:22:08.499348" elapsed="0.000045"/>
</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="FAIL" start="2026-10-16T01:22:02.858129" elapsed="5.641460">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:22:02.405423" elapsed="6.094471">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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-10-16T01:22:08.503011" elapsed="0.000483"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:22:08.502429" elapsed="0.001177"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:08.505735" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:08.505508" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:08.505467" elapsed="0.000417"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:08.510139" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:08.509952" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:08.509915" elapsed="0.000390"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:08.512403" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:08.511618" elapsed="0.000843"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:08.513451" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:08.512821" elapsed="0.000687"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:08.513675" elapsed="0.000094"/>
</return>
<msg time="2026-10-16T01:22:08.514001" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:08.510812" elapsed="0.003239"/>
</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-10-16T01:22:08.519863" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:08.519640" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:08.519601" elapsed="0.000403"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:08.521787" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:08.521642" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:08.521619" elapsed="0.000257"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:08.522406" level="INFO">${karaf_connection_index} = 386</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:22:08.522074" elapsed="0.000367"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:08.522933" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:08.522661" elapsed="0.000307"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:08.561917" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:08.523805" elapsed="0.038284"/>
</kw>
<msg time="2026-10-16T01:22:08.562284" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:08.562326" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:08.523180" elapsed="0.039179"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:08.641142" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:08.563027" elapsed="0.078312"/>
</kw>
<msg time="2026-10-16T01:22:08.641492" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:08.641533" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:08.562526" elapsed="0.079040"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:08.641861" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:08.641634" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:08.641616" elapsed="0.000340"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:08.642484" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:08.642131" elapsed="0.000435"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:08.642836" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:08.642625" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:08.642609" elapsed="0.000322"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:08.642961" elapsed="0.000024"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:08.645474" elapsed="0.000579"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:22:08.647306" elapsed="0.000493"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:08.649011" 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-10-16T01:22:08.643769" elapsed="0.005642"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:08.643248" elapsed="0.006280"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:08.521286" elapsed="0.128361"/>
</kw>
<msg time="2026-10-16T01:22:08.649762" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:08.649805" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:08.520361" elapsed="0.129478"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:08.649992" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:22:08.649907" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:08.649890" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:08.650401" 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-10-16T01:22:08.650853" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:08.650922" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:22:08.518970" elapsed="0.132328"/>
</kw>
<msg time="2026-10-16T01:22:08.651383" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:08.651422" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:08.514829" elapsed="0.136627"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:08.651757" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:08.651524" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:08.651508" elapsed="0.000322"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:22:08.514486" elapsed="0.137366"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:08.656092" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:08.656005" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:08.655987" elapsed="0.000168"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:08.657289" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:08.657188" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:08.657171" elapsed="0.000182"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:08.657741" level="INFO">${karaf_connection_index} = 388</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:22:08.657495" elapsed="0.000272"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:08.658104" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:08.657927" elapsed="0.000202"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:08.692936" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:08.658777" elapsed="0.034333"/>
</kw>
<msg time="2026-10-16T01:22:08.693280" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:08.693321" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:08.658346" elapsed="0.035009"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:08.767342" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:08.693963" elapsed="0.073557"/>
</kw>
<msg time="2026-10-16T01:22:08.767682" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:08.767746" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:08.693517" elapsed="0.074263"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:08.768084" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:08.767881" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:08.767862" elapsed="0.000317"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:08.768734" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:08.768372" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:08.769079" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:08.768885" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:08.768868" elapsed="0.000304"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:08.769202" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:08.771686" elapsed="0.000495"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:22:08.773424" elapsed="0.000476"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:08.775123" 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-10-16T01:22:08.770001" elapsed="0.005517"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:08.769487" elapsed="0.006149"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:08.656928" elapsed="0.118972"/>
</kw>
<msg time="2026-10-16T01:22:08.775985" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:08.776025" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:08.656317" elapsed="0.119741"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:08.776224" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:22:08.776126" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:08.776110" elapsed="0.000193"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:08.776610" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:08.776918" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:08.776982" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:22:08.655697" elapsed="0.121368"/>
</kw>
<msg time="2026-10-16T01:22:08.777148" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:08.777187" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:08.652096" elapsed="0.125141"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:08.777517" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:08.777304" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:08.777288" elapsed="0.000304"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:22:08.651961" elapsed="0.125652"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:08.780189" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:08.780105" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:08.780088" elapsed="0.000180"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:08.781351" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:08.781269" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:08.781252" elapsed="0.000161"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:08.781798" 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-10-16T01:22:08.781553" elapsed="0.000301"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:08.782196" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:08.782017" elapsed="0.000222"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:08.815038" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:08.782831" elapsed="0.032393"/>
</kw>
<msg time="2026-10-16T01:22:08.815397" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:08.815438" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:08.782393" elapsed="0.033078"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:08.889277" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:08.816077" elapsed="0.073377"/>
</kw>
<msg time="2026-10-16T01:22:08.889612" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:08.889653" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:08.815633" elapsed="0.074053"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:08.889980" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:08.889779" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:08.889761" elapsed="0.000312"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:08.890600" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:08.890267" elapsed="0.000413"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:08.890952" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:08.890758" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:08.890742" elapsed="0.000303"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:08.891075" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:08.893547" elapsed="0.000497"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:22:08.895290" elapsed="0.000479"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:08.897161" 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-10-16T01:22:08.891867" elapsed="0.005677"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:08.891356" elapsed="0.006303"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:08.781000" elapsed="0.116753"/>
</kw>
<msg time="2026-10-16T01:22:08.897836" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:08.897875" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:08.780415" elapsed="0.117493"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:08.898060" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:22:08.897977" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:08.897960" elapsed="0.000175"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:08.898463" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:08.898852" elapsed="0.000054"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:08.898951" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:22:08.779817" elapsed="0.119221"/>
</kw>
<msg time="2026-10-16T01:22:08.899121" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:08.899160" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:08.777979" elapsed="0.121214"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:08.899493" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:08.899278" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:08.899261" elapsed="0.000302"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:22:08.777842" elapsed="0.121743"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:22:08.514155" elapsed="0.385456"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:22:08.509268" elapsed="0.390393"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:22:08.504916" elapsed="0.394810"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:08.503983" elapsed="0.395786"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:22:08.501488" elapsed="0.398327"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:08.903355" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:08.903112" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:08.903095" elapsed="0.000336"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:08.903765" 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-10-16T01:22:08.903858" 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-10-16T01:22:08.903624" elapsed="0.000258"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:08.904372" level="INFO">Attempting to execute command "sudo ovs-vsctl del-br br-s1" on remote system "10.30.171.104" 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-10-16T01:22:08.904068" elapsed="0.000346"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:08.904902" level="INFO">${conn_id} = 443</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-10-16T01:22:08.904588" elapsed="0.000338"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:22:08.905756" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:22:08.905825" 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-10-16T01:22:08.905484" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:08.905993" elapsed="0.000300"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:22:08.907061" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:22:09.294087" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:21:48 UTC 2026

  System load:  0.12               Processes:             106
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:22:03 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:22:08.906829" elapsed="0.387338"/>
</kw>
<msg time="2026-10-16T01:22:09.294238" 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-10-16T01:22:08.906453" elapsed="0.387876"/>
</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-10-16T01:22:08.905117" elapsed="0.389290"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:22:09.294780" level="INFO">Executing command 'sudo ovs-vsctl del-br br-s1'.</msg>
<msg time="2026-10-16T01:22:09.368659" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:22:09.368913" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:22:09.368999" 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-10-16T01:22:09.294609" elapsed="0.074437"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:09.369411" elapsed="0.000447"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:09.370894" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:09.370344" elapsed="0.000635"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:22:09.371349" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:09.371117" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:09.371079" elapsed="0.000414"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:22:09.371858" elapsed="0.000054"/>
</return>
<status status="PASS" start="2026-10-16T01:22:09.371626" elapsed="0.000355"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:09.371595" elapsed="0.000435"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:22:09.372099" elapsed="0.000028"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:09.373660" elapsed="0.000688"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:22:09.374786" elapsed="0.000303"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:09.375471" elapsed="0.000198"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:22:09.372767" elapsed="0.003041"/>
</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-10-16T01:22:08.902681" elapsed="0.473277"/>
</kw>
<msg time="2026-10-16T01:22:09.376059" 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-10-16T01:22:08.902160" elapsed="0.473995"/>
</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-10-16T01:22:08.901754" elapsed="0.474583"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:22:09.377473" 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-10-16T01:22:09.376786" elapsed="0.000741"/>
</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-10-16T01:22:09.384886" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:09.384081" elapsed="0.000861"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:09.385998" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:09.385302" elapsed="0.000750"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:09.386144" elapsed="0.000057"/>
</return>
<msg time="2026-10-16T01:22:09.386459" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:09.383126" elapsed="0.003383"/>
</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-10-16T01:22:09.392411" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:22:09.391791" elapsed="0.000674"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:22:09.392557" elapsed="0.000056"/>
</return>
<msg time="2026-10-16T01:22:09.392859" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:22:09.391033" elapsed="0.001877"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:09.395587" 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-10-16T01:22:09.395058" elapsed="0.000729"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:09.396762" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:09.396207" elapsed="0.000648"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:22:09.402867" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:22:09.402981" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:22:09.403243" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:22:09.397510" elapsed="0.006522">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:09.396987" elapsed="0.007211">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:22:09.405005" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:09.404296" elapsed="0.000848"/>
</branch>
<status status="FAIL" start="2026-10-16T01:22:09.396951" elapsed="0.008243">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:22:09.406136" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:09.406433" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:09.406359" elapsed="0.000159"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:09.406323" 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-10-16T01:22:09.406895" elapsed="0.000044"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:22:09.407038" elapsed="0.000030"/>
</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-10-16T01:22:09.393600" elapsed="0.013673">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:09.407395" 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-10-16T01:22:09.390068" elapsed="0.017517">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:22:09.408072" elapsed="0.000050"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:22:09.386890" elapsed="0.021365">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:22:09.386613" elapsed="0.021759">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:22:09.382043" elapsed="0.026511">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:22:10.415041" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:10.414246" elapsed="0.000855"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:10.416116" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:10.415468" elapsed="0.000702"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:10.416287" elapsed="0.000064"/>
</return>
<msg time="2026-10-16T01:22:10.416667" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:10.413379" elapsed="0.003372"/>
</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-10-16T01:22:10.422738" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:22:10.422048" elapsed="0.000758"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:22:10.422915" elapsed="0.000068"/>
</return>
<msg time="2026-10-16T01:22:10.423200" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:22:10.421275" elapsed="0.002000"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:10.425963" 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-10-16T01:22:10.425393" elapsed="0.000664"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:10.427074" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:10.426493" 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-10-16T01:22:10.433454" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:22:10.433562" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:22:10.433803" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:22:10.427854" elapsed="0.006689">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:10.427322" elapsed="0.007412">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:22:10.435144" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:10.434810" elapsed="0.000491"/>
</branch>
<status status="FAIL" start="2026-10-16T01:22:10.427285" elapsed="0.008065">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:22:10.436511" elapsed="0.000054"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:10.436815" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:10.436736" elapsed="0.000164"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:10.436673" 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-10-16T01:22:10.437280" elapsed="0.000046"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:22:10.437424" elapsed="0.000031"/>
</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-10-16T01:22:10.423968" elapsed="0.013667">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:10.437787" 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-10-16T01:22:10.420318" elapsed="0.017662">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:22:10.438459" elapsed="0.000050"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:22:10.417109" elapsed="0.021506">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:22:10.416861" elapsed="0.021974">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:22:10.412239" elapsed="0.026788">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:22:11.445592" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:11.444756" elapsed="0.000897"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:11.446662" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:11.446024" elapsed="0.000722"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:11.446841" elapsed="0.000065"/>
</return>
<msg time="2026-10-16T01:22:11.447130" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:11.443919" elapsed="0.003262"/>
</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-10-16T01:22:11.453042" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:22:11.452412" elapsed="0.000684"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:22:11.453191" elapsed="0.000080"/>
</return>
<msg time="2026-10-16T01:22:11.453485" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:22:11.451654" elapsed="0.001881"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:11.456173" 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-10-16T01:22:11.455639" elapsed="0.000657"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:11.457260" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:11.456743" elapsed="0.000610"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:22:11.464862" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:22:11.464974" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:22:11.465213" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:22:11.458060" elapsed="0.008003">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:11.457489" elapsed="0.008735">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:22:11.466657" elapsed="0.000080"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:11.466320" elapsed="0.000507"/>
</branch>
<status status="FAIL" start="2026-10-16T01:22:11.457452" elapsed="0.009426">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:22:11.467648" elapsed="0.000080"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:11.467946" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:11.467873" elapsed="0.000156"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:11.467837" 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-10-16T01:22:11.468400" elapsed="0.000044"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:22:11.468636" 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-10-16T01:22:11.454219" elapsed="0.014668">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:11.469009" 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-10-16T01:22:11.450696" elapsed="0.018504">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:22:11.469686" elapsed="0.000079"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:22:11.447552" elapsed="0.022321">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:22:11.447307" elapsed="0.022681">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:22:11.442729" elapsed="0.027445">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:22:12.478033" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:12.477062" elapsed="0.001038"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:12.479150" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:12.478481" elapsed="0.000724"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:12.479327" elapsed="0.000071"/>
</return>
<msg time="2026-10-16T01:22:12.479635" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:12.476192" elapsed="0.003500"/>
</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-10-16T01:22:12.486121" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:22:12.485477" elapsed="0.000701"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:22:12.486294" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:22:12.486569" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:22:12.484728" elapsed="0.001893"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:12.489354" 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-10-16T01:22:12.488816" elapsed="0.000637"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:12.490421" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:12.489901" 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-10-16T01:22:12.497050" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:22:12.497163" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:22:12.497419" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:22:12.491195" elapsed="0.007099">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:12.490654" elapsed="0.007814">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:22:12.499014" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:12.498634" elapsed="0.000513"/>
</branch>
<status status="FAIL" start="2026-10-16T01:22:12.490617" elapsed="0.008580">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:22:12.500003" elapsed="0.000052"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:12.500296" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:12.500198" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:12.500162" 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-10-16T01:22:12.500776" elapsed="0.000052"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:22:12.500936" elapsed="0.000030"/>
</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-10-16T01:22:12.487368" elapsed="0.013780">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:12.501363" 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-10-16T01:22:12.483681" elapsed="0.017878">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:22:12.502060" elapsed="0.000049"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:22:12.480162" elapsed="0.022052">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:22:12.479907" elapsed="0.022536">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:22:12.474906" elapsed="0.027723">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:22:13.509643" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:13.508838" elapsed="0.000897"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:13.510753" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:13.510084" elapsed="0.000726"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:13.510903" elapsed="0.000068"/>
</return>
<msg time="2026-10-16T01:22:13.511202" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:13.507981" elapsed="0.003292"/>
</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-10-16T01:22:13.517113" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:22:13.516472" elapsed="0.000698"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:22:13.517321" elapsed="0.000059"/>
</return>
<msg time="2026-10-16T01:22:13.517594" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:22:13.515740" elapsed="0.001906"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:13.520308" 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-10-16T01:22:13.519784" elapsed="0.000619"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:13.521359" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:13.520847" elapsed="0.000603"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:22:13.528107" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:22:13.528327" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:22:13.528555" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:22:13.522125" elapsed="0.007217">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:13.521585" elapsed="0.007919">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:22:13.529953" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:13.529576" elapsed="0.000511"/>
</branch>
<status status="FAIL" start="2026-10-16T01:22:13.521547" elapsed="0.008593">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:22:13.530934" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:13.531206" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:13.531131" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:13.531095" elapsed="0.000268"/>
</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-10-16T01:22:13.531667" elapsed="0.000075"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:22:13.531843" 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-10-16T01:22:13.518352" elapsed="0.013703">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:13.532175" 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-10-16T01:22:13.514785" elapsed="0.017604">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:22:13.532880" elapsed="0.000050"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:22:13.511631" elapsed="0.021404">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:22:13.511382" elapsed="0.021769">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:22:13.506823" elapsed="0.026537">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:22:14.540656" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:14.539809" elapsed="0.000943"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:14.541794" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:14.541100" elapsed="0.000759"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:14.541954" elapsed="0.000066"/>
</return>
<msg time="2026-10-16T01:22:14.542251" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:14.538936" elapsed="0.003412"/>
</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-10-16T01:22:14.548225" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:22:14.547581" elapsed="0.000724"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:22:14.548497" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:22:14.548811" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:22:14.546846" elapsed="0.002018"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:14.551676" 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-10-16T01:22:14.551147" elapsed="0.000658"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:14.552889" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:14.552222" elapsed="0.000766"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:22:14.559314" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:22:14.559427" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:22:14.559652" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:22:14.553664" elapsed="0.006861">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:14.553130" elapsed="0.007560">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:22:14.561136" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:14.560796" elapsed="0.000507"/>
</branch>
<status status="FAIL" start="2026-10-16T01:22:14.553092" elapsed="0.008263">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:22:14.562136" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:14.562433" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:14.562358" elapsed="0.000163"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:14.562322" elapsed="0.000245"/>
</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-10-16T01:22:14.562907" elapsed="0.000044"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:22:14.563050" elapsed="0.000031"/>
</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-10-16T01:22:14.549753" elapsed="0.013531">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:14.563408" 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-10-16T01:22:14.545877" elapsed="0.017722">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:22:14.564123" elapsed="0.000050"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:22:14.542744" elapsed="0.021557">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:22:14.542459" elapsed="0.021961">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:22:14.537740" elapsed="0.026867">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<msg time="2026-10-16T01:22:14.564833" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</msg>
<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="FAIL" start="2026-10-16T01:22:09.377981" elapsed="5.187130">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<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-10-16T01:22:08.901368" elapsed="5.663991">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<doc>Delete bridge with OVS command and verify it gets deleted from all instances.</doc>
<status status="FAIL" start="2026-10-16T01:22:08.500341" elapsed="6.065304">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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-10-16T01:22:14.569366" elapsed="0.000509"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:22:14.568362" elapsed="0.001630"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:14.572174" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:14.571978" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:14.571938" elapsed="0.000408"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:14.576867" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:14.576645" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:14.576607" elapsed="0.000400"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:14.579104" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:14.578313" elapsed="0.000848"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:14.580158" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:14.579519" elapsed="0.000694"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:14.580340" elapsed="0.000060"/>
</return>
<msg time="2026-10-16T01:22:14.580622" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:14.577476" elapsed="0.003197"/>
</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-10-16T01:22:14.586212" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:14.586024" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:14.585985" elapsed="0.000416"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:14.589168" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:14.588978" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:14.588940" elapsed="0.000393"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:14.590234" level="INFO">${karaf_connection_index} = 386</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:22:14.589658" elapsed="0.000654"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:14.591123" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:14.590675" elapsed="0.000503"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:14.625805" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:14.592551" elapsed="0.033472"/>
</kw>
<msg time="2026-10-16T01:22:14.626186" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:14.626227" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:14.591551" elapsed="0.034726"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:14.703437" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:14.626893" elapsed="0.076729"/>
</kw>
<msg time="2026-10-16T01:22:14.703847" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:14.703890" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:14.626442" elapsed="0.077483"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:14.704212" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:14.703998" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:14.703979" elapsed="0.000349"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:14.705006" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:14.704509" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:14.705369" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:14.705150" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:14.705133" elapsed="0.000332"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:14.705496" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:14.708065" 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-10-16T01:22:14.709845" elapsed="0.000494"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:14.711722" 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-10-16T01:22:14.706322" elapsed="0.005801"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:14.705804" elapsed="0.006451"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:14.588321" elapsed="0.124027"/>
</kw>
<msg time="2026-10-16T01:22:14.712431" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:14.712471" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:14.586801" elapsed="0.125704"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:14.712658" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:22:14.712573" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:14.712557" 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-10-16T01:22:14.713103" 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-10-16T01:22:14.713415" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:14.713481" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:22:14.585348" elapsed="0.128217"/>
</kw>
<msg time="2026-10-16T01:22:14.713646" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:14.713686" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:14.581449" elapsed="0.132320"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:14.714056" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:14.713839" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:14.713823" elapsed="0.000304"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:22:14.581114" elapsed="0.133034"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:14.716606" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:14.716521" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:14.716504" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:14.717829" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:14.717742" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:14.717725" elapsed="0.000167"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:14.718257" level="INFO">${karaf_connection_index} = 388</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:22:14.718035" elapsed="0.000265"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:14.718637" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:14.718461" elapsed="0.000200"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:14.750995" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:14.719248" elapsed="0.031926"/>
</kw>
<msg time="2026-10-16T01:22:14.751360" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:14.751401" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:14.718833" elapsed="0.032601"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:14.822651" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:14.752048" elapsed="0.070803"/>
</kw>
<msg time="2026-10-16T01:22:14.823013" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:14.823054" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:14.751599" elapsed="0.071489"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:14.823373" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:14.823158" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:14.823140" elapsed="0.000327"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:14.824004" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:14.823648" elapsed="0.000436"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:14.824354" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:14.824144" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:14.824128" elapsed="0.000321"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:14.824479" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:14.827152" elapsed="0.000495"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:22:14.828912" elapsed="0.000477"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:14.830759" elapsed="0.000307"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:22:14.825436" elapsed="0.005696"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:14.824777" elapsed="0.006474"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:14.717465" elapsed="0.113881"/>
</kw>
<msg time="2026-10-16T01:22:14.831429" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:14.831468" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:14.716830" elapsed="0.114671"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:14.831656" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:22:14.831571" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:14.831554" 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-10-16T01:22:14.832122" elapsed="0.000055"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:14.832470" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:14.832536" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:22:14.716221" elapsed="0.116399"/>
</kw>
<msg time="2026-10-16T01:22:14.832717" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:14.832759" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:14.714412" elapsed="0.118380"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:14.833082" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:14.832859" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:14.832844" elapsed="0.000309"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:22:14.714257" elapsed="0.118918"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:14.835588" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:14.835503" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:14.835486" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:14.836766" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:14.836659" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:14.836643" elapsed="0.000186"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:14.837230" 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-10-16T01:22:14.837000" elapsed="0.000254"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:14.837611" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:14.837433" elapsed="0.000202"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:14.871019" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:14.838217" elapsed="0.032969"/>
</kw>
<msg time="2026-10-16T01:22:14.871374" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:14.871415" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:14.837806" elapsed="0.033642"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:14.945460" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:14.872067" elapsed="0.073572"/>
</kw>
<msg time="2026-10-16T01:22:14.945824" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:14.945865" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:14.871610" elapsed="0.074291"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:14.946178" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:14.945974" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:14.945955" elapsed="0.000365"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:14.946865" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:14.946506" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:14.947205" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:14.947009" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:14.946992" elapsed="0.000359"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:14.947382" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:14.949880" 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-10-16T01:22:14.951604" elapsed="0.000475"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:14.953440" elapsed="0.001972"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:22:14.948168" elapsed="0.007313"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:14.947650" elapsed="0.007948"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:14.836405" elapsed="0.119273"/>
</kw>
<msg time="2026-10-16T01:22:14.955778" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:14.955817" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:14.835813" elapsed="0.120037"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:14.956005" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:22:14.955919" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:14.955902" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:14.956412" 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-10-16T01:22:14.956781" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:14.956849" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:22:14.835202" elapsed="0.121733"/>
</kw>
<msg time="2026-10-16T01:22:14.957018" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:14.957057" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:14.833435" elapsed="0.123654"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:14.957409" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:14.957156" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:14.957140" elapsed="0.000342"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:22:14.833299" elapsed="0.124203"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:22:14.580810" elapsed="0.376719"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:22:14.575690" elapsed="0.381889"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:22:14.571373" elapsed="0.386255"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:14.570389" elapsed="0.387278"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:22:14.567545" elapsed="0.390187"/>
</kw>
<kw name="Create Sample Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:22:14.961670" 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-10-16T01:22:14.960390" elapsed="0.001331">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-10-16T01:22:14.566351" elapsed="0.395502">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-10-16T01:22:14.963282" elapsed="0.000202"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:22:14.963026" elapsed="0.000507"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:14.964429" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:14.964345" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:14.964328" 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-10-16T01:22:14.966388" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:14.966305" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:14.966288" elapsed="0.000163"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:14.967355" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:14.967015" elapsed="0.000365"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:14.967812" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:14.967526" elapsed="0.000310"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:14.967876" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:22:14.968000" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:14.966647" elapsed="0.001375"/>
</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-10-16T01:22:14.970670" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:14.970585" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:14.970568" elapsed="0.000183"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:14.971860" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:14.971777" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:14.971760" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:14.972311" level="INFO">${karaf_connection_index} = 386</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:22:14.972063" elapsed="0.000274"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:14.972674" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:14.972497" elapsed="0.000217"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:15.011800" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:14.973300" elapsed="0.038715"/>
</kw>
<msg time="2026-10-16T01:22:15.012173" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:15.012215" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:14.972870" elapsed="0.039378"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:15.092454" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:15.012898" elapsed="0.079737"/>
</kw>
<msg time="2026-10-16T01:22:15.092820" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:15.092862" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:15.012452" elapsed="0.080443"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:15.093174" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:15.092966" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:15.092948" elapsed="0.000341"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:15.093834" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:15.093471" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:15.094173" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:15.093978" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:15.093961" elapsed="0.000353"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:15.094350" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:15.096871" 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-10-16T01:22:15.098608" elapsed="0.000582"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:15.100613" 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-10-16T01:22:15.095147" elapsed="0.005869"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:15.094621" elapsed="0.006512"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:14.971496" elapsed="0.129721"/>
</kw>
<msg time="2026-10-16T01:22:15.101321" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:15.101365" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:14.970903" elapsed="0.130497"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:15.101556" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:22:15.101470" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:15.101453" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:15.102023" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:15.102332" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:15.102397" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:22:14.970296" elapsed="0.132185"/>
</kw>
<msg time="2026-10-16T01:22:15.102564" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:15.102603" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:14.968382" elapsed="0.134255"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:15.102937" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:15.102720" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:15.102688" elapsed="0.000321"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:22:14.968207" elapsed="0.134823"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:15.105602" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:15.105518" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:15.105500" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:15.106789" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:15.106682" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:15.106666" elapsed="0.000187"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:15.107221" level="INFO">${karaf_connection_index} = 388</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:22:15.106995" elapsed="0.000251"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:15.107601" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:15.107422" elapsed="0.000203"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:15.139955" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:15.108210" elapsed="0.031918"/>
</kw>
<msg time="2026-10-16T01:22:15.140315" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:15.140358" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:15.107797" elapsed="0.032594"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:15.229807" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:15.141041" elapsed="0.088954"/>
</kw>
<msg time="2026-10-16T01:22:15.230163" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:15.230205" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:15.140595" elapsed="0.089643"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:15.230539" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:15.230329" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:15.230310" elapsed="0.000324"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:15.231183" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:15.230840" elapsed="0.000421"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:15.231534" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:15.231337" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:15.231320" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:15.231659" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:15.234164" elapsed="0.000494"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:22:15.235934" elapsed="0.000474"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:15.237621" elapsed="0.000565"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:22:15.232456" elapsed="0.005797"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:15.231949" elapsed="0.006441"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:15.106423" elapsed="0.132045"/>
</kw>
<msg time="2026-10-16T01:22:15.238551" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:15.238591" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:15.105829" elapsed="0.132796"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:15.238800" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:22:15.238712" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:15.238678" elapsed="0.000198"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:15.239184" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:15.239493" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:15.239558" 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-10-16T01:22:15.105209" elapsed="0.134435"/>
</kw>
<msg time="2026-10-16T01:22:15.239782" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:15.239825" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:15.103290" elapsed="0.136568"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:15.240142" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:15.239927" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:15.239911" elapsed="0.000302"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:22:15.103139" elapsed="0.137142"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:15.242899" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:15.242812" elapsed="0.000134"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:15.242795" elapsed="0.000172"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:15.244101" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:15.244017" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:15.244000" elapsed="0.000164"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:15.244547" 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-10-16T01:22:15.244322" elapsed="0.000250"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:15.244925" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:15.244749" elapsed="0.000199"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:15.278070" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:15.245543" elapsed="0.032707"/>
</kw>
<msg time="2026-10-16T01:22:15.278426" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:15.278468" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:15.245101" elapsed="0.033400"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:15.346645" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:15.279113" elapsed="0.067747"/>
</kw>
<msg time="2026-10-16T01:22:15.347027" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:15.347068" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:15.278664" elapsed="0.068437"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:15.347398" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:15.347173" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:15.347155" elapsed="0.000339"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:15.348033" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:15.347677" elapsed="0.000433"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:15.348384" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:15.348170" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:15.348154" elapsed="0.000324"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:15.348508" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:15.351017" elapsed="0.000493"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:22:15.352774" elapsed="0.000454"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:15.354617" 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-10-16T01:22:15.349313" elapsed="0.005704"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:15.348804" elapsed="0.006331"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:15.243759" elapsed="0.111453"/>
</kw>
<msg time="2026-10-16T01:22:15.355310" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:15.355351" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:15.243114" elapsed="0.112271"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:15.355582" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:22:15.355495" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:15.355477" elapsed="0.000183"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:15.356062" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:15.356378" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:15.356444" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:22:15.242495" elapsed="0.114035"/>
</kw>
<msg time="2026-10-16T01:22:15.356616" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:15.356656" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:15.240534" elapsed="0.116155"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:15.356994" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:15.356777" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:15.356761" elapsed="0.000304"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:22:15.240398" elapsed="0.116688"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:22:14.968069" elapsed="0.389044"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:22:14.966003" elapsed="0.391163"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:22:14.964075" elapsed="0.393144"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:14.963675" elapsed="0.393587"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:22:14.962674" elapsed="0.394655"/>
</kw>
<kw name="Create Sample Port And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:22:15.361508" 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-10-16T01:22:15.360239" elapsed="0.001308">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-10-16T01:22:14.962153" elapsed="0.399541">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-10-16T01:22:15.363124" elapsed="0.000217"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:22:15.362880" 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-10-16T01:22:15.364302" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:15.364198" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:15.364181" elapsed="0.000186"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:15.366229" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:15.366146" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:15.366130" elapsed="0.000180"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:15.367207" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:15.366879" elapsed="0.000353"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:15.367663" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:15.367396" elapsed="0.000291"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:15.367744" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:22:15.367870" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:15.366510" elapsed="0.001383"/>
</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-10-16T01:22:15.370443" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:15.370358" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:15.370341" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:15.371606" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:15.371523" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:15.371506" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:15.372062" level="INFO">${karaf_connection_index} = 386</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:22:15.371838" elapsed="0.000248"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:15.372435" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:15.372244" elapsed="0.000215"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:15.417776" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:15.373048" elapsed="0.044899"/>
</kw>
<msg time="2026-10-16T01:22:15.418126" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:15.418166" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:15.372612" elapsed="0.045587"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:15.511310" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:15.418836" elapsed="0.092657"/>
</kw>
<msg time="2026-10-16T01:22:15.511652" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:15.511696" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:15.418380" elapsed="0.093376"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:15.512036" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:15.511828" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:15.511811" elapsed="0.000321"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:15.512728" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:15.512354" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:15.513078" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:15.512879" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:15.512862" elapsed="0.000313"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:15.513205" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:15.515689" 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-10-16T01:22:15.517422" elapsed="0.000476"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:15.519074" 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-10-16T01:22:15.514031" elapsed="0.005435"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:15.513503" elapsed="0.006079"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:15.371251" elapsed="0.148408"/>
</kw>
<msg time="2026-10-16T01:22:15.520016" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:15.520057" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:15.370653" elapsed="0.149437"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:15.520298" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:22:15.520194" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:15.520176" elapsed="0.000200"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:15.520689" 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-10-16T01:22:15.521012" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:15.521077" 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-10-16T01:22:15.370055" elapsed="0.151107"/>
</kw>
<msg time="2026-10-16T01:22:15.521246" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:15.521302" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:15.368220" elapsed="0.153117"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:15.521621" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:15.521406" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:15.521390" elapsed="0.000303"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:22:15.368082" elapsed="0.153703"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:15.524262" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:15.524177" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:15.524160" elapsed="0.000184"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:15.525436" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:15.525352" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:15.525335" elapsed="0.000164"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:15.525888" level="INFO">${karaf_connection_index} = 388</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:22:15.525641" elapsed="0.000272"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:15.526246" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:15.526072" elapsed="0.000214"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:15.560150" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:15.526869" elapsed="0.033479"/>
</kw>
<msg time="2026-10-16T01:22:15.560524" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:15.560566" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:15.526440" elapsed="0.034160"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:15.646045" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:15.561206" elapsed="0.085030"/>
</kw>
<msg time="2026-10-16T01:22:15.646417" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:15.646459" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:15.560787" elapsed="0.085707"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:15.646799" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:15.646566" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:15.646547" elapsed="0.000347"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:15.647431" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:15.647075" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:15.647845" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:15.647626" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:15.647610" elapsed="0.000332"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:15.647973" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:15.650464" 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-10-16T01:22:15.652202" elapsed="0.000618"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:15.654073" 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-10-16T01:22:15.648775" elapsed="0.005698"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:15.648241" elapsed="0.006351"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:15.525082" elapsed="0.129588"/>
</kw>
<msg time="2026-10-16T01:22:15.654957" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:15.654999" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:15.524491" elapsed="0.130542"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:15.655189" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:22:15.655103" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:15.655086" elapsed="0.000181"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:15.655600" 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-10-16T01:22:15.655987" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:15.656057" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:22:15.523886" elapsed="0.132257"/>
</kw>
<msg time="2026-10-16T01:22:15.656226" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:15.656267" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:15.522032" elapsed="0.134282"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:15.656624" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:15.656383" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:15.656367" elapsed="0.000446"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:22:15.521895" elapsed="0.134943"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:15.659345" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:15.659244" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:15.659227" elapsed="0.000182"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:15.660500" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:15.660417" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:15.660400" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:15.660951" 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-10-16T01:22:15.660726" elapsed="0.000250"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:15.661322" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:15.661134" elapsed="0.000213"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:15.694638" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:15.661932" elapsed="0.032933"/>
</kw>
<msg time="2026-10-16T01:22:15.695074" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:15.695116" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:15.661499" elapsed="0.033650"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:15.780497" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:15.695777" elapsed="0.084905"/>
</kw>
<msg time="2026-10-16T01:22:15.780868" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:15.780909" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:15.695332" elapsed="0.085611"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:15.781218" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:15.781014" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:15.780996" elapsed="0.000333"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:15.781865" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:15.781510" elapsed="0.000436"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:15.782201" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:15.782007" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:15.781991" elapsed="0.000322"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:15.782344" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:15.784831" elapsed="0.000496"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:22:15.786566" elapsed="0.000482"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:15.788444" 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-10-16T01:22:15.783130" elapsed="0.005709"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:15.782609" elapsed="0.006346"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:15.660146" elapsed="0.128886"/>
</kw>
<msg time="2026-10-16T01:22:15.789114" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:15.789154" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:15.659556" elapsed="0.129632"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:15.789359" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:22:15.789256" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:15.789239" elapsed="0.000199"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:15.789855" 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-10-16T01:22:15.790154" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:15.790218" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:22:15.658955" elapsed="0.131370"/>
</kw>
<msg time="2026-10-16T01:22:15.790410" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:15.790449" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:15.657091" elapsed="0.133393"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:15.790833" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:15.790597" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:15.790579" elapsed="0.000326"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:22:15.656950" elapsed="0.133977"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:22:15.367941" elapsed="0.423013"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:22:15.365857" elapsed="0.425147"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:22:15.363947" elapsed="0.427107"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:15.363539" elapsed="0.427558"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:22:15.362527" elapsed="0.428618"/>
</kw>
<kw name="Modify the destination IP of Sample Port" owner="ClusterOvsdb">
<msg time="2026-10-16T01:22:15.794101" 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-10-16T01:22:15.792862" elapsed="0.001274">Variable '${original_owner}' not found.</status>
</kw>
<doc>Modify the dst ip of existing port in Owner.</doc>
<status status="FAIL" start="2026-10-16T01:22:15.362015" elapsed="0.432244">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-10-16T01:22:15.795662" elapsed="0.000219"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:22:15.795422" elapsed="0.000510"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:15.796835" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:15.796748" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:15.796730" elapsed="0.000168"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:15.798767" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:15.798665" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:15.798649" elapsed="0.000181"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:15.799731" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:15.799393" elapsed="0.000364"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:15.800170" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:15.799905" elapsed="0.000289"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:15.800234" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:22:15.800375" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:15.799029" elapsed="0.001368"/>
</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-10-16T01:22:15.802924" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:15.802839" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:15.802822" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:15.804080" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:15.803997" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:15.803981" elapsed="0.000160"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:15.804522" level="INFO">${karaf_connection_index} = 386</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:22:15.804297" elapsed="0.000250"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:15.804901" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:15.804723" elapsed="0.000202"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:15.838761" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:15.805747" elapsed="0.033184"/>
</kw>
<msg time="2026-10-16T01:22:15.839109" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:15.839150" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:15.805077" elapsed="0.034142"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:15.904205" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:15.839847" elapsed="0.064568"/>
</kw>
<msg time="2026-10-16T01:22:15.904581" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:15.904624" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:15.839406" elapsed="0.065253"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:15.904973" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:15.904757" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:15.904737" elapsed="0.000335"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:15.905654" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:15.905251" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:15.906012" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:15.905814" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:15.905798" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:15.906137" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:15.908620" 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-10-16T01:22:15.910356" elapsed="0.000655"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:15.912409" 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-10-16T01:22:15.906945" elapsed="0.005877"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:15.906423" elapsed="0.006517"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:15.803743" elapsed="0.109274"/>
</kw>
<msg time="2026-10-16T01:22:15.913099" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:15.913138" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:15.803132" elapsed="0.110040"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:15.913346" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:22:15.913241" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:15.913224" elapsed="0.000200"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:15.913827" 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-10-16T01:22:15.914125" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:15.914188" 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-10-16T01:22:15.802538" elapsed="0.111751"/>
</kw>
<msg time="2026-10-16T01:22:15.914374" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:15.914414" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:15.800735" elapsed="0.113713"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:15.914748" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:15.914515" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:15.914499" elapsed="0.000356"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:22:15.800582" elapsed="0.114295"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:15.917458" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:15.917373" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:15.917356" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:15.918618" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:15.918535" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:15.918519" elapsed="0.000161"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:15.919070" level="INFO">${karaf_connection_index} = 388</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:22:15.918846" elapsed="0.000249"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:15.919444" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:15.919253" elapsed="0.000215"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:15.954718" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:15.920055" elapsed="0.034839"/>
</kw>
<msg time="2026-10-16T01:22:15.955053" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:15.955095" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:15.919621" elapsed="0.035508"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:16.020500" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:15.955758" elapsed="0.064920"/>
</kw>
<msg time="2026-10-16T01:22:16.020866" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:16.020907" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:15.955312" elapsed="0.065629"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:16.021221" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:16.021011" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:16.020993" elapsed="0.000341"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:16.021877" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:16.021517" elapsed="0.000436"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:16.022207" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:16.022014" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:16.021998" elapsed="0.000321"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:16.022349" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:16.024839" 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-10-16T01:22:16.026577" elapsed="0.000483"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:16.028266" 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-10-16T01:22:16.023138" elapsed="0.005532"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:16.022615" elapsed="0.006222"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:15.918262" elapsed="0.110652"/>
</kw>
<msg time="2026-10-16T01:22:16.028996" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:16.029035" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:15.917669" elapsed="0.111434"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:16.029261" elapsed="0.000043"/>
</return>
<status status="PASS" start="2026-10-16T01:22:16.029175" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:16.029158" elapsed="0.000201"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:16.029675" elapsed="0.000284"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:16.030242" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:16.030355" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:22:15.917059" elapsed="0.113383"/>
</kw>
<msg time="2026-10-16T01:22:16.030526" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:16.030565" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:15.915124" elapsed="0.115473"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:16.030901" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:16.030666" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:16.030650" elapsed="0.000323"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:22:15.914987" elapsed="0.116007"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:16.033504" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:16.033419" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:16.033402" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:16.034649" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:16.034567" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:16.034550" elapsed="0.000187"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:16.035104" 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-10-16T01:22:16.034878" elapsed="0.000251"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:16.035477" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:16.035300" elapsed="0.000201"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:16.077109" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:16.036080" elapsed="0.041234"/>
</kw>
<msg time="2026-10-16T01:22:16.077478" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:16.077520" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:16.035651" elapsed="0.041902"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:16.145972" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:16.078159" elapsed="0.067991"/>
</kw>
<msg time="2026-10-16T01:22:16.146326" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:16.146368" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:16.077736" elapsed="0.068666"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:16.146676" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:16.146472" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:16.146454" elapsed="0.000344"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:16.147331" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:16.146981" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:16.147730" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:16.147510" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:16.147493" elapsed="0.000333"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:16.147857" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:16.150348" 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-10-16T01:22:16.152083" elapsed="0.000476"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:16.153770" 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-10-16T01:22:16.148629" elapsed="0.005534"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:16.148118" elapsed="0.006178"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:16.034313" elapsed="0.120070"/>
</kw>
<msg time="2026-10-16T01:22:16.154463" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:16.154502" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:16.033725" elapsed="0.120812"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:16.154689" elapsed="0.000312"/>
</return>
<status status="PASS" start="2026-10-16T01:22:16.154605" elapsed="0.000428"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:16.154589" elapsed="0.000468"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:16.155389" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:16.155688" elapsed="0.000040"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:16.155771" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:22:16.033109" elapsed="0.122747"/>
</kw>
<msg time="2026-10-16T01:22:16.155939" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:16.155979" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:16.031237" elapsed="0.124776"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:16.156314" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:16.156080" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:16.156065" elapsed="0.000323"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:22:16.031102" elapsed="0.125307"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:22:15.800445" elapsed="0.355990"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:22:15.798377" elapsed="0.358109"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:22:15.796478" elapsed="0.360060"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:15.796077" elapsed="0.360502"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:22:15.795069" elapsed="0.361560"/>
</kw>
<kw name="Verify Sample Port Is Modified" owner="ClusterOvsdb">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:22:16.160125" 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-10-16T01:22:16.159796" elapsed="0.000354"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:22:16.164605" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:22:16.163335" elapsed="0.001304">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:22:17.174611" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:22:17.171450" elapsed="0.003282">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:22:18.184246" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:22:18.181337" elapsed="0.003014">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:22:19.194344" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:22:19.190984" elapsed="0.003456">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:22:20.203669" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:22:20.200762" elapsed="0.003015">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:22:21.213552" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:22:21.210527" elapsed="0.003108">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<msg time="2026-10-16T01:22:21.213868" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: Variable '${ovsdb_uuid}' not found.</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-10-16T01:22:16.160364" elapsed="5.053791">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: Variable '${ovsdb_uuid}' not found.</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-10-16T01:22:16.159424" elapsed="5.055011">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: Variable '${ovsdb_uuid}' not found.</status>
</kw>
<doc>Verify port is modified in all instances.</doc>
<status status="FAIL" start="2026-10-16T01:22:15.794586" elapsed="5.420169">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: Variable '${ovsdb_uuid}' not found.</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-10-16T01:22:21.217987" elapsed="0.000543"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:22:21.217397" elapsed="0.001249"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:21.220835" elapsed="0.000067"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:21.220575" elapsed="0.000397"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:21.220532" elapsed="0.000490"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:21.225454" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:21.225246" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:21.225209" elapsed="0.000389"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:21.227849" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:21.227030" elapsed="0.000875"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:21.228903" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:21.228240" elapsed="0.000717"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:21.229048" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:22:21.229364" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:21.226084" elapsed="0.003333"/>
</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-10-16T01:22:21.235277" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:21.235089" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:21.235051" elapsed="0.000390"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:21.238019" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:21.237829" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:21.237790" elapsed="0.000370"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:21.239073" level="INFO">${karaf_connection_index} = 386</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:22:21.238508" elapsed="0.000620"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:21.239958" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:21.239513" elapsed="0.000500"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:21.274262" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:21.241399" elapsed="0.033133"/>
</kw>
<msg time="2026-10-16T01:22:21.274812" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:21.274871" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:21.240381" elapsed="0.034538"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:21.337217" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:21.275827" elapsed="0.061587"/>
</kw>
<msg time="2026-10-16T01:22:21.337574" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:21.337616" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:21.275150" elapsed="0.062500"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:21.337972" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:21.337750" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:21.337729" elapsed="0.000338"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:21.338613" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:21.338249" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:21.338967" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:21.338771" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:21.338754" elapsed="0.000306"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:21.339091" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:21.341626" 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-10-16T01:22:21.343449" elapsed="0.000508"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:21.345180" 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-10-16T01:22:21.339917" elapsed="0.005666"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:21.339402" elapsed="0.006318"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:21.237196" elapsed="0.108604"/>
</kw>
<msg time="2026-10-16T01:22:21.345881" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:21.345921" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:21.235798" elapsed="0.110157"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:21.346150" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:22:21.346064" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:21.346046" elapsed="0.000184"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:21.346564" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:21.346877" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:21.346942" 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-10-16T01:22:21.234421" elapsed="0.112606"/>
</kw>
<msg time="2026-10-16T01:22:21.347111" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:21.347151" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:21.230220" elapsed="0.116965"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:21.347489" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:21.347252" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:21.347236" elapsed="0.000325"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:22:21.229882" elapsed="0.117701"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:21.350117" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:21.350033" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:21.350016" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:21.351290" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:21.351202" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:21.351185" elapsed="0.000187"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:21.352047" level="INFO">${karaf_connection_index} = 388</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:22:21.351513" elapsed="0.000560"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:21.352429" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:21.352233" elapsed="0.000221"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:21.388991" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:21.353050" elapsed="0.036141"/>
</kw>
<msg time="2026-10-16T01:22:21.389371" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:21.389413" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:21.352607" elapsed="0.036840"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:21.467272" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:21.390069" elapsed="0.077400"/>
</kw>
<msg time="2026-10-16T01:22:21.467627" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:21.467668" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:21.389610" elapsed="0.078119"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:21.468007" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:21.467802" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:21.467784" elapsed="0.000318"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:21.468635" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:21.468280" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:21.469021" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:21.468825" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:21.468808" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:21.469146" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:21.471623" elapsed="0.000495"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:22:21.473365" elapsed="0.000478"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:21.476021" 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-10-16T01:22:21.469945" elapsed="0.006473"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:21.469437" elapsed="0.007099"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:21.350947" elapsed="0.125668"/>
</kw>
<msg time="2026-10-16T01:22:21.476712" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:21.476754" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:21.350341" elapsed="0.126446"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:21.476943" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:22:21.476857" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:21.476840" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:21.477351" 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-10-16T01:22:21.477650" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:21.477744" 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-10-16T01:22:21.349744" elapsed="0.128087"/>
</kw>
<msg time="2026-10-16T01:22:21.477914" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:21.477953" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:21.347861" elapsed="0.130125"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:21.478273" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:21.478053" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:21.478038" elapsed="0.000323"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:22:21.347724" elapsed="0.130658"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:21.480977" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:21.480893" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:21.480875" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:21.482452" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:21.482368" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:21.482350" elapsed="0.000164"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:21.482896" 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-10-16T01:22:21.482655" elapsed="0.000266"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:21.483254" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:21.483079" elapsed="0.000199"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:21.516622" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:21.483893" elapsed="0.032923"/>
</kw>
<msg time="2026-10-16T01:22:21.516985" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:21.517063" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:21.483449" elapsed="0.033650"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:21.581614" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:21.517733" elapsed="0.064081"/>
</kw>
<msg time="2026-10-16T01:22:21.581968" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:21.582008" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:21.517261" elapsed="0.064781"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:21.582315" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:21.582110" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:21.582093" elapsed="0.000331"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:21.582977" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:21.582605" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:21.583306" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:21.583112" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:21.583096" elapsed="0.000319"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:21.583447" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:21.585900" 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-10-16T01:22:21.587617" elapsed="0.000473"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:21.589459" 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-10-16T01:22:21.584228" elapsed="0.005620"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:21.583739" elapsed="0.006225"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:21.482094" elapsed="0.107947"/>
</kw>
<msg time="2026-10-16T01:22:21.590123" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:21.590163" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:21.481184" elapsed="0.109013"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:21.590369" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:22:21.590264" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:21.590248" elapsed="0.000200"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:21.590851" 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-10-16T01:22:21.591154" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:21.591221" 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-10-16T01:22:21.480574" elapsed="0.110736"/>
</kw>
<msg time="2026-10-16T01:22:21.591410" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:21.591451" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:21.478625" elapsed="0.112860"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:21.591818" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:21.591552" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:21.591537" elapsed="0.000355"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:22:21.478490" elapsed="0.113423"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:22:21.229527" elapsed="0.362413"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:22:21.224559" elapsed="0.367434"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:22:21.219969" elapsed="0.372076"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:21.219005" elapsed="0.373084"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:22:21.216558" elapsed="0.375580"/>
</kw>
<kw name="Delete Sample Port And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:22:21.596211" 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-10-16T01:22:21.594980" elapsed="0.001266">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-10-16T01:22:21.215240" elapsed="0.381189">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-10-16T01:22:21.597943" elapsed="0.000199"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:22:21.597681" elapsed="0.000510"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:21.599090" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:21.599005" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:21.598988" elapsed="0.000165"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:21.601039" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:21.600956" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:21.600940" elapsed="0.000161"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:21.602013" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:21.601671" elapsed="0.000368"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:21.602475" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:21.602187" elapsed="0.000313"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:21.602541" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:22:21.602665" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:21.601301" elapsed="0.001387"/>
</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-10-16T01:22:21.605226" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:21.605142" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:21.605124" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:21.606398" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:21.606297" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:21.606281" elapsed="0.000179"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:21.606854" level="INFO">${karaf_connection_index} = 386</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:22:21.606605" elapsed="0.000274"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:21.607215" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:21.607041" elapsed="0.000199"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:21.644745" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:21.607847" elapsed="0.037078"/>
</kw>
<msg time="2026-10-16T01:22:21.645087" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:21.645128" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:21.607416" elapsed="0.037746"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:21.744693" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:21.645845" elapsed="0.099045"/>
</kw>
<msg time="2026-10-16T01:22:21.745050" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:21.745091" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:21.645389" elapsed="0.099737"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:21.745416" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:21.745196" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:21.745178" elapsed="0.000335"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:21.746055" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:21.745695" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:21.746409" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:21.746196" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:21.746180" elapsed="0.000323"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:21.746534" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:21.749033" 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-10-16T01:22:21.750808" elapsed="0.000454"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:21.752649" 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-10-16T01:22:21.747344" elapsed="0.005699"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:21.746830" elapsed="0.006331"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:21.606043" elapsed="0.147193"/>
</kw>
<msg time="2026-10-16T01:22:21.753318" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:21.753374" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:21.605452" elapsed="0.147957"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:21.753563" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:22:21.753478" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:21.753462" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:21.754006" 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-10-16T01:22:21.754307" elapsed="0.000037"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:21.754388" 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-10-16T01:22:21.604854" elapsed="0.149628"/>
</kw>
<msg time="2026-10-16T01:22:21.754566" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:21.754605" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:21.603032" elapsed="0.151609"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:21.754970" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:21.754751" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:21.754692" elapsed="0.000386"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:22:21.602895" elapsed="0.152205"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:21.757733" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:21.757631" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:21.757614" elapsed="0.000182"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:21.758912" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:21.758829" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:21.758812" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:21.759354" level="INFO">${karaf_connection_index} = 388</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:22:21.759116" elapsed="0.000263"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:21.759732" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:21.759539" elapsed="0.000218"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:21.797538" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:21.760321" elapsed="0.037426"/>
</kw>
<msg time="2026-10-16T01:22:21.797907" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:21.797948" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:21.759910" elapsed="0.038072"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:21.878382" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:21.798588" elapsed="0.079985"/>
</kw>
<msg time="2026-10-16T01:22:21.878767" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:21.878812" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:21.798146" elapsed="0.080702"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:21.879134" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:21.878922" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:21.878903" elapsed="0.000328"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:21.879806" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:21.879432" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:21.880150" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:21.879950" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:21.879933" elapsed="0.000311"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:21.880275" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:21.882799" 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-10-16T01:22:21.884524" elapsed="0.000464"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:21.886156" 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-10-16T01:22:21.881113" elapsed="0.005432"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:21.880561" elapsed="0.006099"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:21.758545" elapsed="0.128219"/>
</kw>
<msg time="2026-10-16T01:22:21.886851" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:21.886957" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:21.757943" elapsed="0.129051"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:21.887151" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:22:21.887065" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:21.887048" elapsed="0.000181"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:21.887562" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:21.887981" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:21.888047" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:22:21.757338" elapsed="0.130793"/>
</kw>
<msg time="2026-10-16T01:22:21.888215" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:21.888256" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:21.755368" elapsed="0.132926"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:21.888595" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:21.888378" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:21.888362" elapsed="0.000305"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:22:21.755211" elapsed="0.133477"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:21.891220" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:21.891135" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:21.891118" elapsed="0.000170"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:21.892609" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:21.892525" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:21.892508" elapsed="0.000164"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:21.893063" 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-10-16T01:22:21.892839" elapsed="0.000249"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:21.893440" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:21.893247" elapsed="0.000217"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:21.932675" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:21.894048" elapsed="0.038880"/>
</kw>
<msg time="2026-10-16T01:22:21.933152" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:21.933195" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:21.893618" elapsed="0.039610"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:22.001191" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:21.934196" elapsed="0.067282"/>
</kw>
<msg time="2026-10-16T01:22:22.001682" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:22.001760" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:21.933501" elapsed="0.068295"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:22.002190" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:22.001904" elapsed="0.000364"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.001872" elapsed="0.000426"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:22.003014" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:22.002583" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:22.003373" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:22.003158" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.003141" elapsed="0.000329"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:22.003506" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:22.006232" 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-10-16T01:22:22.008017" elapsed="0.000497"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:22.009822" 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-10-16T01:22:22.004443" elapsed="0.005761"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:22.003871" elapsed="0.006450"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:21.892245" elapsed="0.118174"/>
</kw>
<msg time="2026-10-16T01:22:22.010507" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:22.010549" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:21.891453" elapsed="0.119131"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:22.010762" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:22:22.010655" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.010638" 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-10-16T01:22:22.011179" 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-10-16T01:22:22.011508" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:22.011573" 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-10-16T01:22:21.890842" elapsed="0.120821"/>
</kw>
<msg time="2026-10-16T01:22:22.011773" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:22.011814" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:21.888950" elapsed="0.122900"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:22.012157" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:22.011921" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.011905" elapsed="0.000326"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:22:21.888814" elapsed="0.123439"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:22:21.602754" elapsed="0.409536"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:22:21.600646" elapsed="0.411720"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:22:21.598754" elapsed="0.413670"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:21.598352" elapsed="0.414116"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:22:21.597344" elapsed="0.415181"/>
</kw>
<kw name="Delete Sample Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:22:22.016871" 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-10-16T01:22:22.015618" elapsed="0.001290">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-10-16T01:22:21.596756" elapsed="0.420358">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-10-16T01:22:22.018682" elapsed="0.000219"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:22:22.018440" 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-10-16T01:22:22.019863" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:22.019777" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.019760" elapsed="0.000167"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:22.021802" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:22.021694" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.021678" elapsed="0.000187"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:22.022853" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:22.022509" elapsed="0.000369"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:22.023298" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:22.023028" elapsed="0.000294"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:22.023379" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:22:22.023506" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:22.022136" elapsed="0.001392"/>
</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-10-16T01:22:22.026060" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:22.025976" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.025959" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:22.027307" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:22.027224" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.027207" elapsed="0.000182"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:22.027782" level="INFO">${karaf_connection_index} = 386</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:22:22.027532" elapsed="0.000275"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:22.028182" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:22.027967" elapsed="0.000241"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:22.063495" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:22.028806" elapsed="0.034922"/>
</kw>
<msg time="2026-10-16T01:22:22.063917" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:22.063959" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:22.028379" elapsed="0.035614"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:22.114417" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:22.064655" elapsed="0.049943"/>
</kw>
<msg time="2026-10-16T01:22:22.114780" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:22.114822" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:22.064180" elapsed="0.050676"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:22.115157" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:22.114938" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.114915" elapsed="0.000339"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:22.115825" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:22.115458" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:22.116214" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:22.116018" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.116002" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:22.116359" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:22.118953" 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-10-16T01:22:22.120678" elapsed="0.000509"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:22.122459" 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-10-16T01:22:22.117233" elapsed="0.005629"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:22.116668" elapsed="0.006312"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:22.026891" elapsed="0.096168"/>
</kw>
<msg time="2026-10-16T01:22:22.123145" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:22.123186" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:22.026269" elapsed="0.096951"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:22.123388" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:22:22.123290" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.123273" elapsed="0.000195"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:22.123820" 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-10-16T01:22:22.124126" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:22.124190" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:22:22.025676" elapsed="0.098601"/>
</kw>
<msg time="2026-10-16T01:22:22.124377" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:22.124419" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:22.023884" elapsed="0.100569"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:22.124767" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:22.124521" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.124506" elapsed="0.000335"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:22:22.023744" elapsed="0.101119"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:22.127658" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:22.127574" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.127557" elapsed="0.000180"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:22.128843" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:22.128759" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.128741" elapsed="0.000164"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:22.129304" level="INFO">${karaf_connection_index} = 388</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:22:22.129047" elapsed="0.000282"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:22.129685" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:22.129505" elapsed="0.000336"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:22.165993" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:22.130428" elapsed="0.035764"/>
</kw>
<msg time="2026-10-16T01:22:22.166408" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:22.166451" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:22.129997" elapsed="0.036488"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:22.217261" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:22.167118" elapsed="0.050330"/>
</kw>
<msg time="2026-10-16T01:22:22.217606" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:22.217646" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:22.166655" elapsed="0.051024"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:22.217980" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:22.217779" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.217760" elapsed="0.000313"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:22.218610" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:22.218253" elapsed="0.000427"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:22.218971" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:22.218759" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.218742" elapsed="0.000322"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:22.219095" elapsed="0.000024"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:22.221540" 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-10-16T01:22:22.223300" elapsed="0.000487"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:22.224970" 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-10-16T01:22:22.219880" elapsed="0.005485"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:22.219379" elapsed="0.006107"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:22.128476" elapsed="0.097086"/>
</kw>
<msg time="2026-10-16T01:22:22.225642" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:22.225682" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:22.127883" elapsed="0.097860"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:22.225896" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:22:22.225813" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.225796" elapsed="0.000177"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:22.226280" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:22.226594" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:22.226658" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:22:22.127263" elapsed="0.099621"/>
</kw>
<msg time="2026-10-16T01:22:22.226968" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:22.227007" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:22.125119" elapsed="0.101922"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:22.227410" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:22.227108" elapsed="0.000354"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.227093" elapsed="0.000392"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:22:22.124984" elapsed="0.102523"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:22.231741" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:22.231639" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.231622" elapsed="0.000183"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:22.232909" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:22.232826" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.232809" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:22.233348" 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-10-16T01:22:22.233112" elapsed="0.000262"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:22.233726" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:22.233532" elapsed="0.000220"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:22.267990" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:22.234312" elapsed="0.033860"/>
</kw>
<msg time="2026-10-16T01:22:22.268345" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:22.268389" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:22.233905" elapsed="0.034518"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:22.333012" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:22.269040" elapsed="0.064143"/>
</kw>
<msg time="2026-10-16T01:22:22.333358" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:22.333401" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:22.268587" elapsed="0.064848"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:22.333744" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:22.333505" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.333487" elapsed="0.000352"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:22.334368" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:22.334018" elapsed="0.000422"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:22.334751" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:22.334500" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.334484" elapsed="0.000362"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:22.334877" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:22.337288" 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-10-16T01:22:22.338984" elapsed="0.000460"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:22.340729" elapsed="0.000307"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:22:22.335644" elapsed="0.005457"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:22.335145" elapsed="0.006072"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:22.232540" elapsed="0.108753"/>
</kw>
<msg time="2026-10-16T01:22:22.341399" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:22.341473" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:22.231952" elapsed="0.109558"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:22.341665" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:22:22.341580" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.341563" elapsed="0.000198"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:22.342074" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:22.342400" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:22.342464" 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-10-16T01:22:22.231346" elapsed="0.111202"/>
</kw>
<msg time="2026-10-16T01:22:22.342632" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:22.342671" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:22.227768" elapsed="0.114951"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:22.343004" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:22.342789" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.342773" elapsed="0.000302"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:22:22.227615" elapsed="0.115481"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:22:22.023581" elapsed="0.319541"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:22:22.021404" elapsed="0.321770"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:22:22.019498" elapsed="0.323726"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:22.019096" elapsed="0.324168"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:22:22.018088" elapsed="0.325223"/>
</kw>
<kw name="Kill_Single_Member" owner="ClusterManagement">
<msg time="2026-10-16T01:22:22.345232" 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-10-16T01:22:22.343553" elapsed="0.001717">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 the variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:22.345483" elapsed="0.000021"/>
</kw>
<doc>Kill Owner Instance and verify it is dead</doc>
<status status="FAIL" start="2026-10-16T01:22:22.017513" elapsed="0.328121">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-10-16T01:22:22.347115" elapsed="0.000198"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:22:22.346874" elapsed="0.000505"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:22.348285" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:22.348202" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.348185" elapsed="0.000183"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:22.350356" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:22.350257" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.350240" elapsed="0.000180"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:22.351309" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:22.350986" elapsed="0.000362"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:22.351788" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:22.351499" elapsed="0.000314"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:22.351853" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:22:22.351977" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:22.350619" elapsed="0.001381"/>
</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-10-16T01:22:22.354544" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:22.354459" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.354441" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:22.355692" elapsed="0.000039"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:22.355610" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.355593" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:22.356148" level="INFO">${karaf_connection_index} = 386</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:22:22.355925" elapsed="0.000248"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:22.356522" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:22.356344" elapsed="0.000202"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:22.388732" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:22.357142" elapsed="0.031786"/>
</kw>
<msg time="2026-10-16T01:22:22.389088" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:22.389128" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:22.356720" elapsed="0.032442"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:22.448082" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:22.389807" elapsed="0.058454"/>
</kw>
<msg time="2026-10-16T01:22:22.448439" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:22.448479" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:22.389325" elapsed="0.059188"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:22.448822" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:22.448586" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.448567" elapsed="0.000350"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:22.449461" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:22.449102" elapsed="0.000433"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:22.449808" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:22.449595" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.449579" elapsed="0.000323"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:22.449933" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:22.452394" elapsed="0.000496"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:22:22.454122" elapsed="0.000466"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:22.455792" 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-10-16T01:22:22.450724" elapsed="0.005452"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:22.450199" elapsed="0.006099"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:22.355355" elapsed="0.101031"/>
</kw>
<msg time="2026-10-16T01:22:22.456469" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:22.456542" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:22.354770" elapsed="0.101808"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:22.456748" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:22:22.456647" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.456630" elapsed="0.000197"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:22.457141" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:22.457457" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:22.457521" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:22:22.354154" elapsed="0.103451"/>
</kw>
<msg time="2026-10-16T01:22:22.457689" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:22.457745" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:22.352378" elapsed="0.105401"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:22.458062" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:22.457846" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.457830" elapsed="0.000303"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:22:22.352226" elapsed="0.105929"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:22.460684" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:22.460600" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.460582" 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-10-16T01:22:22.461884" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:22.461801" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.461784" elapsed="0.000164"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:22.462312" level="INFO">${karaf_connection_index} = 388</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:22:22.462089" elapsed="0.000262"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:22.462687" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:22.462511" elapsed="0.000524"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:22.496916" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:22.463627" elapsed="0.033918"/>
</kw>
<msg time="2026-10-16T01:22:22.498131" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:22.498231" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:22.463190" elapsed="0.035119"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:22.576614" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:22.500475" elapsed="0.076378"/>
</kw>
<msg time="2026-10-16T01:22:22.577018" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:22.577060" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:22.499093" elapsed="0.078001"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:22.577558" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:22.577226" elapsed="0.000410"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.577182" elapsed="0.000494"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:22.578271" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:22.577896" elapsed="0.000601"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:22.578782" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:22.578562" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.578544" elapsed="0.000335"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:22.578924" elapsed="0.000061"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:22.582065" 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-10-16T01:22:22.583855" elapsed="0.000528"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:22.585609" 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-10-16T01:22:22.580186" elapsed="0.005872"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:22.579472" elapsed="0.006706"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:22.461518" elapsed="0.124745"/>
</kw>
<msg time="2026-10-16T01:22:22.586406" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:22.586450" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:22.460919" elapsed="0.125566"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:22.586651" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-16T01:22:22.586562" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.586544" 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-10-16T01:22:22.587149" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:22.587676" elapsed="0.000040"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:22.587762" 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-10-16T01:22:22.460287" elapsed="0.127572"/>
</kw>
<msg time="2026-10-16T01:22:22.587961" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:22.588005" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:22.458416" elapsed="0.129625"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:22.588367" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:22.588118" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.588101" elapsed="0.000340"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:22:22.458264" elapsed="0.130201"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:22.591669" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:22.591584" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.591566" elapsed="0.000184"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:22.592876" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:22.592789" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.592772" elapsed="0.000167"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:22.593331" 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-10-16T01:22:22.593085" elapsed="0.000283"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:22.593767" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:22.593532" elapsed="0.000260"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:22.629831" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:22.594417" elapsed="0.035623"/>
</kw>
<msg time="2026-10-16T01:22:22.630201" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:22.630243" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:22.593946" elapsed="0.036331"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:22.696435" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:22.630908" elapsed="0.065779"/>
</kw>
<msg time="2026-10-16T01:22:22.696926" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:22.696969" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:22.630458" elapsed="0.066547"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:22.697408" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:22.697105" elapsed="0.000380"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.697073" elapsed="0.000440"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:22.698129" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:22.697717" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:22.698491" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:22.698273" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.698256" elapsed="0.000331"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:22.698621" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:22.701321" 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-10-16T01:22:22.703142" elapsed="0.000520"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:22.704904" elapsed="0.000372"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:22:22.699546" elapsed="0.005820"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:22.698989" elapsed="0.006499"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:22.592503" elapsed="0.113067"/>
</kw>
<msg time="2026-10-16T01:22:22.705659" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:22.705724" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:22.591899" elapsed="0.113861"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:22.705922" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:22:22.705834" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.705817" elapsed="0.000185"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:22.706460" 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-10-16T01:22:22.706907" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:22.706976" 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-10-16T01:22:22.591254" elapsed="0.115818"/>
</kw>
<msg time="2026-10-16T01:22:22.707162" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:22.707203" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:22.588796" elapsed="0.118515"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:22.707627" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:22.707401" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.707384" elapsed="0.000338"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:22:22.588621" elapsed="0.119126"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:22:22.352083" elapsed="0.355701"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:22:22.349968" elapsed="0.357888"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:22:22.347955" elapsed="0.359968"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:22.347522" elapsed="0.360453"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:22:22.346520" elapsed="0.361519"/>
</kw>
<kw name="Check Ovsdb Shards Status After Cluster Event" owner="ClusterOvsdb">
<msg time="2026-10-16T01:22:22.710227" 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-10-16T01:22:22.708260" elapsed="0.002005">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-10-16T01:22:22.345981" elapsed="0.364466">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-10-16T01:22:22.712354" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:22:22.712095" 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-10-16T01:22:22.713540" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:22.713451" elapsed="0.000132"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.713435" elapsed="0.000169"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:22.715525" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:22.715438" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.715422" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:22.716834" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:22.716457" elapsed="0.000424"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:22.717494" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:22.717034" elapsed="0.000488"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:22.717563" elapsed="0.000036"/>
</return>
<msg time="2026-10-16T01:22:22.717716" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:22.716077" elapsed="0.001664"/>
</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-10-16T01:22:22.720374" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:22.720268" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.720252" elapsed="0.000185"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:22.721829" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:22.721741" elapsed="0.000131"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.721723" elapsed="0.000170"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:22.722277" level="INFO">${karaf_connection_index} = 386</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:22:22.722036" elapsed="0.000266"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:22.722676" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:22.722485" elapsed="0.000233"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:22.754558" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:22.723303" elapsed="0.031472"/>
</kw>
<msg time="2026-10-16T01:22:22.754984" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:22.755027" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:22.722874" elapsed="0.032188"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:22.850209" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:22.755678" elapsed="0.094887"/>
</kw>
<msg time="2026-10-16T01:22:22.850837" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:22.850882" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:22.755229" elapsed="0.095688"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:22.851413" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:22.851047" elapsed="0.000445"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.851004" elapsed="0.000520"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:22.852202" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:22.851739" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:22.852574" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:22.852374" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.852356" elapsed="0.000313"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:22.852733" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:22.855588" 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-10-16T01:22:22.857411" elapsed="0.000589"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:22.859395" 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-10-16T01:22:22.853770" elapsed="0.006044"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:22.853134" elapsed="0.006799"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:22.721448" elapsed="0.138565"/>
</kw>
<msg time="2026-10-16T01:22:22.860102" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:22.860143" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:22.720583" elapsed="0.139595"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:22.860353" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-10-16T01:22:22.860251" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.860234" 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-10-16T01:22:22.860894" 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-10-16T01:22:22.861225" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:22.861291" 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-10-16T01:22:22.719981" elapsed="0.141416"/>
</kw>
<msg time="2026-10-16T01:22:22.861494" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:22.861537" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:22.718104" elapsed="0.143475"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:22.861984" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:22.861754" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.861735" elapsed="0.000321"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:22:22.717956" elapsed="0.144124"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:22.864967" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:22.864882" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.864865" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:22.866190" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:22.866105" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.866088" elapsed="0.000166"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:22.866655" level="INFO">${karaf_connection_index} = 388</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:22:22.866413" elapsed="0.000267"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:22.867054" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:22.866862" elapsed="0.000216"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:22.899736" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:22.867661" elapsed="0.032302"/>
</kw>
<msg time="2026-10-16T01:22:22.900164" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:22.900208" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:22.867230" elapsed="0.033012"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:22.988254" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:22.900996" elapsed="0.087491"/>
</kw>
<msg time="2026-10-16T01:22:22.988650" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:22.988692" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:22.900470" elapsed="0.088283"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:22.989086" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:22.988843" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.988814" elapsed="0.000375"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:22.989820" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:22.989423" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:22.990173" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:22.989976" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.989959" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:22.990302" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:22.993018" elapsed="0.000497"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:22:22.994808" elapsed="0.000505"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:22.996749" 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-10-16T01:22:22.991251" elapsed="0.005895"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:22.990680" elapsed="0.006782"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:22.865797" elapsed="0.131751"/>
</kw>
<msg time="2026-10-16T01:22:22.997637" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:22.997678" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:22.865175" elapsed="0.132617"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:22.997956" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-16T01:22:22.997867" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.997850" elapsed="0.000188"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:22.998408" 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-10-16T01:22:22.998741" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:22.998807" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:22:22.864555" elapsed="0.134341"/>
</kw>
<msg time="2026-10-16T01:22:22.998988" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:22.999031" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:22.862385" elapsed="0.136680"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:22.999379" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:22.999136" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:22.999120" elapsed="0.000332"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:22:22.862225" elapsed="0.137250"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:23.002320" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:23.002235" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:23.002218" elapsed="0.000182"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:23.003503" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:23.003420" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:23.003403" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:23.003975" 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-10-16T01:22:23.003731" elapsed="0.000269"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:23.004367" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:23.004161" elapsed="0.000231"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:23.039019" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:23.004987" elapsed="0.034212"/>
</kw>
<msg time="2026-10-16T01:22:23.039374" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:23.039417" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:23.004544" elapsed="0.034907"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:23.136801" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:23.040073" elapsed="0.096986"/>
</kw>
<msg time="2026-10-16T01:22:23.137261" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:23.137304" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:23.039614" elapsed="0.097744"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:23.137862" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:23.137553" elapsed="0.000389"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:23.137520" elapsed="0.000451"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:23.138600" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:23.138157" elapsed="0.000531"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:23.138971" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:23.138771" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:23.138753" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:23.139101" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:23.141922" 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-10-16T01:22:23.143736" elapsed="0.000499"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:23.145655" 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-10-16T01:22:23.140045" elapsed="0.006035"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:23.139470" elapsed="0.006956"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:23.003146" elapsed="0.143360"/>
</kw>
<msg time="2026-10-16T01:22:23.146594" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:23.146635" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:23.002546" elapsed="0.144123"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:23.146876" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:22:23.146789" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:23.146772" elapsed="0.000183"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:23.147306" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:23.147633" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:23.147818" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:22:23.001930" elapsed="0.145982"/>
</kw>
<msg time="2026-10-16T01:22:23.148001" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:23.148042" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:22.999860" elapsed="0.148216"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:23.148384" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:23.148146" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:23.148131" elapsed="0.000326"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:22:22.999616" elapsed="0.148864"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:22:22.717799" elapsed="0.430718"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:22:22.715130" elapsed="0.433451"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:22:22.713173" elapsed="0.435471"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:22.712777" elapsed="0.435916"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:22:22.711753" elapsed="0.437050"/>
</kw>
<kw name="Get Ovsdb Entity Owner Status For One Device" owner="ClusterOvsdb">
<msg time="2026-10-16T01:22:23.152983" level="FAIL">Variable '${ovsdb_uuid}' 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-10-16T01:22:23.151750" elapsed="0.001271">Variable '${ovsdb_uuid}' 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-10-16T01:22:23.153203" elapsed="0.000021"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${new_owner}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:23.153427" elapsed="0.000019"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${new_candidate}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:23.153617" elapsed="0.000018"/>
</kw>
<doc>Check Entity Owner Status and identify owner and candidate.</doc>
<status status="FAIL" start="2026-10-16T01:22:22.711162" elapsed="0.442648">Variable '${ovsdb_uuid}' 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-10-16T01:22:23.155256" elapsed="0.000228"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:22:23.155008" 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-10-16T01:22:23.156514" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:23.156424" elapsed="0.000133"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:23.156407" elapsed="0.000171"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:23.158490" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:23.158404" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:23.158387" elapsed="0.000166"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:23.159519" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:23.159141" elapsed="0.000404"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:23.160057" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:23.159783" elapsed="0.000297"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:23.160122" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:22:23.160247" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:23.158779" 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-10-16T01:22:23.162899" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:23.162814" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:23.162797" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:23.164063" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:23.163979" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:23.163963" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:23.164526" level="INFO">${karaf_connection_index} = 386</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:22:23.164269" elapsed="0.000281"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:23.164919" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:23.164729" elapsed="0.000214"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:23.198401" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:23.165535" elapsed="0.033042"/>
</kw>
<msg time="2026-10-16T01:22:23.198762" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:23.198805" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:23.165101" elapsed="0.033737"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:23.271646" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:23.199449" elapsed="0.073937"/>
</kw>
<msg time="2026-10-16T01:22:23.273728" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:23.273776" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:23.199003" elapsed="0.074810"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:23.274446" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:23.273968" elapsed="0.000561"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:23.273919" elapsed="0.000643"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:23.275335" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:23.274776" elapsed="0.000660"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:23.275725" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:23.275499" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:23.275482" elapsed="0.000339"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:23.275862" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:23.278919" 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-10-16T01:22:23.280814" elapsed="0.000547"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:23.282791" 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-10-16T01:22:23.276925" 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-10-16T01:22:23.276284" elapsed="0.007048"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:23.163722" elapsed="0.119722"/>
</kw>
<msg time="2026-10-16T01:22:23.283550" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:23.283598" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:23.163109" elapsed="0.120529"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:23.283911" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-10-16T01:22:23.283810" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:23.283787" 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-10-16T01:22:23.284481" 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-10-16T01:22:23.284917" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:23.284997" 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-10-16T01:22:23.162511" elapsed="0.122590"/>
</kw>
<msg time="2026-10-16T01:22:23.285217" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:23.285271" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:23.160638" elapsed="0.124680"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:23.285865" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:23.285442" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:23.285420" elapsed="0.000547"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:22:23.160497" elapsed="0.125500"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:23.289629" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:23.289539" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:23.289519" 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-10-16T01:22:23.291612" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:23.291524" elapsed="0.000131"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:23.291506" elapsed="0.000170"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:23.292107" level="INFO">${karaf_connection_index} = 388</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:22:23.291852" elapsed="0.000282"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:23.292508" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:23.292296" elapsed="0.000237"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:23.325604" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:23.293128" elapsed="0.032741"/>
</kw>
<msg time="2026-10-16T01:22:23.326078" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:23.326120" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:23.292687" elapsed="0.033467"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:23.394852" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:23.326926" elapsed="0.068153"/>
</kw>
<msg time="2026-10-16T01:22:23.395270" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:23.395315" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:23.326397" elapsed="0.068972"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:23.395743" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:23.395471" elapsed="0.000346"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:23.395440" elapsed="0.000409"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:23.396441" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:23.396043" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:23.396803" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:23.396587" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:23.396571" elapsed="0.000327"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:23.396933" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:23.399814" 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-10-16T01:22:23.401657" elapsed="0.000540"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:23.403582" 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-10-16T01:22:23.397997" elapsed="0.005999"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:23.397320" elapsed="0.006793"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:23.291175" elapsed="0.113019"/>
</kw>
<msg time="2026-10-16T01:22:23.404282" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:23.404324" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:23.290128" elapsed="0.114248"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:23.404536" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-10-16T01:22:23.404449" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:23.404432" elapsed="0.000187"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:23.405163" 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-10-16T01:22:23.405495" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:23.405562" 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-10-16T01:22:23.288983" elapsed="0.116676"/>
</kw>
<msg time="2026-10-16T01:22:23.405770" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:23.405812" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:23.286370" elapsed="0.119476"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:23.406139" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:23.405916" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:23.405900" elapsed="0.000310"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:22:23.286177" elapsed="0.120055"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:23.411545" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:23.411460" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:23.411443" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:23.412744" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:23.412634" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:23.412617" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:23.413281" 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-10-16T01:22:23.413037" elapsed="0.000268"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:23.413671" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:23.413483" elapsed="0.000230"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:23.447852" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:23.414284" elapsed="0.033753"/>
</kw>
<msg time="2026-10-16T01:22:23.448292" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:23.448334" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:23.413870" elapsed="0.034516"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:23.523384" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:23.449006" elapsed="0.074916"/>
</kw>
<msg time="2026-10-16T01:22:23.524246" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:23.524293" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:23.448551" elapsed="0.075777"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:23.525484" elapsed="0.000545"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:23.525029" elapsed="0.001061"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:23.524457" elapsed="0.001665"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:23.526899" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:23.526317" elapsed="0.000677"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:23.527258" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:23.527059" elapsed="0.000398"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:23.527042" elapsed="0.000440"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:23.527523" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:23.531142" 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-10-16T01:22:23.533015" elapsed="0.000556"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:23.534829" 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-10-16T01:22:23.528625" elapsed="0.006785"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:23.527968" elapsed="0.007566"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:23.412376" elapsed="0.123239"/>
</kw>
<msg time="2026-10-16T01:22:23.535745" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:23.535791" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:23.411772" elapsed="0.124054"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:23.535989" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-10-16T01:22:23.535901" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:23.535884" elapsed="0.000191"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:23.536467" 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-10-16T01:22:23.537110" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:23.537178" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:22:23.411135" elapsed="0.126132"/>
</kw>
<msg time="2026-10-16T01:22:23.537374" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:23.537418" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:23.406538" elapsed="0.130914"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:23.537784" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:23.537525" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:23.537509" elapsed="0.000347"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:22:23.406397" elapsed="0.131482"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:22:23.160325" elapsed="0.377594"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:22:23.158094" elapsed="0.379891"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:22:23.156094" elapsed="0.381949"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:23.155679" elapsed="0.382411"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:22:23.154647" elapsed="0.383497"/>
</kw>
<kw name="Create Sample Bridge Manually And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:22:23.541364" 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-10-16T01:22:23.539987" elapsed="0.001417">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-10-16T01:22:23.154070" elapsed="0.387504">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-10-16T01:22:23.543019" elapsed="0.000203"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:22:23.542774" elapsed="0.000497"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:23.544262" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:23.544176" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:23.544159" elapsed="0.000166"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:23.546299" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:23.546175" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:23.546158" elapsed="0.000253"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:23.547497" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:23.547147" elapsed="0.000375"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:23.547965" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:23.547675" elapsed="0.000314"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:23.548030" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:22:23.548157" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:23.546683" 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-10-16T01:22:23.550881" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:23.550797" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:23.550780" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:23.552372" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:23.552269" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:23.552251" elapsed="0.000186"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:23.552848" level="INFO">${karaf_connection_index} = 386</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:22:23.552584" elapsed="0.000289"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:23.553228" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:23.553038" elapsed="0.000215"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:23.586480" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:23.553863" elapsed="0.032819"/>
</kw>
<msg time="2026-10-16T01:22:23.586864" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:23.586906" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:23.553423" elapsed="0.033517"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:23.655523" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:23.587553" elapsed="0.068189"/>
</kw>
<msg time="2026-10-16T01:22:23.655911" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:23.655953" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:23.587104" elapsed="0.068884"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:23.656277" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:23.656063" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:23.656042" elapsed="0.000350"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:23.656962" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:23.656584" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:23.657310" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:23.657111" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:23.657094" elapsed="0.000365"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:23.657494" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:23.660080" 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-10-16T01:22:23.661849" elapsed="0.000464"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:23.663546" elapsed="0.000360"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:22:23.658369" elapsed="0.005608"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:23.657836" elapsed="0.006263"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:23.551871" elapsed="0.112306"/>
</kw>
<msg time="2026-10-16T01:22:23.664261" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:23.664305" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:23.551091" elapsed="0.113248"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:23.664517" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-10-16T01:22:23.664430" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:23.664409" elapsed="0.000190"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:23.665146" 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-10-16T01:22:23.665470" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:23.665536" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:22:23.550491" elapsed="0.115131"/>
</kw>
<msg time="2026-10-16T01:22:23.665724" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:23.665766" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:23.548554" elapsed="0.117248"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:23.666092" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:23.665869" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:23.665854" elapsed="0.000310"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:22:23.548411" elapsed="0.117774"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:23.668904" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:23.668819" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:23.668801" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:23.670072" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:23.669987" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:23.669971" elapsed="0.000164"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:23.670527" level="INFO">${karaf_connection_index} = 388</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:22:23.670277" elapsed="0.000274"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:23.670908" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:23.670729" elapsed="0.000203"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:23.704965" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:23.671518" elapsed="0.033629"/>
</kw>
<msg time="2026-10-16T01:22:23.705308" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:23.705366" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:23.671087" elapsed="0.034314"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:23.795600" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:23.706076" elapsed="0.089964"/>
</kw>
<msg time="2026-10-16T01:22:23.796335" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:23.796399" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:23.705615" elapsed="0.090822"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:23.797051" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:23.796598" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:23.796541" elapsed="0.000632"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:23.798163" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:23.797566" elapsed="0.000684"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:23.798539" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:23.798315" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:23.798298" elapsed="0.000338"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:23.798676" elapsed="0.000073"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:23.801783" 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-10-16T01:22:23.803630" elapsed="0.000562"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:23.805633" 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-10-16T01:22:23.799804" elapsed="0.006252"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:23.799140" elapsed="0.007039"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:23.669731" elapsed="0.136534"/>
</kw>
<msg time="2026-10-16T01:22:23.806377" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:23.806425" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:23.669113" elapsed="0.137348"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:23.806626" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-10-16T01:22:23.806537" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:23.806518" elapsed="0.000275"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:23.807172" 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-10-16T01:22:23.807530" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:23.807601" 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-10-16T01:22:23.668509" elapsed="0.139203"/>
</kw>
<msg time="2026-10-16T01:22:23.807811" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:23.807856" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:23.666468" elapsed="0.141428"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:23.808224" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:23.807967" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:23.807951" elapsed="0.000351"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:22:23.666306" elapsed="0.142124"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:23.811525" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:23.811400" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:23.811373" 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-10-16T01:22:23.813125" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:23.813038" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:23.813021" elapsed="0.000167"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:23.813609" 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-10-16T01:22:23.813334" elapsed="0.000301"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:23.814015" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:23.813818" elapsed="0.000222"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:23.865401" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:23.814647" elapsed="0.050938"/>
</kw>
<msg time="2026-10-16T01:22:23.865772" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:23.865814" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:23.814196" elapsed="0.051653"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:23.951976" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:23.866594" elapsed="0.085644"/>
</kw>
<msg time="2026-10-16T01:22:23.952465" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:23.952510" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:23.866018" elapsed="0.086527"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:23.952976" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:23.952653" elapsed="0.000400"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:23.952620" elapsed="0.000460"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:23.953739" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:23.953269" elapsed="0.000571"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:23.954098" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:23.953901" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:23.953885" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:23.954230" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:23.957062" 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-10-16T01:22:23.959111" elapsed="0.000532"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:23.961080" 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-10-16T01:22:23.955210" elapsed="0.006292"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:23.954625" elapsed="0.007000"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:23.812773" elapsed="0.149011"/>
</kw>
<msg time="2026-10-16T01:22:23.961877" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:23.961918" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:23.811821" elapsed="0.150133"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:23.962217" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:22:23.962128" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:23.962110" elapsed="0.000187"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:23.962668" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:23.963003" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:23.963074" 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-10-16T01:22:23.811001" elapsed="0.152163"/>
</kw>
<msg time="2026-10-16T01:22:23.963257" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:23.963300" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:23.808841" elapsed="0.154494"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:23.963645" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:23.963424" elapsed="0.000392"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:23.963407" elapsed="0.000436"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:22:23.808587" elapsed="0.155279"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:22:23.548236" elapsed="0.415669"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:22:23.545832" elapsed="0.418136"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:22:23.543858" elapsed="0.420171"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:23.543437" elapsed="0.420641"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:22:23.542412" elapsed="0.421724"/>
</kw>
<kw name="Add Sample Port To The Manual Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:22:23.971624" 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-10-16T01:22:23.968299" elapsed="0.003471">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-10-16T01:22:23.541857" elapsed="0.430296">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-10-16T01:22:23.975561" elapsed="0.000632"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:22:23.974927" elapsed="0.001390"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:23.978895" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:23.978629" elapsed="0.000380"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:23.978574" elapsed="0.000485"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:23.983450" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:23.983236" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:23.983198" elapsed="0.000393"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:23.985759" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:23.984951" elapsed="0.000868"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:23.986872" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:23.986157" elapsed="0.000771"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:23.987021" elapsed="0.000063"/>
</return>
<msg time="2026-10-16T01:22:23.987318" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:23.984085" elapsed="0.003307"/>
</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-10-16T01:22:23.993328" elapsed="0.000053"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:23.993138" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:23.993099" 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-10-16T01:22:23.996127" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:23.995938" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:23.995901" elapsed="0.000368"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:23.997193" level="INFO">${karaf_connection_index} = 386</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:22:23.996647" elapsed="0.000602"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:23.998107" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:23.997649" elapsed="0.000512"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:24.026267" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:23.999620" elapsed="0.026926"/>
</kw>
<msg time="2026-10-16T01:22:24.026799" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:24.026858" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:23.998590" elapsed="0.028315"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:24.082527" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:24.027822" elapsed="0.055428"/>
</kw>
<msg time="2026-10-16T01:22:24.083813" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:24.083918" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:24.027139" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:24.085022" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:24.084244" elapsed="0.000950"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:24.084169" elapsed="0.001088"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:24.086817" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:24.085741" elapsed="0.001282"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:24.087628" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:24.087160" elapsed="0.000736"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:24.087124" elapsed="0.000828"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:24.088032" elapsed="0.000086"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:24.094693" elapsed="0.001253"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:22:24.097867" elapsed="0.000735"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:24.100570" elapsed="0.000476"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:22:24.090137" elapsed="0.011005"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:24.088860" elapsed="0.012563"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:23.995262" elapsed="0.106280"/>
</kw>
<msg time="2026-10-16T01:22:24.101682" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:24.101857" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:23.993857" elapsed="0.108056"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:24.102281" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-10-16T01:22:24.102155" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:24.102127" elapsed="0.000296"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:24.102952" 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-10-16T01:22:24.103428" elapsed="0.000032"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:24.103520" elapsed="0.000021"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:22:23.992457" elapsed="0.111190"/>
</kw>
<msg time="2026-10-16T01:22:24.103881" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:24.104037" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:23.988203" elapsed="0.115931"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:24.104822" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:24.104376" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:24.104316" elapsed="0.000609"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:22:23.987889" elapsed="0.117069"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:24.116096" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:24.115334" elapsed="0.000872"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:24.115260" elapsed="0.000982"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:24.118538" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:24.118410" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:24.118382" elapsed="0.000249"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:24.119233" level="INFO">${karaf_connection_index} = 388</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:22:24.118865" elapsed="0.000406"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:24.119838" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:24.119531" elapsed="0.000342"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:24.155293" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:24.120824" elapsed="0.034724"/>
</kw>
<msg time="2026-10-16T01:22:24.155791" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:24.155836" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:24.120090" elapsed="0.035780"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:24.223523" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:24.156809" elapsed="0.067060"/>
</kw>
<msg time="2026-10-16T01:22:24.224117" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:24.224160" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:24.156106" elapsed="0.068089"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:24.224664" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:24.224328" elapsed="0.000434"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:24.224284" elapsed="0.000511"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:24.225479" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:24.224994" elapsed="0.000571"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:24.225934" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:24.225730" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:24.225694" elapsed="0.000337"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:24.226069" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:24.228897" 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-10-16T01:22:24.230692" elapsed="0.000520"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:24.232442" 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-10-16T01:22:24.227067" elapsed="0.005823"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:24.226481" elapsed="0.006526"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:24.117973" elapsed="0.115120"/>
</kw>
<msg time="2026-10-16T01:22:24.233190" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:24.233232" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:24.116627" elapsed="0.116640"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:24.233446" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:22:24.233345" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:24.233328" elapsed="0.000197"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:24.233900" 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-10-16T01:22:24.234230" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:24.234295" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:22:24.108287" elapsed="0.126116"/>
</kw>
<msg time="2026-10-16T01:22:24.234500" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:24.234559" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:24.105379" elapsed="0.129218"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:24.234922" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:24.234674" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:24.234657" elapsed="0.000339"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:22:24.105161" elapsed="0.129858"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:24.238141" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:24.238034" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:24.238017" elapsed="0.000188"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:24.239348" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:24.239264" elapsed="0.000136"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:24.239248" elapsed="0.000173"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:24.239889" 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-10-16T01:22:24.239562" elapsed="0.000351"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:24.240261" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:24.240075" elapsed="0.000210"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:24.276431" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:24.240886" elapsed="0.035714"/>
</kw>
<msg time="2026-10-16T01:22:24.276813" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:24.276892" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:24.240451" elapsed="0.036477"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:24.341480" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:24.277533" elapsed="0.064114"/>
</kw>
<msg time="2026-10-16T01:22:24.341843" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:24.341884" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:24.277094" elapsed="0.064823"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:24.342186" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:24.341986" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:24.341968" elapsed="0.000314"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:24.342829" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:24.342477" elapsed="0.000430"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:24.343163" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:24.342967" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:24.342951" elapsed="0.000304"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:24.343285" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:24.345907" 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-10-16T01:22:24.347633" elapsed="0.000462"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:24.349257" 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-10-16T01:22:24.344247" elapsed="0.005391"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:24.343760" elapsed="0.006017"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:24.238999" elapsed="0.110857"/>
</kw>
<msg time="2026-10-16T01:22:24.349937" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:24.349976" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:24.238384" elapsed="0.111628"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:24.350164" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:22:24.350080" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:24.350063" elapsed="0.000177"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:24.350568" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:24.350890" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:24.350955" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:22:24.237692" elapsed="0.113347"/>
</kw>
<msg time="2026-10-16T01:22:24.351121" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:24.351160" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:24.235303" elapsed="0.115893"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:24.351546" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:24.351263" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:24.351247" elapsed="0.000373"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:22:24.235161" elapsed="0.116481"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:22:23.987516" elapsed="0.364154"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:22:23.982550" elapsed="0.369203"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:22:23.977989" elapsed="0.373822"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:23.976683" elapsed="0.375175"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:22:23.974037" elapsed="0.377878"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:24.354264" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:24.354024" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:24.353841" elapsed="0.000500"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:24.354696" 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-10-16T01:22:24.354809" 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-10-16T01:22:24.354555" elapsed="0.000278"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:24.355309" level="INFO">Attempting to execute command "ip tuntap add mode tap vport1" on remote system "10.30.171.104" 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-10-16T01:22:24.355020" elapsed="0.000347"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:24.356023" level="INFO">${conn_id} = 481</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-10-16T01:22:24.355542" elapsed="0.000506"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:22:24.356918" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:22:24.356988" 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-10-16T01:22:24.356613" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:24.357157" elapsed="0.000308"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:22:24.358448" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:22:24.735301" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:21:48 UTC 2026

  System load:  0.12               Processes:             106
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:22:09 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:22:24.358195" elapsed="0.377437"/>
</kw>
<msg time="2026-10-16T01:22:24.735793" 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-10-16T01:22:24.357627" elapsed="0.378324"/>
</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-10-16T01:22:24.356243" elapsed="0.379913"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:22:24.737180" level="INFO">Executing command 'ip tuntap add mode tap vport1'.</msg>
<msg time="2026-10-16T01:22:24.750104" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-10-16T01:22:24.750285" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:22:24.750343" 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-10-16T01:22:24.736695" elapsed="0.013697"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:24.750616" elapsed="0.000352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:24.752063" 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-10-16T01:22:24.751553" elapsed="0.000569"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:22:24.752517" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:24.752268" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:24.752220" elapsed="0.000419"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:22:24.752855" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-10-16T01:22:24.752733" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:24.752692" elapsed="0.000273"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:22:24.753048" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:24.754417" 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-10-16T01:22:24.755151" elapsed="0.000250"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:24.755597" elapsed="0.000144"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:22:24.753620" elapsed="0.002187"/>
</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-10-16T01:22:24.353426" elapsed="0.402481"/>
</kw>
<msg time="2026-10-16T01:22:24.755980" 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-10-16T01:22:24.352895" elapsed="0.403156"/>
</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-10-16T01:22:24.352461" elapsed="0.403707"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:24.759297" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:24.758958" elapsed="0.000430"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:24.758932" elapsed="0.000489"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:24.759917" 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-10-16T01:22:24.760051" 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-10-16T01:22:24.759691" elapsed="0.000394"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:24.760817" level="INFO">Attempting to execute command "ip tuntap add mode tap vport2" on remote system "10.30.171.104" 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-10-16T01:22:24.760345" elapsed="0.000532"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:24.761585" level="INFO">${conn_id} = 483</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-10-16T01:22:24.761127" elapsed="0.000492"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:22:24.762851" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:22:24.762948" 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-10-16T01:22:24.762432" elapsed="0.000545"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:24.763182" elapsed="0.000477"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:22:24.764994" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:22:25.139600" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:21:48 UTC 2026

  System load:  0.12               Processes:             106
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:22:24 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:22:24.764608" elapsed="0.375369"/>
</kw>
<msg time="2026-10-16T01:22:25.140081" 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-10-16T01:22:24.763952" elapsed="0.376239"/>
</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-10-16T01:22:24.761913" elapsed="0.378415"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:22:25.141020" level="INFO">Executing command 'ip tuntap add mode tap vport2'.</msg>
<msg time="2026-10-16T01:22:25.154141" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-10-16T01:22:25.154266" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:22:25.154307" 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-10-16T01:22:25.140719" elapsed="0.013611"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:25.154520" elapsed="0.000279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:25.155424" 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-10-16T01:22:25.155092" elapsed="0.000376"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:22:25.155746" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:25.155560" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:25.155533" elapsed="0.000292"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:22:25.155960" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:22:25.155874" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:25.155859" elapsed="0.000182"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:22:25.156072" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:25.156920" elapsed="0.000316"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:22:25.157436" elapsed="0.000160"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:25.157757" elapsed="0.000090"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:22:25.156431" elapsed="0.001463"/>
</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-10-16T01:22:24.758319" elapsed="0.399646"/>
</kw>
<msg time="2026-10-16T01:22:25.158016" 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-10-16T01:22:24.757118" elapsed="0.400944"/>
</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-10-16T01:22:24.756447" elapsed="0.401688"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:25.160302" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:25.160038" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:25.160020" elapsed="0.000383"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:25.160756" 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-10-16T01:22:25.160850" 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-10-16T01:22:25.160605" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:25.161348" level="INFO">Attempting to execute command "ifconfig vport1 up" on remote system "10.30.171.104" 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-10-16T01:22:25.161060" elapsed="0.000346"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:25.161901" 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-10-16T01:22:25.161580" elapsed="0.000345"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:22:25.162776" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:22:25.162848" 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-10-16T01:22:25.162485" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:25.163068" elapsed="0.000305"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:22:25.164157" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:22:25.569255" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:21:48 UTC 2026

  System load:  0.12               Processes:             106
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:22:25 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:22:25.163922" elapsed="0.405612"/>
</kw>
<msg time="2026-10-16T01:22:25.569653" 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-10-16T01:22:25.163537" elapsed="0.406263"/>
</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-10-16T01:22:25.162117" elapsed="0.407841"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:22:25.570778" level="INFO">Executing command 'ifconfig vport1 up'.</msg>
<msg time="2026-10-16T01:22:25.584317" level="INFO">Command exited with return code 255.</msg>
<msg time="2026-10-16T01:22:25.584479" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:22:25.584521" 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-10-16T01:22:25.570387" elapsed="0.014157"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:25.584731" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:25.585931" 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-10-16T01:22:25.585439" elapsed="0.000552"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:22:25.586352" elapsed="0.000041"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:25.586131" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:25.586086" elapsed="0.000406"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:22:25.586681" elapsed="0.000055"/>
</return>
<status status="PASS" start="2026-10-16T01:22:25.586564" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:25.586544" elapsed="0.000270"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:22:25.586860" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:25.588102" 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-10-16T01:22:25.588860" elapsed="0.003365"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:25.592461" 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-10-16T01:22:25.587346" elapsed="0.005315"/>
</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-10-16T01:22:25.159593" elapsed="0.433188"/>
</kw>
<msg time="2026-10-16T01:22:25.592849" 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-10-16T01:22:25.158779" elapsed="0.434133"/>
</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-10-16T01:22:25.158316" elapsed="0.434693"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:25.595649" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:25.595290" elapsed="0.000457"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:25.595265" elapsed="0.000516"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:25.596245" 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-10-16T01:22:25.596505" 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-10-16T01:22:25.596049" elapsed="0.000492"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:25.597408" level="INFO">Attempting to execute command "ifconfig vport2 up" on remote system "10.30.171.104" 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-10-16T01:22:25.596886" elapsed="0.000586"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:25.598298" 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-10-16T01:22:25.597753" elapsed="0.000588"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:22:25.599613" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:22:25.599740" 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-10-16T01:22:25.599187" elapsed="0.000588"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:25.599988" elapsed="0.000520"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:22:25.601744" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:22:25.988247" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:21:48 UTC 2026

  System load:  0.12               Processes:             106
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:22:25 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:22:25.601342" elapsed="0.387724"/>
</kw>
<msg time="2026-10-16T01:22:25.989722" 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-10-16T01:22:25.600804" elapsed="0.389046"/>
</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-10-16T01:22:25.598655" elapsed="0.391337"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:22:25.991224" level="INFO">Executing command 'ifconfig vport2 up'.</msg>
<msg time="2026-10-16T01:22:26.004604" level="INFO">Command exited with return code 255.</msg>
<msg time="2026-10-16T01:22:26.004764" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:22:26.004807" 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-10-16T01:22:25.990898" elapsed="0.013933"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:26.004999" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:26.005978" 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-10-16T01:22:26.005605" elapsed="0.000416"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:22:26.006306" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:26.006126" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:26.006092" 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-10-16T01:22:26.006546" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-10-16T01:22:26.006461" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:26.006446" elapsed="0.000185"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:22:26.006664" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:26.007885" 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-10-16T01:22:26.008403" elapsed="0.000167"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:26.008726" elapsed="0.000090"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:22:26.007406" elapsed="0.001459"/>
</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-10-16T01:22:25.594678" elapsed="0.414256"/>
</kw>
<msg time="2026-10-16T01:22:26.009092" 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-10-16T01:22:25.593888" elapsed="0.415260"/>
</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-10-16T01:22:25.593255" elapsed="0.415971"/>
</kw>
<doc>Create Tap Device vport1 and vport2 to add to the bridge br-s1 using OVS command.</doc>
<status status="PASS" start="2026-10-16T01:22:24.352122" elapsed="1.657168"/>
</kw>
<doc>Create tap devices to add to the bridge in ovs</doc>
<status status="PASS" start="2026-10-16T01:22:23.972741" elapsed="2.037284"/>
</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-10-16T01:22:26.015242" elapsed="0.000445"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:22:26.014918" elapsed="0.000862"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:26.017021" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:26.016873" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:26.016843" elapsed="0.000261"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:26.019194" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:26.019108" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:26.019092" elapsed="0.000165"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:26.020266" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:26.019906" elapsed="0.000390"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:26.020774" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:26.020467" elapsed="0.000332"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:26.020841" elapsed="0.000042"/>
</return>
<msg time="2026-10-16T01:22:26.020988" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:26.019486" 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-10-16T01:22:26.023783" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:26.023678" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:26.023660" elapsed="0.000187"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:26.025190" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:26.025102" elapsed="0.000132"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:26.025085" elapsed="0.000170"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:26.025687" level="INFO">${karaf_connection_index} = 386</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:22:26.025428" elapsed="0.000304"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:26.026111" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:26.025906" elapsed="0.000229"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:26.067133" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:26.026779" elapsed="0.040550"/>
</kw>
<msg time="2026-10-16T01:22:26.067524" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:26.067566" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:26.026292" elapsed="0.041310"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:26.138234" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:26.068238" elapsed="0.070206"/>
</kw>
<msg time="2026-10-16T01:22:26.138612" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:26.138653" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:26.067793" elapsed="0.070897"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:26.139120" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:26.138896" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:26.138867" elapsed="0.000360"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:26.161611" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:26.145648" elapsed="0.017190"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:26.163526" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:26.163038" elapsed="0.000641"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:26.162989" elapsed="0.000751"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:26.163782" elapsed="0.000058"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:26.166868" 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-10-16T01:22:26.168685" elapsed="0.000604"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:26.170646" 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-10-16T01:22:26.164960" elapsed="0.006100"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:26.164216" elapsed="0.006967"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:26.024833" elapsed="0.146435"/>
</kw>
<msg time="2026-10-16T01:22:26.171391" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:26.171438" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:26.023996" elapsed="0.147480"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:26.171650" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-10-16T01:22:26.171552" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:26.171535" 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-10-16T01:22:26.172196" 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-10-16T01:22:26.172541" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:26.172610" 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-10-16T01:22:26.023365" elapsed="0.149357"/>
</kw>
<msg time="2026-10-16T01:22:26.172820" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:26.172863" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:26.021401" elapsed="0.151505"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:26.173205" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:26.172979" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:26.172963" elapsed="0.000316"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:22:26.021235" elapsed="0.152067"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:26.177157" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:26.177068" elapsed="0.000133"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:26.177050" elapsed="0.000173"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:26.178352" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:26.178266" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:26.178250" elapsed="0.000178"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:26.178954" level="INFO">${karaf_connection_index} = 388</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:22:26.178675" elapsed="0.000305"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:26.179331" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:26.179144" elapsed="0.000212"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:26.215088" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:26.179975" elapsed="0.035308"/>
</kw>
<msg time="2026-10-16T01:22:26.215462" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:26.215504" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:26.179531" elapsed="0.036010"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:26.287071" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:26.216153" elapsed="0.071303"/>
</kw>
<msg time="2026-10-16T01:22:26.287757" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:26.287818" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:26.215722" elapsed="0.072141"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:26.288488" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:26.288051" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:26.287984" elapsed="0.000624"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:26.289361" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:26.288832" elapsed="0.000648"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:26.289769" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:26.289543" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:26.289525" elapsed="0.000341"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:26.289905" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:26.293275" elapsed="0.000662"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:22:26.295256" elapsed="0.000754"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:26.297204" 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-10-16T01:22:26.290977" elapsed="0.006650"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:26.290327" elapsed="0.007511"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:26.178001" elapsed="0.119926"/>
</kw>
<msg time="2026-10-16T01:22:26.298026" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:26.298069" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:26.177387" elapsed="0.120721"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:26.298277" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-10-16T01:22:26.298184" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:26.298166" 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-10-16T01:22:26.298804" 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-10-16T01:22:26.299249" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:26.299317" 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-10-16T01:22:26.176381" elapsed="0.123051"/>
</kw>
<msg time="2026-10-16T01:22:26.299530" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:26.299575" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:26.173618" elapsed="0.125995"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:26.300049" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:26.299687" elapsed="0.000412"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:26.299670" elapsed="0.000453"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:22:26.173470" elapsed="0.126677"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:26.303120" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:26.303034" elapsed="0.000131"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:26.303015" elapsed="0.000174"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:26.304305" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:26.304221" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:26.304204" elapsed="0.000164"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:26.304890" 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-10-16T01:22:26.304553" elapsed="0.000364"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:26.305278" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:26.305083" elapsed="0.000219"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:26.338051" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:26.305922" elapsed="0.032314"/>
</kw>
<msg time="2026-10-16T01:22:26.338413" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:26.338456" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:26.305485" elapsed="0.033007"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:26.412481" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:26.339109" elapsed="0.075483"/>
</kw>
<msg time="2026-10-16T01:22:26.414937" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:26.414986" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:26.338659" elapsed="0.076367"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:26.415637" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:26.415181" elapsed="0.000568"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:26.415131" elapsed="0.000650"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:26.416542" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:26.415989" elapsed="0.000659"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:26.416932" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:26.416732" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:26.416692" elapsed="0.000336"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:26.417070" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:26.423109" 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-10-16T01:22:26.425035" elapsed="0.000567"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:26.427015" 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-10-16T01:22:26.421138" elapsed="0.006306"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:26.417548" elapsed="0.010020"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:26.303959" elapsed="0.123696"/>
</kw>
<msg time="2026-10-16T01:22:26.427840" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:26.427889" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:26.303337" elapsed="0.124591"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:26.428163" elapsed="0.000050"/>
</return>
<status status="PASS" start="2026-10-16T01:22:26.428045" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:26.428012" 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-10-16T01:22:26.428741" 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-10-16T01:22:26.429087" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:26.429155" 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-10-16T01:22:26.302688" elapsed="0.126565"/>
</kw>
<msg time="2026-10-16T01:22:26.429348" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:26.429408" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:26.300463" elapsed="0.128988"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:26.429875" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:26.429527" elapsed="0.000401"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:26.429510" elapsed="0.000443"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:22:26.300297" elapsed="0.129679"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:22:26.021071" elapsed="0.408947"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:22:26.018815" elapsed="0.411271"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:22:26.016518" elapsed="0.413631"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:26.015955" elapsed="0.414244"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:22:26.014390" elapsed="0.415868"/>
</kw>
<kw name="Add Sample Tap Device To The Manual Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:22:26.433641" 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-10-16T01:22:26.432258" elapsed="0.001424">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-10-16T01:22:26.013506" elapsed="0.420355">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-10-16T01:22:26.435887" elapsed="0.000251"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:22:26.435609" elapsed="0.000582"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:26.437195" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:26.437088" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:26.437066" 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-10-16T01:22:26.439342" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:26.439138" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:26.439121" elapsed="0.000308"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:26.440408" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:26.440037" elapsed="0.000398"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:26.440879" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:26.440588" elapsed="0.000316"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:26.440944" elapsed="0.000031"/>
</return>
<msg time="2026-10-16T01:22:26.441078" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:26.439650" elapsed="0.001451"/>
</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-10-16T01:22:26.443745" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:26.443643" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:26.443625" elapsed="0.000184"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:26.444982" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:26.444897" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:26.444880" elapsed="0.000166"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:26.445529" level="INFO">${karaf_connection_index} = 386</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:22:26.445194" elapsed="0.000361"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:26.445940" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:26.445742" elapsed="0.000222"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:26.478254" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:26.446558" elapsed="0.031906"/>
</kw>
<msg time="2026-10-16T01:22:26.478631" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:26.478673" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:26.446120" elapsed="0.032615"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:26.550750" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:26.479361" elapsed="0.071590"/>
</kw>
<msg time="2026-10-16T01:22:26.551112" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:26.551152" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:26.478905" elapsed="0.072286"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:26.551498" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:26.551265" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:26.551246" elapsed="0.000348"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:26.552162" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:26.551809" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:26.552536" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:26.552319" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:26.552302" elapsed="0.000329"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:26.552661" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:26.555428" 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-10-16T01:22:26.557283" elapsed="0.000584"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:26.559277" 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-10-16T01:22:26.553595" elapsed="0.006091"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:26.552994" elapsed="0.006829"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:26.444610" elapsed="0.115291"/>
</kw>
<msg time="2026-10-16T01:22:26.559986" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:26.560025" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:26.443959" elapsed="0.116103"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:26.560220" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:22:26.560130" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:26.560113" elapsed="0.000185"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:26.560661" 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-10-16T01:22:26.561018" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:26.561084" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:22:26.443333" elapsed="0.117835"/>
</kw>
<msg time="2026-10-16T01:22:26.561258" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:26.561298" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:26.441490" elapsed="0.119844"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:26.561649" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:26.561424" elapsed="0.000384"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:26.561407" elapsed="0.000426"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:22:26.441330" elapsed="0.120525"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:26.564443" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:26.564339" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:26.564321" 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-10-16T01:22:26.565747" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:26.565638" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:26.565621" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:26.566178" level="INFO">${karaf_connection_index} = 388</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:22:26.565953" elapsed="0.000250"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:26.566558" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:26.566362" elapsed="0.000220"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:26.598811" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:26.567177" elapsed="0.031815"/>
</kw>
<msg time="2026-10-16T01:22:26.599176" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:26.599217" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:26.566763" elapsed="0.032489"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:26.686404" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:26.599931" elapsed="0.089607"/>
</kw>
<msg time="2026-10-16T01:22:26.689933" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:26.689982" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:26.599438" elapsed="0.090586"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:26.691198" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:26.690190" elapsed="0.001106"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:26.690128" elapsed="0.001206"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:26.692614" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:26.691567" elapsed="0.001190"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:26.693071" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:26.692831" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:26.692811" elapsed="0.000358"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:26.693208" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:26.696312" 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-10-16T01:22:26.698465" elapsed="0.000688"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:26.700460" 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-10-16T01:22:26.694242" elapsed="0.006631"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:26.693628" elapsed="0.007366"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:26.565355" elapsed="0.135721"/>
</kw>
<msg time="2026-10-16T01:22:26.701178" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:26.701221" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:26.564742" elapsed="0.136517"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:26.701438" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-10-16T01:22:26.701333" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:26.701316" 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-10-16T01:22:26.701954" 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-10-16T01:22:26.702289" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:26.702359" elapsed="0.000042"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:22:26.564043" elapsed="0.138449"/>
</kw>
<msg time="2026-10-16T01:22:26.702585" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:26.702626" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:26.562115" elapsed="0.140547"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:26.702980" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:26.702753" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:26.702736" elapsed="0.000316"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:22:26.561975" elapsed="0.141100"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:26.705940" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:26.705844" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:26.705827" elapsed="0.000261"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:26.707207" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:26.707124" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:26.707108" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:26.707675" 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-10-16T01:22:26.707436" elapsed="0.000281"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:26.708069" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:26.707880" elapsed="0.000214"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:26.740639" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:26.708682" elapsed="0.032169"/>
</kw>
<msg time="2026-10-16T01:22:26.741015" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:26.741056" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:26.708248" elapsed="0.032844"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:26.831223" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:26.741744" elapsed="0.089752"/>
</kw>
<msg time="2026-10-16T01:22:26.831661" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:26.831729" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:26.741268" elapsed="0.090497"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:26.832080" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:26.831849" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:26.831826" elapsed="0.000352"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:26.832754" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:26.832367" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:26.833092" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:26.832897" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:26.832881" elapsed="0.000304"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:26.833217" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:26.835923" 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-10-16T01:22:26.837747" elapsed="0.000488"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:26.839470" 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-10-16T01:22:26.834129" elapsed="0.005984"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:26.833562" elapsed="0.006667"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:26.706867" elapsed="0.133440"/>
</kw>
<msg time="2026-10-16T01:22:26.840420" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:26.840465" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:26.706239" elapsed="0.134261"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:26.840658" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:22:26.840571" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:26.840554" elapsed="0.000275"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:26.841175" 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-10-16T01:22:26.841500" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:26.841565" 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-10-16T01:22:26.705514" elapsed="0.136138"/>
</kw>
<msg time="2026-10-16T01:22:26.841829" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:26.841871" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:26.703354" elapsed="0.138551"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:26.842196" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:26.841974" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:26.841958" elapsed="0.000308"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:22:26.703213" elapsed="0.139076"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:22:26.441163" elapsed="0.401161"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:22:26.438843" elapsed="0.403587"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:22:26.436814" elapsed="0.405680"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:26.436348" elapsed="0.406194"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:22:26.435227" elapsed="0.407373"/>
</kw>
<kw name="Delete Sample Bridge Manually And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:22:26.845748" 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-10-16T01:22:26.844298" elapsed="0.001490">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-10-16T01:22:26.434149" elapsed="0.411808">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-10-16T01:22:26.847361" elapsed="0.000252"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:22:26.847115" 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-10-16T01:22:26.848879" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:26.848773" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:26.848753" 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-10-16T01:22:26.850885" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:26.850802" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:26.850786" elapsed="0.000162"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:26.851890" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:26.851535" elapsed="0.000381"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:26.852342" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:26.852068" elapsed="0.000299"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:26.852431" elapsed="0.000029"/>
</return>
<msg time="2026-10-16T01:22:26.852562" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:26.851156" elapsed="0.001430"/>
</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-10-16T01:22:26.855331" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:26.855222" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:26.855198" 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-10-16T01:22:26.856683" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:26.856600" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:26.856583" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:26.857162" level="INFO">${karaf_connection_index} = 386</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:22:26.856923" elapsed="0.000264"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:26.857550" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:26.857347" elapsed="0.000227"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:26.889435" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:26.858158" elapsed="0.031466"/>
</kw>
<msg time="2026-10-16T01:22:26.889817" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:26.889860" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:26.857744" elapsed="0.032149"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:26.960866" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:26.890520" elapsed="0.074125"/>
</kw>
<msg time="2026-10-16T01:22:26.965530" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:26.965591" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:26.890061" elapsed="0.075569"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:26.967687" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:26.966785" elapsed="0.001077"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:26.966240" elapsed="0.001649"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:26.969141" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:26.968083" elapsed="0.001165"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:26.969569" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:26.969323" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:26.969304" elapsed="0.000364"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:26.969725" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:26.972674" 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-10-16T01:22:26.974549" elapsed="0.000556"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:26.976437" elapsed="0.000456"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:22:26.970771" elapsed="0.006210"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:26.970131" 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-10-16T01:22:26.856318" elapsed="0.120874"/>
</kw>
<msg time="2026-10-16T01:22:26.977301" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:26.977344" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:26.855598" elapsed="0.121799"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:26.977561" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:22:26.977474" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:26.977457" elapsed="0.000185"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:26.978253" elapsed="0.000119"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:26.978722" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:26.978790" 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-10-16T01:22:26.854842" elapsed="0.124040"/>
</kw>
<msg time="2026-10-16T01:22:26.978975" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:26.979017" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:26.852949" elapsed="0.126103"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:26.979349" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:26.979124" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:26.979108" elapsed="0.000327"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:22:26.852807" elapsed="0.126651"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:26.982263" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:26.982174" elapsed="0.000131"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:26.982157" elapsed="0.000168"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:26.983454" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:26.983353" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:26.983336" elapsed="0.000181"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:26.983970" level="INFO">${karaf_connection_index} = 388</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:22:26.983660" elapsed="0.000335"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:26.984344" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:26.984155" elapsed="0.000213"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:27.016034" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:26.984973" elapsed="0.031234"/>
</kw>
<msg time="2026-10-16T01:22:27.016401" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:27.016446" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:26.984540" elapsed="0.031940"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:27.086420" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:27.017104" elapsed="0.069559"/>
</kw>
<msg time="2026-10-16T01:22:27.086892" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:27.086935" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:27.016645" elapsed="0.070325"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:27.087325" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:27.087065" elapsed="0.000356"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:27.087037" elapsed="0.000413"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:27.088034" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:27.087636" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:27.088399" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:27.088185" elapsed="0.000375"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:27.088169" elapsed="0.000415"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:27.088619" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:27.091517" 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-10-16T01:22:27.093331" elapsed="0.000779"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:27.095302" 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-10-16T01:22:27.089535" elapsed="0.006282"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:27.088985" elapsed="0.006951"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:26.983098" elapsed="0.112917"/>
</kw>
<msg time="2026-10-16T01:22:27.096163" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:27.096203" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:26.982497" elapsed="0.113743"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:27.096415" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:22:27.096311" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:27.096295" elapsed="0.000200"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:27.096849" 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-10-16T01:22:27.097163" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:27.097244" 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-10-16T01:22:26.981870" elapsed="0.115489"/>
</kw>
<msg time="2026-10-16T01:22:27.097485" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:27.097538" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:26.979780" elapsed="0.117800"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:27.098011" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:27.097658" elapsed="0.000403"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:27.097641" elapsed="0.000444"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:22:26.979596" elapsed="0.118510"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:27.103050" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:27.102964" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:27.102947" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:27.104226" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:27.104142" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:27.104126" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:27.104766" 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-10-16T01:22:27.104454" elapsed="0.000345"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:27.105192" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:27.104992" elapsed="0.000229"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:27.138794" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:27.105841" elapsed="0.033156"/>
</kw>
<msg time="2026-10-16T01:22:27.139157" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:27.139198" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:27.105395" elapsed="0.033838"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:27.214206" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:27.139949" elapsed="0.074507"/>
</kw>
<msg time="2026-10-16T01:22:27.214647" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:27.214690" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:27.139486" elapsed="0.075264"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:27.215113" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:27.214846" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:27.214818" elapsed="0.000395"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:27.215829" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:27.215413" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:27.216170" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:27.215973" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:27.215956" elapsed="0.000313"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:27.216301" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:27.219078" 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-10-16T01:22:27.220898" elapsed="0.000508"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:27.222800" 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-10-16T01:22:27.217234" elapsed="0.005951"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:27.216664" elapsed="0.006639"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:27.103885" elapsed="0.119515"/>
</kw>
<msg time="2026-10-16T01:22:27.223488" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:27.223528" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:27.103259" elapsed="0.120304"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:27.223795" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-16T01:22:27.223633" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:27.223616" elapsed="0.000261"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:27.224215" 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-10-16T01:22:27.224544" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:27.224609" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:22:27.102645" elapsed="0.122068"/>
</kw>
<msg time="2026-10-16T01:22:27.224805" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:27.224846" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:27.098376" elapsed="0.126506"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:27.225172" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:27.224951" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:27.224935" elapsed="0.000377"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:22:27.098236" elapsed="0.127099"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:22:26.852639" elapsed="0.372753"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:22:26.850490" elapsed="0.374966"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:22:26.848462" elapsed="0.377047"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:26.847999" elapsed="0.377554"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:22:26.846770" elapsed="0.378834"/>
</kw>
<kw name="Create Sample Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:22:27.229907" 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-10-16T01:22:27.228723" elapsed="0.001221">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-10-16T01:22:26.846213" elapsed="0.384401">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-10-16T01:22:27.232247" elapsed="0.000225"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:22:27.231994" 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-10-16T01:22:27.233449" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:27.233343" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:27.233326" elapsed="0.000187"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:27.235405" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:27.235303" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:27.235288" elapsed="0.000182"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:27.236393" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:27.236049" elapsed="0.000371"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:27.236858" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:27.236571" elapsed="0.000311"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:27.236923" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:22:27.237047" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:27.235677" elapsed="0.001393"/>
</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-10-16T01:22:27.239746" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:27.239624" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:27.239601" 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-10-16T01:22:27.241019" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:27.240932" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:27.240915" elapsed="0.000168"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:27.241493" level="INFO">${karaf_connection_index} = 386</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:22:27.241231" elapsed="0.000287"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:27.241889" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:27.241680" elapsed="0.000234"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:27.276886" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:27.242495" elapsed="0.034616"/>
</kw>
<msg time="2026-10-16T01:22:27.277311" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:27.277355" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:27.242066" elapsed="0.035341"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:27.363307" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:27.278292" elapsed="0.085228"/>
</kw>
<msg time="2026-10-16T01:22:27.363690" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:27.363760" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:27.277622" elapsed="0.086173"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:27.364177" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:27.363905" elapsed="0.000347"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:27.363869" elapsed="0.000417"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:27.364884" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:27.364493" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:27.365227" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:27.365027" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:27.365010" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:27.365360" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:27.368194" 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-10-16T01:22:27.370028" elapsed="0.000562"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:27.371858" 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-10-16T01:22:27.366335" elapsed="0.005925"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:27.365783" elapsed="0.006646"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:27.240644" elapsed="0.131870"/>
</kw>
<msg time="2026-10-16T01:22:27.372604" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:27.372646" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:27.240021" elapsed="0.132659"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:27.373133" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:22:27.373044" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:27.373026" elapsed="0.000188"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:27.373593" 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-10-16T01:22:27.373932" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:27.373999" 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-10-16T01:22:27.239300" elapsed="0.134792"/>
</kw>
<msg time="2026-10-16T01:22:27.374182" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:27.374225" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:27.237441" elapsed="0.136824"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:27.374587" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:27.374336" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:27.374320" elapsed="0.000341"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:22:27.237274" elapsed="0.137410"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:27.377555" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:27.377470" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:27.377453" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:27.378750" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:27.378640" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:27.378624" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:27.379198" level="INFO">${karaf_connection_index} = 388</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:22:27.378956" elapsed="0.000267"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:27.379602" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:27.379403" elapsed="0.000224"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:27.413879" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:27.380214" elapsed="0.033848"/>
</kw>
<msg time="2026-10-16T01:22:27.414221" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:27.414263" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:27.379799" elapsed="0.034498"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:27.487475" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:27.414946" elapsed="0.073375"/>
</kw>
<msg time="2026-10-16T01:22:27.488581" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:27.488626" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:27.414495" elapsed="0.074166"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:27.489123" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:27.488795" elapsed="0.000404"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:27.488759" elapsed="0.000469"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:27.489918" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:27.489436" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:27.490264" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:27.490066" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:27.490049" elapsed="0.000310"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:27.490413" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:27.493290" 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-10-16T01:22:27.495125" elapsed="0.000516"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:27.497272" 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-10-16T01:22:27.491379" elapsed="0.006310"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:27.490815" elapsed="0.007016"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:27.378361" elapsed="0.119550"/>
</kw>
<msg time="2026-10-16T01:22:27.498003" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:27.498045" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:27.377784" elapsed="0.120296"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:27.498357" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-10-16T01:22:27.498268" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:27.498248" 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-10-16T01:22:27.498908" 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-10-16T01:22:27.499226" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:27.499290" 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-10-16T01:22:27.377142" elapsed="0.122238"/>
</kw>
<msg time="2026-10-16T01:22:27.499488" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:27.499530" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:27.375075" elapsed="0.124489"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:27.499881" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:27.499636" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:27.499619" elapsed="0.000334"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:22:27.374932" elapsed="0.125044"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:27.502861" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:27.502776" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:27.502758" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:27.504021" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:27.503938" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:27.503922" elapsed="0.000161"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:27.504489" 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-10-16T01:22:27.504226" elapsed="0.000287"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:27.504883" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:27.504674" elapsed="0.000233"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:27.538609" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:27.505492" elapsed="0.033312"/>
</kw>
<msg time="2026-10-16T01:22:27.538977" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:27.539018" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:27.505061" elapsed="0.033991"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:27.609464" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:27.539666" elapsed="0.069984"/>
</kw>
<msg time="2026-10-16T01:22:27.609843" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:27.609885" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:27.539217" elapsed="0.070703"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:27.610198" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:27.609992" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:27.609973" elapsed="0.000319"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:27.610866" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:27.610500" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:27.611247" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:27.611048" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:27.611031" elapsed="0.000311"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:27.611374" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:27.614035" elapsed="0.000494"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:22:27.615769" elapsed="0.000458"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:27.617576" 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-10-16T01:22:27.612197" elapsed="0.005772"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:27.611670" elapsed="0.006416"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:27.503659" elapsed="0.114504"/>
</kw>
<msg time="2026-10-16T01:22:27.618245" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:27.618286" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:27.503069" elapsed="0.115251"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:27.618493" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:22:27.618405" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:27.618372" elapsed="0.000200"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:27.618975" 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-10-16T01:22:27.619282" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:27.619347" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:22:27.502454" elapsed="0.116995"/>
</kw>
<msg time="2026-10-16T01:22:27.619548" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:27.619597" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:27.500255" elapsed="0.119383"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:27.619999" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:27.619742" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:27.619719" elapsed="0.000356"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:22:27.500112" elapsed="0.119985"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:22:27.237125" elapsed="0.383001"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:22:27.235010" elapsed="0.385178"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:22:27.233081" elapsed="0.387164"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:27.232669" elapsed="0.387628"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:22:27.231630" elapsed="0.388721"/>
</kw>
<kw name="Create Sample Port And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:22:27.624571" 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-10-16T01:22:27.623341" elapsed="0.001269">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-10-16T01:22:27.231060" elapsed="0.393727">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-10-16T01:22:27.626404" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:22:27.626147" elapsed="0.000566"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:27.627623" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:27.627535" elapsed="0.000131"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:27.627518" elapsed="0.000168"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:27.629584" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:27.629501" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:27.629485" elapsed="0.000161"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:27.630598" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:27.630226" elapsed="0.000397"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:27.631075" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:27.630800" elapsed="0.000299"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:27.631140" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:22:27.631265" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:27.629868" elapsed="0.001421"/>
</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-10-16T01:22:27.633856" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:27.633771" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:27.633754" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:27.635088" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:27.634993" elapsed="0.000136"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:27.634976" elapsed="0.000174"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:27.635571" level="INFO">${karaf_connection_index} = 386</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:22:27.635295" elapsed="0.000302"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:27.635959" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:27.635777" elapsed="0.000207"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:27.672079" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:27.636570" elapsed="0.035687"/>
</kw>
<msg time="2026-10-16T01:22:27.672453" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:27.672495" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:27.636138" elapsed="0.036390"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:27.760076" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:27.673144" elapsed="0.087199"/>
</kw>
<msg time="2026-10-16T01:22:27.760567" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:27.760609" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:27.672693" elapsed="0.087950"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:27.761075" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:27.760778" elapsed="0.000372"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:27.760743" elapsed="0.000437"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:27.761833" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:27.761372" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:27.762270" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:27.762070" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:27.762052" elapsed="0.000314"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:27.762422" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:27.765129" 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-10-16T01:22:27.767026" elapsed="0.000506"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:27.768833" 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-10-16T01:22:27.763349" elapsed="0.005868"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:27.762799" elapsed="0.006535"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:27.634689" elapsed="0.134759"/>
</kw>
<msg time="2026-10-16T01:22:27.769540" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:27.769581" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:27.634067" elapsed="0.135549"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:27.770004" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:22:27.769687" elapsed="0.000373"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:27.769670" elapsed="0.000413"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:27.770468" 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-10-16T01:22:27.770858" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:27.770934" 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-10-16T01:22:27.633468" elapsed="0.137576"/>
</kw>
<msg time="2026-10-16T01:22:27.771150" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:27.771193" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:27.631648" elapsed="0.139579"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:27.771541" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:27.771298" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:27.771282" elapsed="0.000331"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:22:27.631508" elapsed="0.140128"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:27.774456" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:27.774349" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:27.774332" elapsed="0.000188"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:27.775613" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:27.775529" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:27.775512" elapsed="0.000164"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:27.776089" level="INFO">${karaf_connection_index} = 388</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:22:27.775846" elapsed="0.000268"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:27.776487" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:27.776283" elapsed="0.000228"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:27.813402" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:27.777099" elapsed="0.036510"/>
</kw>
<msg time="2026-10-16T01:22:27.813798" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:27.813922" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:27.776665" elapsed="0.037294"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:27.914160" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:27.814622" elapsed="0.099880"/>
</kw>
<msg time="2026-10-16T01:22:27.914760" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:27.914805" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:27.814141" elapsed="0.100699"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:27.915318" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:27.914971" elapsed="0.000446"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:27.914930" elapsed="0.000522"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:27.916115" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:27.915649" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:27.916489" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:27.916273" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:27.916256" elapsed="0.000331"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:27.916627" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:27.919543" 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-10-16T01:22:27.921442" elapsed="0.000594"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:27.923435" 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-10-16T01:22:27.917662" elapsed="0.006193"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:27.917063" elapsed="0.006910"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:27.775256" elapsed="0.148797"/>
</kw>
<msg time="2026-10-16T01:22:27.924145" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:27.924187" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:27.774667" elapsed="0.149557"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:27.924400" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-10-16T01:22:27.924298" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:27.924280" 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-10-16T01:22:27.924933" 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-10-16T01:22:27.925274" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:27.925345" 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-10-16T01:22:27.774018" elapsed="0.151628"/>
</kw>
<msg time="2026-10-16T01:22:27.925762" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:27.925807" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:27.771954" elapsed="0.153892"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:27.926236" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:27.926007" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:27.925989" elapsed="0.000319"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:22:27.771811" elapsed="0.154520"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:27.929230" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:27.929145" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:27.929128" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:27.930416" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:27.930316" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:27.930299" elapsed="0.000182"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:27.930897" 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-10-16T01:22:27.930628" elapsed="0.000294"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:27.931272" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:27.931083" elapsed="0.000214"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:27.965378" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:27.931928" elapsed="0.033653"/>
</kw>
<msg time="2026-10-16T01:22:27.965771" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:27.965814" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:27.931487" elapsed="0.034363"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:28.057752" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:27.966468" elapsed="0.091748"/>
</kw>
<msg time="2026-10-16T01:22:28.058555" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:28.058599" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:27.966015" elapsed="0.092621"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:28.059300" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:28.058830" elapsed="0.000601"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.058771" elapsed="0.000701"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:28.060316" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:28.059676" elapsed="0.000773"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:28.060767" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:28.060521" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.060502" elapsed="0.000365"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:28.060910" elapsed="0.000055"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:28.063938" 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-10-16T01:22:28.065926" elapsed="0.000520"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:28.067836" 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-10-16T01:22:28.062016" elapsed="0.006246"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:28.061350" elapsed="0.007032"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:27.930060" elapsed="0.138529"/>
</kw>
<msg time="2026-10-16T01:22:28.068686" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:28.068806" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:27.929454" elapsed="0.139392"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:28.069013" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:22:28.068923" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.068905" elapsed="0.000188"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:28.069512" 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-10-16T01:22:28.069867" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:28.069932" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:22:27.928834" elapsed="0.141190"/>
</kw>
<msg time="2026-10-16T01:22:28.070121" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:28.070165" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:27.926636" elapsed="0.143568"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:28.070522" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:28.070279" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.070262" elapsed="0.000332"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:22:27.926492" elapsed="0.144126"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:22:27.631340" elapsed="0.439323"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:22:27.629194" elapsed="0.441645"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:22:27.627268" elapsed="0.443638"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:27.626863" elapsed="0.444094"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:22:27.625807" elapsed="0.445209"/>
</kw>
<kw name="Modify the destination IP of Sample Port" owner="ClusterOvsdb">
<msg time="2026-10-16T01:22:28.074172" 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-10-16T01:22:28.072971" elapsed="0.001241">Variable '${new_owner}' not found.</status>
</kw>
<doc>Modify the dst ip of existing port in Owner.</doc>
<status status="FAIL" start="2026-10-16T01:22:27.625225" elapsed="0.449156">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-10-16T01:22:28.076038" elapsed="0.000201"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:22:28.075789" elapsed="0.000499"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:28.077218" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:28.077131" elapsed="0.000133"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.077114" elapsed="0.000174"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:28.079210" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:28.079123" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.079106" elapsed="0.000167"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:28.080211" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:28.079871" elapsed="0.000365"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:28.080685" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:28.080411" elapsed="0.000314"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:28.080767" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:22:28.080894" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:28.079496" elapsed="0.001461"/>
</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-10-16T01:22:28.083573" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:28.083489" elapsed="0.000133"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.083471" elapsed="0.000174"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:28.084874" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:28.084790" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.084772" elapsed="0.000165"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:28.085328" level="INFO">${karaf_connection_index} = 386</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:22:28.085085" elapsed="0.000268"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:28.085789" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:28.085577" elapsed="0.000236"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:28.120221" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:28.086384" elapsed="0.034084"/>
</kw>
<msg time="2026-10-16T01:22:28.120664" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:28.120727" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:28.085969" elapsed="0.034796"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:28.188005" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:28.121476" elapsed="0.066719"/>
</kw>
<msg time="2026-10-16T01:22:28.188360" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:28.188420" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:28.120978" elapsed="0.067479"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:28.188818" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:28.188550" elapsed="0.000345"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.188521" elapsed="0.000404"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:28.189515" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:28.189116" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:28.189886" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:28.189662" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.189645" elapsed="0.000335"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:28.190017" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:28.192745" elapsed="0.000495"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:22:28.194527" elapsed="0.000531"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:28.196512" elapsed="0.000380"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:22:28.190946" elapsed="0.006018"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:28.190367" elapsed="0.006717"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:28.084467" elapsed="0.112697"/>
</kw>
<msg time="2026-10-16T01:22:28.197320" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:28.197361" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:28.083810" elapsed="0.113602"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:28.197572" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:22:28.197486" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.197468" elapsed="0.000184"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:28.198042" 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-10-16T01:22:28.198349" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:28.198427" 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-10-16T01:22:28.083184" elapsed="0.115334"/>
</kw>
<msg time="2026-10-16T01:22:28.198609" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:28.198650" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:28.081328" elapsed="0.117358"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:28.199098" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:28.198875" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.198858" elapsed="0.000312"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:22:28.081185" elapsed="0.118007"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:28.201876" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:28.201788" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.201765" elapsed="0.000173"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:28.203045" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:28.202962" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.202945" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:28.203743" level="INFO">${karaf_connection_index} = 388</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:22:28.203253" elapsed="0.000517"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:28.204121" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:28.203933" elapsed="0.000212"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:28.239754" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:28.204755" elapsed="0.035195"/>
</kw>
<msg time="2026-10-16T01:22:28.240109" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:28.240151" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:28.204298" elapsed="0.035888"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:28.305233" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:28.240817" elapsed="0.064689"/>
</kw>
<msg time="2026-10-16T01:22:28.305743" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:28.305790" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:28.240346" elapsed="0.065483"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:28.306213" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:28.305928" elapsed="0.000363"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.305900" elapsed="0.000418"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:28.307053" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:28.306607" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:28.307419" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:28.307197" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.307181" elapsed="0.000335"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:28.307551" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:28.310231" 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-10-16T01:22:28.312022" elapsed="0.000497"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:28.313960" 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-10-16T01:22:28.308491" elapsed="0.005851"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:28.307923" elapsed="0.006554"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:28.202680" elapsed="0.111876"/>
</kw>
<msg time="2026-10-16T01:22:28.314643" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:28.314683" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:28.202086" elapsed="0.112652"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:28.314898" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:22:28.314810" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.314793" elapsed="0.000183"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:28.315319" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:28.315638" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:28.315799" 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-10-16T01:22:28.201464" elapsed="0.114427"/>
</kw>
<msg time="2026-10-16T01:22:28.315980" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:28.316020" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:28.199484" elapsed="0.116571"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:28.316347" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:28.316124" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.316108" elapsed="0.000325"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:22:28.199324" elapsed="0.117132"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:28.321084" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:28.320998" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.320981" elapsed="0.000167"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:28.322269" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:28.322185" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.322169" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:28.322745" 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-10-16T01:22:28.322490" elapsed="0.000281"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:28.323114" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:28.322931" elapsed="0.000207"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:28.356774" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:28.323789" elapsed="0.033191"/>
</kw>
<msg time="2026-10-16T01:22:28.357140" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:28.357182" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:28.323324" elapsed="0.033895"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:28.420806" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:28.357849" elapsed="0.063156"/>
</kw>
<msg time="2026-10-16T01:22:28.421171" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:28.421212" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:28.357385" elapsed="0.063863"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:28.421572" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:28.421330" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.421306" elapsed="0.000364"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:28.422274" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:28.421901" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:28.422630" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:28.422434" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.422417" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:28.422775" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:28.425370" 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-10-16T01:22:28.427149" elapsed="0.000514"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:28.428932" 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-10-16T01:22:28.423629" elapsed="0.005695"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:28.423091" elapsed="0.006379"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:28.321927" elapsed="0.107623"/>
</kw>
<msg time="2026-10-16T01:22:28.429634" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:28.429674" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:28.321298" elapsed="0.108688"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:28.430155" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:22:28.430066" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.430049" elapsed="0.000185"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:28.430587" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:28.430919" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:28.430984" 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-10-16T01:22:28.320677" elapsed="0.110396"/>
</kw>
<msg time="2026-10-16T01:22:28.431159" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:28.431255" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:28.316762" elapsed="0.114530"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:28.431607" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:28.431362" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.431346" elapsed="0.000333"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:22:28.316601" elapsed="0.115157"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:22:28.081020" elapsed="0.350773"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:22:28.078831" elapsed="0.353025"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:22:28.076862" elapsed="0.355049"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:28.076449" elapsed="0.355505"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:22:28.075425" elapsed="0.356580"/>
</kw>
<kw name="Verify Sample Port Is Modified" owner="ClusterOvsdb">
<msg time="2026-10-16T01:22:28.434984" 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-10-16T01:22:28.433681" elapsed="0.001343">Variable '${new_cluster_list}' not found.</status>
</kw>
<doc>Verify port is modified in all instances.</doc>
<status status="FAIL" start="2026-10-16T01:22:28.074877" elapsed="0.360309">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-10-16T01:22:28.436920" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:22:28.436621" 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-10-16T01:22:28.438180" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:28.438096" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.438079" elapsed="0.000165"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:28.440232" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:28.440150" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.440133" elapsed="0.000161"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:28.441227" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:28.440899" elapsed="0.000353"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:28.441688" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:28.441415" elapsed="0.000311"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:28.441767" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:22:28.441894" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:28.440526" elapsed="0.001390"/>
</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-10-16T01:22:28.444501" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:28.444416" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.444379" elapsed="0.000185"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:28.446351" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:28.446265" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.446248" elapsed="0.000205"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:28.446862" level="INFO">${karaf_connection_index} = 386</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:22:28.446599" elapsed="0.000288"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:28.447237" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:28.447051" elapsed="0.000210"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:28.479555" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:28.447858" elapsed="0.032018"/>
</kw>
<msg time="2026-10-16T01:22:28.480044" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:28.480086" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:28.447425" elapsed="0.032697"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:28.543478" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:28.480761" elapsed="0.062984"/>
</kw>
<msg time="2026-10-16T01:22:28.543947" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:28.543990" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:28.480287" elapsed="0.063740"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:28.544439" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:28.544133" elapsed="0.000382"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.544099" elapsed="0.000446"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:28.545153" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:28.544751" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:28.545515" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:28.545297" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.545280" elapsed="0.000332"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:28.545648" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:28.548476" 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-10-16T01:22:28.550299" elapsed="0.000541"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:28.552080" 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-10-16T01:22:28.546676" elapsed="0.005816"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:28.546076" elapsed="0.006536"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:28.446002" elapsed="0.106690"/>
</kw>
<msg time="2026-10-16T01:22:28.552986" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:28.553029" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:28.444732" elapsed="0.108333"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:28.553226" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-16T01:22:28.553138" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.553121" elapsed="0.000186"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:28.553692" 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-10-16T01:22:28.554036" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:28.554105" 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-10-16T01:22:28.444109" elapsed="0.110090"/>
</kw>
<msg time="2026-10-16T01:22:28.554292" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:28.554334" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:28.442271" elapsed="0.112103"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:28.554887" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:28.554533" elapsed="0.000407"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.554515" elapsed="0.000449"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:22:28.442131" elapsed="0.112857"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:28.557806" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:28.557719" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.557688" elapsed="0.000181"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:28.558984" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:28.558900" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.558883" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:28.559446" level="INFO">${karaf_connection_index} = 388</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:22:28.559189" elapsed="0.000282"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:28.559839" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:28.559632" elapsed="0.000232"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:28.592634" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:28.560467" elapsed="0.032374"/>
</kw>
<msg time="2026-10-16T01:22:28.593003" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:28.593045" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:28.560017" elapsed="0.033063"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:28.651461" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:28.593747" elapsed="0.057898"/>
</kw>
<msg time="2026-10-16T01:22:28.651833" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:28.651874" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:28.593245" elapsed="0.058665"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:28.652186" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:28.651982" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.651963" elapsed="0.000317"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:28.652839" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:28.652480" elapsed="0.000435"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:28.653170" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:28.652976" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.652959" elapsed="0.000304"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:28.653294" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:28.655853" 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-10-16T01:22:28.657587" elapsed="0.000486"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:28.659482" 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-10-16T01:22:28.654128" elapsed="0.005753"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:28.653581" elapsed="0.006418"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:28.558617" elapsed="0.101499"/>
</kw>
<msg time="2026-10-16T01:22:28.660200" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:28.660240" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:28.558016" elapsed="0.102261"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:28.660447" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:22:28.660345" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.660329" elapsed="0.000196"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:28.660937" 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-10-16T01:22:28.661246" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:28.661311" 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-10-16T01:22:28.557383" elapsed="0.104029"/>
</kw>
<msg time="2026-10-16T01:22:28.661499" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:28.661539" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:28.555278" elapsed="0.106296"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:28.661883" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:28.661643" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.661626" elapsed="0.000329"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:22:28.555135" elapsed="0.106842"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:28.664639" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:28.664554" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.664536" elapsed="0.000182"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:28.665836" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:28.665750" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.665732" elapsed="0.000166"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:28.666268" 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-10-16T01:22:28.666041" elapsed="0.000253"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:28.666647" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:28.666467" elapsed="0.000204"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:28.701216" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:28.667260" elapsed="0.034160"/>
</kw>
<msg time="2026-10-16T01:22:28.701721" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:28.701767" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:28.666844" elapsed="0.034958"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:28.757763" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:28.702414" elapsed="0.055650"/>
</kw>
<msg time="2026-10-16T01:22:28.758289" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:28.758337" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:28.701968" elapsed="0.056406"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:28.758852" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:28.758509" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.758472" elapsed="0.000576"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:28.759735" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:28.759235" elapsed="0.000580"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:28.760077" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:28.759877" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.759860" elapsed="0.000311"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:28.760208" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:28.762989" 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-10-16T01:22:28.764769" elapsed="0.000478"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:28.766632" 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-10-16T01:22:28.761184" elapsed="0.005853"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:28.760587" elapsed="0.006568"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:28.665469" elapsed="0.101766"/>
</kw>
<msg time="2026-10-16T01:22:28.767322" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:28.767363" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:28.664868" elapsed="0.102547"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:28.767576" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:22:28.767488" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.767471" elapsed="0.000184"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:28.768098" 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-10-16T01:22:28.768435" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:28.768501" 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-10-16T01:22:28.664244" elapsed="0.104347"/>
</kw>
<msg time="2026-10-16T01:22:28.768683" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:28.768742" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:28.662228" elapsed="0.106555"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:28.769079" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:28.768854" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.768838" elapsed="0.000313"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:22:28.662090" elapsed="0.107084"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:22:28.441973" elapsed="0.327242"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:22:28.439856" elapsed="0.329426"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:22:28.437837" elapsed="0.331507"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:28.437332" elapsed="0.332060"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:22:28.436174" elapsed="0.333304"/>
</kw>
<kw name="Start_Single_Member" owner="ClusterManagement">
<msg time="2026-10-16T01:22:28.771521" 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-10-16T01:22:28.769807" elapsed="0.001753">Variable '${original_owner}' not found.</status>
</kw>
<doc>Start Owner Instance and verify it is active</doc>
<status status="FAIL" start="2026-10-16T01:22:28.435647" elapsed="0.336131">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-10-16T01:22:28.773443" elapsed="0.000204"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:22:28.773178" 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-10-16T01:22:28.774628" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:28.774540" elapsed="0.000131"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.774523" elapsed="0.000169"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:28.776642" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:28.776554" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.776538" elapsed="0.000183"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:28.777646" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:28.777290" elapsed="0.000381"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:28.778110" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:28.777838" elapsed="0.000296"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:28.778175" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:22:28.778302" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:28.776931" elapsed="0.001394"/>
</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-10-16T01:22:28.780939" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:28.780856" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.780838" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:28.782113" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:28.782028" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.782011" elapsed="0.000164"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:28.782582" level="INFO">${karaf_connection_index} = 386</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:22:28.782318" elapsed="0.000289"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:28.783069" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:28.782809" elapsed="0.000285"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:28.815151" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:28.783686" elapsed="0.031647"/>
</kw>
<msg time="2026-10-16T01:22:28.815525" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:28.815570" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:28.783253" elapsed="0.032356"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:28.873120" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:28.816240" elapsed="0.057060"/>
</kw>
<msg time="2026-10-16T01:22:28.873475" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:28.873516" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:28.815798" elapsed="0.057752"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:28.873857" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:28.873622" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.873603" elapsed="0.000350"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:28.874501" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:28.874143" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:28.874914" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:28.874689" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.874672" elapsed="0.000340"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:28.875045" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:28.877564" 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-10-16T01:22:28.879328" elapsed="0.000509"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:28.881073" 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-10-16T01:22:28.875887" elapsed="0.005603"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:28.875328" elapsed="0.006280"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:28.781772" elapsed="0.099912"/>
</kw>
<msg time="2026-10-16T01:22:28.881967" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:28.882008" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:28.781150" elapsed="0.100894"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:28.882201" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-10-16T01:22:28.882114" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.882096" elapsed="0.000188"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:28.882633" 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-10-16T01:22:28.882958" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:28.883023" 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-10-16T01:22:28.780545" elapsed="0.102564"/>
</kw>
<msg time="2026-10-16T01:22:28.883194" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:28.883234" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:28.778716" elapsed="0.104554"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:28.883577" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:28.883336" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.883320" elapsed="0.000328"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:22:28.778560" elapsed="0.105110"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:28.886501" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:28.886391" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.886372" 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-10-16T01:22:28.887772" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:28.887650" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.887629" elapsed="0.000212"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:28.888227" level="INFO">${karaf_connection_index} = 388</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:22:28.887997" elapsed="0.000255"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:28.888619" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:28.888435" elapsed="0.000209"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:28.923185" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:28.889275" elapsed="0.034089"/>
</kw>
<msg time="2026-10-16T01:22:28.923770" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:28.923815" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:28.888830" elapsed="0.035021"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:28.991035" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:28.924458" elapsed="0.066826"/>
</kw>
<msg time="2026-10-16T01:22:28.991497" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:28.991540" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:28.924017" elapsed="0.067558"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:28.991978" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:28.991675" elapsed="0.000380"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.991644" elapsed="0.000441"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:28.992723" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:28.992274" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:28.993085" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:28.992885" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:28.992867" elapsed="0.000313"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:28.993215" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:28.995967" 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-10-16T01:22:28.997796" elapsed="0.000488"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:28.999686" 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-10-16T01:22:28.994151" elapsed="0.005940"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:28.993582" elapsed="0.006627"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:28.887368" elapsed="0.112921"/>
</kw>
<msg time="2026-10-16T01:22:29.000377" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:29.000437" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:28.886775" elapsed="0.113700"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:29.000634" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:22:29.000547" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:29.000531" elapsed="0.000261"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:29.001135" 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-10-16T01:22:29.001465" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:29.001533" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:22:28.886078" elapsed="0.115546"/>
</kw>
<msg time="2026-10-16T01:22:29.001732" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:29.001775" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:28.884044" elapsed="0.117769"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:29.002173" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:29.001948" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:29.001930" elapsed="0.000315"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:22:28.883905" elapsed="0.118363"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:29.005206" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:29.005117" elapsed="0.000132"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:29.005099" elapsed="0.000171"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:22:29.006427" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:29.006322" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:29.006305" elapsed="0.000187"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:22:29.006908" 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-10-16T01:22:29.006638" elapsed="0.000296"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:22:29.007286" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:22:29.007097" elapsed="0.000214"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:22:29.040508" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:22:29.007935" elapsed="0.032753"/>
</kw>
<msg time="2026-10-16T01:22:29.040880" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:22:29.040921" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:29.007487" elapsed="0.033469"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:22:29.102303" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:29.041566" elapsed="0.060941"/>
</kw>
<msg time="2026-10-16T01:22:29.102674" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:22:29.102742" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:29.041122" elapsed="0.061658"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:29.103076" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:29.102858" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:29.102837" elapsed="0.000337"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:29.103742" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:22:29.103358" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:29.104085" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:29.103887" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:29.103871" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:22:29.104211" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:29.106813" elapsed="0.000485"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:22:29.108616" elapsed="0.000537"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:22:29.110542" 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-10-16T01:22:29.105060" elapsed="0.005884"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:22:29.104523" elapsed="0.006537"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:22:29.006063" elapsed="0.105076"/>
</kw>
<msg time="2026-10-16T01:22:29.111509" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:29.111551" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:29.005451" elapsed="0.106138"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:22:29.111836" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:22:29.111662" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:29.111645" elapsed="0.000272"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:22:29.112252" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:29.112574" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:22:29.112640" 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-10-16T01:22:29.004737" elapsed="0.108008"/>
</kw>
<msg time="2026-10-16T01:22:29.112832" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:22:29.112873" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:29.002557" elapsed="0.110352"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:29.113198" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:29.112978" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:29.112963" elapsed="0.000307"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:22:29.002414" elapsed="0.110877"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:22:28.778381" elapsed="0.334944"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:22:28.776217" elapsed="0.337174"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:22:28.774255" elapsed="0.339226"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:22:28.773864" elapsed="0.339667"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:22:28.772832" elapsed="0.340757"/>
</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-10-16T01:22:29.122896" elapsed="0.000209"/>
</kw>
<msg time="2026-10-16T01:22:29.123149" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:29.122328" elapsed="0.000875"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:22:29.121935" elapsed="0.001337"/>
</kw>
<msg time="2026-10-16T01:22:29.123311" 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-10-16T01:22:29.119007" elapsed="0.004345"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:22:29.118618" elapsed="0.004820"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:29.123903" 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-10-16T01:22:29.123653" 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-10-16T01:22:29.126929" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:29.126578" elapsed="0.000376"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:29.127383" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:29.127105" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:29.127535" elapsed="0.000029"/>
</return>
<msg time="2026-10-16T01:22:29.127668" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:29.126202" elapsed="0.001489"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:22:29.127859" elapsed="0.000132"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:29.128482" 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-10-16T01:22:29.128157" elapsed="0.000351"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:29.128902" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:29.128655" elapsed="0.000271"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:29.129290" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:29.129065" elapsed="0.000248"/>
</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-10-16T01:22:29.133109" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:22:29.132507" elapsed="0.000651"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:22:29.133214" elapsed="0.000059"/>
</return>
<msg time="2026-10-16T01:22:29.133483" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:22:29.131109" elapsed="0.002431"/>
</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-10-16T01:22:29.150069" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:29.149748" elapsed="0.000350"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:22:29.151510" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:22:29.150619" elapsed="0.000977">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:29.151686" 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-10-16T01:22:29.150261" elapsed="0.001468"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:29.152218" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:29.151904" elapsed="0.000340"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:22:29.152643" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:22:29.152867" 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-10-16T01:22:29.152462" elapsed="0.000431"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:29.153314" 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-10-16T01:22:29.153088" elapsed="0.000269"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:29.154517" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:29.154262" elapsed="0.000297"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:22:29.155017" 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-10-16T01:22:29.154752" 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-10-16T01:22:29.155356" 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-10-16T01:22:29.155563" 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-10-16T01:22:29.155763" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:22:29.155222" elapsed="0.000594"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:22:29.155093" elapsed="0.000829"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:22:29.155972" elapsed="0.000034"/>
</return>
<msg time="2026-10-16T01:22:29.156119" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:22:29.153733" elapsed="0.002410"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:29.153453" elapsed="0.002719"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:29.156345" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:29.156198" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:29.153430" elapsed="0.003003"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:22:29.157019" 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-10-16T01:22:29.156591" elapsed="0.000453"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:22:29.157088" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:22:29.149202" elapsed="0.007986"/>
</kw>
<msg time="2026-10-16T01:22:29.157236" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:29.145115" elapsed="0.012168"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:29.161194" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:29.165061" elapsed="0.000032"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:29.169024" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:29.169203" elapsed="0.000020"/>
</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-10-16T01:22:29.169387" elapsed="0.000040"/>
</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-10-16T01:22:29.169777" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:29.169615" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:29.169602" 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-10-16T01:22:29.170011" 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-10-16T01:22:29.170191" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:29.170356" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:22:29.169574" elapsed="0.000845"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:22:29.169482" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:29.170606" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:29.170675" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:22:29.170838" 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-10-16T01:22:29.144486" elapsed="0.026377"/>
</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-10-16T01:22:29.172052" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:29.171851" elapsed="0.000261">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:29.172193" 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-10-16T01:22:29.171494" elapsed="0.000722"/>
</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-10-16T01:22:29.172532" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:29.172279" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:22:29.173078" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:29.172814" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:29.172609" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:29.172263" elapsed="0.000892"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:29.173673" 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-10-16T01:22:29.173312" elapsed="0.000404"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:22:29.173763" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:22:29.173887" 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-manganese/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-10-16T01:22:29.171160" elapsed="0.002749"/>
</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-10-16T01:22:29.175016" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:29.174809" elapsed="0.000267">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:29.175160" 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-10-16T01:22:29.174471" elapsed="0.000713"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:22:29.177389" elapsed="0.000051"/>
</return>
<status status="PASS" start="2026-10-16T01:22:29.177271" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:29.175230" elapsed="0.002268"/>
</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-10-16T01:22:29.177650" 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-10-16T01:22:29.177843" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:29.177903" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:22:29.178029" 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-manganese/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-10-16T01:22:29.174157" elapsed="0.003895"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:29.179295" 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-10-16T01:22:29.179069" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:29.179775" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:29.179539" elapsed="0.000276"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:22:29.188077" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:22:29.188184" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:22:29.188535" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:29.180196" elapsed="0.010521">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:29.179874" elapsed="0.011010">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:29.191281" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:29.190945" elapsed="0.000408"/>
</branch>
<status status="FAIL" start="2026-10-16T01:22:29.179858" elapsed="0.011519">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:29.191942" elapsed="0.000031"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:29.192099" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:29.192055" elapsed="0.000089"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:29.192032" elapsed="0.000133"/>
</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-10-16T01:22:29.192308" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:22:29.192371" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:22:29.178337" elapsed="0.014176">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:29.192588" elapsed="0.000019"/>
</return>
<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="FAIL" start="2026-10-16T01:22:29.137199" elapsed="0.055623">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:22:29.193257" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:29.193012" elapsed="0.000335"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:29.192958" elapsed="0.000438"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:29.193503" elapsed="0.000039"/>
</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="FAIL" start="2026-10-16T01:22:29.135470" elapsed="0.058213">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:29.133763" elapsed="0.060065">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:22:29.133745" elapsed="0.060162">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:29.194183" elapsed="0.000026"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:22:29.194665" elapsed="0.000023"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:29.195021" elapsed="0.000022"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:22:29.195502" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:22:29.195991" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:29.196321" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:29.196744" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:22:29.197074" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:22:29.130513" elapsed="0.066670">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:22:29.197250" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:22:29.129694" elapsed="0.067650">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:29.197614" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:29.197459" elapsed="0.000206"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:29.197864" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:29.197688" elapsed="0.000225"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:29.198093" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:29.197936" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:29.197441" elapsed="0.000723"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:22:29.129539" elapsed="0.068666">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:22:29.129356" elapsed="0.068914">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:29.198331" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:22:29.125586" elapsed="0.072869">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:29.198658" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:29.198982" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:29.198832" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:29.198813" elapsed="0.000238"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:29.199180" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:29.199364" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:29.199437" elapsed="0.000020"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:22:29.124862" elapsed="0.074682">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:22:29.124634" elapsed="0.074977">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:22:29.124511" elapsed="0.075152">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:22:29.124157" elapsed="0.075661">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:29.200054" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:22:29.114829" elapsed="0.085337">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:22:30.220642" elapsed="0.000490"/>
</kw>
<msg time="2026-10-16T01:22:30.221277" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:30.219269" elapsed="0.002172"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:22:30.218113" elapsed="0.003501"/>
</kw>
<msg time="2026-10-16T01:22:30.221738" 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-10-16T01:22:30.211352" elapsed="0.010483"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:22:30.210461" elapsed="0.011528"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:30.223122" 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-10-16T01:22:30.222548" elapsed="0.000667"/>
</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-10-16T01:22:30.230210" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:30.229379" elapsed="0.000889"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:30.231275" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:30.230627" elapsed="0.000704"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:30.231453" elapsed="0.000070"/>
</return>
<msg time="2026-10-16T01:22:30.231796" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:30.228370" elapsed="0.003479"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:22:30.232182" elapsed="0.000324"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:30.233647" 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-10-16T01:22:30.232908" elapsed="0.000827"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:30.234606" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:30.234071" elapsed="0.000589"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:30.235542" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:30.235006" elapsed="0.000589"/>
</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-10-16T01:22:30.244588" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:22:30.243147" elapsed="0.001630"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:22:30.244916" elapsed="0.000135"/>
</return>
<msg time="2026-10-16T01:22:30.245520" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:22:30.239766" elapsed="0.005884"/>
</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-10-16T01:22:30.269370" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:30.268943" elapsed="0.000464"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:22:30.270480" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:22:30.270130" elapsed="0.000470">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:30.270741" 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-10-16T01:22:30.269648" elapsed="0.001126"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:30.271582" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:30.271116" elapsed="0.000503"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:22:30.272036" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:22:30.272269" 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-10-16T01:22:30.271870" elapsed="0.000432"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:30.272930" 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-10-16T01:22:30.272592" elapsed="0.000394"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:30.274320" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:30.273944" elapsed="0.000419"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:22:30.274891" 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-10-16T01:22:30.274589" elapsed="0.000333"/>
</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-10-16T01:22:30.275215" 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-10-16T01:22:30.275428" 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-10-16T01:22:30.275619" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:22:30.275083" elapsed="0.000589"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:22:30.274966" elapsed="0.000758"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:22:30.275771" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:22:30.275903" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:22:30.273473" elapsed="0.002455"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:30.273072" elapsed="0.002891"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:30.276144" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:30.275992" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:30.273048" elapsed="0.003171"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:22:30.276854" 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-10-16T01:22:30.276382" elapsed="0.000499"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:22:30.276924" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:22:30.268198" elapsed="0.008827"/>
</kw>
<msg time="2026-10-16T01:22:30.277077" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:30.262292" elapsed="0.014832"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:30.280985" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:30.284809" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:30.288798" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:30.289015" 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-10-16T01:22:30.289197" 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-10-16T01:22:30.289561" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:30.289402" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:30.289388" 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-10-16T01:22:30.289815" 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-10-16T01:22:30.289997" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:30.290159" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:22:30.289362" elapsed="0.000847"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:22:30.289269" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:30.290387" elapsed="0.000035"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:30.290474" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:22:30.290581" 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-10-16T01:22:30.261447" elapsed="0.029158"/>
</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-10-16T01:22:30.291871" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:30.291619" elapsed="0.000323">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:30.292040" 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-10-16T01:22:30.291209" elapsed="0.000858"/>
</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-10-16T01:22:30.292432" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:30.292141" elapsed="0.000362"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:22:30.293093" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:30.292760" elapsed="0.000362"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:30.292531" elapsed="0.000633"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:30.292121" elapsed="0.001074"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:30.293896" 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-10-16T01:22:30.293427" elapsed="0.000502"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:22:30.293988" elapsed="0.000032"/>
</return>
<msg time="2026-10-16T01:22:30.294138" 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-manganese/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-10-16T01:22:30.290905" elapsed="0.003260"/>
</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-10-16T01:22:30.295550" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:30.295314" elapsed="0.000298">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:30.295712" 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-10-16T01:22:30.294883" elapsed="0.000854"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:22:30.295953" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:22:30.295848" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:30.295829" elapsed="0.000205"/>
</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-10-16T01:22:30.296199" 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-10-16T01:22:30.296378" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:30.296460" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:22:30.296589" 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-manganese/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-10-16T01:22:30.294489" elapsed="0.002124"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:30.298282" 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-10-16T01:22:30.298032" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:30.298807" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:30.298542" 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-10-16T01:22:30.303611" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:22:30.303671" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:22:30.303809" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:30.299143" elapsed="0.005108">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:30.298912" elapsed="0.005428">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:30.304548" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:30.304371" elapsed="0.000239"/>
</branch>
<status status="FAIL" start="2026-10-16T01:22:30.298895" elapsed="0.005737">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:30.305006" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:30.305128" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:30.305096" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:30.305080" elapsed="0.000106"/>
</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-10-16T01:22:30.305323" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:22:30.305386" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:22:30.297133" elapsed="0.008381">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:30.305584" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:22:30.251586" elapsed="0.054170">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:22:30.306159" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:30.305933" elapsed="0.000348"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:30.305884" elapsed="0.000441"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:30.306428" elapsed="0.000041"/>
</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="FAIL" start="2026-10-16T01:22:30.249338" elapsed="0.057266">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:30.246176" elapsed="0.060550">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:22:30.246130" elapsed="0.060677">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:30.307070" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:22:30.307447" elapsed="0.000023"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:30.307805" elapsed="0.000022"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:22:30.308171" elapsed="0.000024"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:22:30.308656" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:30.309008" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:30.309372" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:22:30.309636" elapsed="0.000019"/>
</return>
<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="FAIL" start="2026-10-16T01:22:30.238365" elapsed="0.071413">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:22:30.309848" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:22:30.236459" elapsed="0.073483">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:30.310178" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:30.310032" elapsed="0.000199"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:30.310400" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:30.310255" elapsed="0.000211"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:30.310638" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:30.310489" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:30.310013" elapsed="0.000787"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:22:30.236097" elapsed="0.074746">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:22:30.235690" elapsed="0.075210">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:30.310953" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:22:30.227005" elapsed="0.084044">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:30.311233" elapsed="0.000063"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:30.311527" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:30.311362" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:30.311345" elapsed="0.000254"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:30.311813" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:30.311988" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:30.312047" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:22:30.225330" elapsed="0.086815">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:22:30.224846" elapsed="0.087365">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:22:30.224535" elapsed="0.087728">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:22:30.223728" elapsed="0.088622">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:30.312592" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:22:30.201180" elapsed="0.111537">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:22:31.333882" elapsed="0.000459"/>
</kw>
<msg time="2026-10-16T01:22:31.334513" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:31.332444" elapsed="0.002215"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:22:31.331463" elapsed="0.003399"/>
</kw>
<msg time="2026-10-16T01:22:31.334956" 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-10-16T01:22:31.324220" elapsed="0.010829"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:22:31.323290" elapsed="0.011910"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:31.336300" 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-10-16T01:22:31.335773" elapsed="0.000620"/>
</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-10-16T01:22:31.343300" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:31.342486" elapsed="0.000872"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:31.344364" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:31.343757" elapsed="0.000689"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:31.344558" elapsed="0.000068"/>
</return>
<msg time="2026-10-16T01:22:31.344891" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:31.341630" elapsed="0.003312"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:22:31.345275" elapsed="0.000314"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:31.346886" 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-10-16T01:22:31.345986" elapsed="0.000958"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:31.347855" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:31.347275" elapsed="0.000635"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:31.348793" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:31.348224" elapsed="0.000624"/>
</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-10-16T01:22:31.357828" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:22:31.356359" elapsed="0.001580"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:22:31.358068" elapsed="0.000138"/>
</return>
<msg time="2026-10-16T01:22:31.358665" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:22:31.352916" elapsed="0.006047"/>
</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-10-16T01:22:31.382331" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:31.381905" elapsed="0.000463"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:22:31.383558" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:22:31.383184" elapsed="0.000490">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:31.383820" 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-10-16T01:22:31.382606" elapsed="0.001245"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:31.384540" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:31.384088" elapsed="0.000488"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:22:31.384991" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:22:31.385227" 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-10-16T01:22:31.384826" elapsed="0.000434"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:31.385882" 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-10-16T01:22:31.385550" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:31.387466" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:31.387138" elapsed="0.000370"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:22:31.388040" 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-10-16T01:22:31.387716" elapsed="0.000355"/>
</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-10-16T01:22:31.388397" elapsed="0.000037"/>
</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-10-16T01:22:31.388605" elapsed="0.000022"/>
</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-10-16T01:22:31.388807" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:22:31.388248" elapsed="0.000613"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:22:31.388119" elapsed="0.000773"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:22:31.388936" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:22:31.389064" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:22:31.386568" elapsed="0.002519"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:31.386185" elapsed="0.002931"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:31.389286" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:31.389143" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:31.386001" elapsed="0.003357"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:22:31.389969" 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-10-16T01:22:31.389540" elapsed="0.000502"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:22:31.390090" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:22:31.381166" elapsed="0.009026"/>
</kw>
<msg time="2026-10-16T01:22:31.390240" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:31.375465" elapsed="0.014821"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:31.394122" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:31.398403" elapsed="0.000053"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:31.402713" elapsed="0.000047"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:31.402966" 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-10-16T01:22:31.403178" 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-10-16T01:22:31.403611" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:31.403448" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:31.403411" elapsed="0.000276"/>
</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-10-16T01:22:31.403858" elapsed="0.000019"/>
</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-10-16T01:22:31.404033" elapsed="0.000018"/>
</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-10-16T01:22:31.404192" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:22:31.403384" elapsed="0.000856"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:22:31.403248" elapsed="0.001015"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:31.404413" elapsed="0.000036"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:31.404510" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:22:31.404616" 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-10-16T01:22:31.374591" elapsed="0.030048"/>
</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-10-16T01:22:31.405846" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:31.405624" elapsed="0.000284">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:31.405991" 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-10-16T01:22:31.405273" elapsed="0.000741"/>
</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-10-16T01:22:31.406375" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:31.406150" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:22:31.406916" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:31.406628" elapsed="0.000312"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:31.406468" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:31.406129" elapsed="0.000863"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:31.407503" 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-10-16T01:22:31.407148" elapsed="0.000380"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:22:31.407572" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:22:31.407713" 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-manganese/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-10-16T01:22:31.404927" elapsed="0.002811"/>
</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-10-16T01:22:31.409032" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:31.408618" elapsed="0.000476">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:31.409179" 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-10-16T01:22:31.408286" elapsed="0.000916"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:22:31.409364" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:22:31.409266" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:31.409249" elapsed="0.000208"/>
</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-10-16T01:22:31.409608" 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-10-16T01:22:31.409802" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:31.409864" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:22:31.409988" 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-manganese/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-10-16T01:22:31.407989" elapsed="0.002022"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:31.411241" 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-10-16T01:22:31.411017" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:31.411719" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:31.411486" elapsed="0.000274"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:22:31.416011" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:22:31.416070" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:22:31.416173" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:31.412043" elapsed="0.004560">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:31.411820" elapsed="0.004913">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:31.416918" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:31.416767" elapsed="0.000210"/>
</branch>
<status status="FAIL" start="2026-10-16T01:22:31.411803" elapsed="0.005195">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:31.417345" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:31.417487" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:31.417451" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:31.417434" elapsed="0.000130"/>
</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-10-16T01:22:31.417742" elapsed="0.000025"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:22:31.417825" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:22:31.410290" elapsed="0.007658">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:31.418029" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:22:31.364847" elapsed="0.053328">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:22:31.418650" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:31.418350" elapsed="0.000412"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:31.418301" elapsed="0.000505"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:31.418893" elapsed="0.000037"/>
</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="FAIL" start="2026-10-16T01:22:31.362644" elapsed="0.056421">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:31.359445" elapsed="0.059724">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:22:31.359378" elapsed="0.059867">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:31.419522" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:22:31.419963" elapsed="0.000024"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:31.420296" elapsed="0.000022"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:22:31.420680" elapsed="0.000047"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:22:31.421150" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:31.421489" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:31.421876" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:22:31.422119" elapsed="0.000019"/>
</return>
<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="FAIL" start="2026-10-16T01:22:31.351556" elapsed="0.070692">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:22:31.422352" elapsed="0.000029"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:22:31.349686" elapsed="0.072794">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:31.422785" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:31.422576" elapsed="0.000270"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:31.423050" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:31.422894" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:31.423302" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:31.423121" elapsed="0.000264"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:31.422547" elapsed="0.000860"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:22:31.349331" elapsed="0.074140">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:22:31.348945" elapsed="0.074617">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:31.423621" elapsed="0.000024"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:22:31.340252" elapsed="0.083585">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:31.424088" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:31.424320" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:31.424178" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:31.424153" elapsed="0.000236"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:31.424534" elapsed="0.000033"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:31.424844" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:31.424950" elapsed="0.000016"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:22:31.338631" elapsed="0.086434">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:22:31.338133" elapsed="0.087014">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:22:31.337872" elapsed="0.087338">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:22:31.337037" elapsed="0.088276">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:31.425546" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:22:31.313758" elapsed="0.111896">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:22:32.446876" elapsed="0.000458"/>
</kw>
<msg time="2026-10-16T01:22:32.447503" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:32.445199" elapsed="0.002675"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:22:32.444182" elapsed="0.003870"/>
</kw>
<msg time="2026-10-16T01:22:32.448149" 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-10-16T01:22:32.437146" elapsed="0.011095"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:22:32.436219" elapsed="0.012171"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:32.449515" 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-10-16T01:22:32.448958" elapsed="0.000651"/>
</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-10-16T01:22:32.456334" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:32.455527" elapsed="0.000865"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:32.457500" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:32.456857" elapsed="0.000701"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:32.457659" elapsed="0.000097"/>
</return>
<msg time="2026-10-16T01:22:32.457994" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:32.454683" elapsed="0.003360"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:22:32.458373" elapsed="0.000313"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:32.459813" 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-10-16T01:22:32.459083" elapsed="0.000787"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:32.460763" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:32.460195" elapsed="0.000623"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:32.461648" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:32.461127" elapsed="0.000602"/>
</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-10-16T01:22:32.470990" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:22:32.469222" elapsed="0.001883"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:22:32.471233" elapsed="0.000134"/>
</return>
<msg time="2026-10-16T01:22:32.471861" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:22:32.465822" elapsed="0.006121"/>
</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-10-16T01:22:32.494693" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:32.494256" elapsed="0.000495"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:22:32.495784" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:22:32.495411" elapsed="0.000491">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:32.496022" 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-10-16T01:22:32.494968" elapsed="0.001085"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:32.496768" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:32.496290" elapsed="0.000513"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:22:32.497196" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:22:32.497527" 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-10-16T01:22:32.497034" elapsed="0.000535"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:32.498107" 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-10-16T01:22:32.497881" elapsed="0.000267"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:32.499211" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:32.498960" elapsed="0.000300"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:22:32.499795" 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-10-16T01:22:32.499481" elapsed="0.000341"/>
</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-10-16T01:22:32.500115" 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-10-16T01:22:32.500304" 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-10-16T01:22:32.500515" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:22:32.499982" elapsed="0.000588"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:22:32.499867" elapsed="0.000736"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:22:32.500645" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:22:32.500794" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:22:32.498602" elapsed="0.002216"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:32.498208" elapsed="0.002639"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:32.501020" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:32.500876" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:32.498192" elapsed="0.002899"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:22:32.501678" 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-10-16T01:22:32.501250" elapsed="0.000469"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:22:32.501765" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:22:32.493525" elapsed="0.008340"/>
</kw>
<msg time="2026-10-16T01:22:32.501914" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:32.487762" elapsed="0.014198"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:32.505870" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:32.509632" elapsed="0.000040"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:32.513541" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:32.513772" 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-10-16T01:22:32.513953" 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-10-16T01:22:32.514297" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:32.514155" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:32.514141" elapsed="0.000229"/>
</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-10-16T01:22:32.514536" 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-10-16T01:22:32.514732" 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-10-16T01:22:32.514895" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:22:32.514115" elapsed="0.000828"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:22:32.514024" elapsed="0.000942"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:32.515117" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:32.515184" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:22:32.515288" 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-10-16T01:22:32.486894" elapsed="0.028418"/>
</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-10-16T01:22:32.516463" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:32.516238" elapsed="0.000287">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:32.516609" 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-10-16T01:22:32.515915" elapsed="0.000717"/>
</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-10-16T01:22:32.516982" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:32.516710" elapsed="0.000327"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:22:32.517499" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:32.517220" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:32.517060" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:32.516678" elapsed="0.000897"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:32.518092" 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-10-16T01:22:32.517755" elapsed="0.000362"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:22:32.518162" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:22:32.518284" 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-manganese/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-10-16T01:22:32.515598" elapsed="0.002709"/>
</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-10-16T01:22:32.519404" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:32.519202" elapsed="0.000286">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:32.519573" 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-10-16T01:22:32.518887" elapsed="0.000709"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:22:32.522105" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:22:32.521991" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:32.519643" elapsed="0.002543"/>
</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-10-16T01:22:32.522339" 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-10-16T01:22:32.522584" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:32.522650" elapsed="0.000019"/>
</return>
<msg time="2026-10-16T01:22:32.522837" 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-manganese/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-10-16T01:22:32.518573" elapsed="0.004291"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:32.524157" 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-10-16T01:22:32.523928" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:32.524653" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:32.524391" 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-10-16T01:22:32.529124" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:22:32.529182" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:22:32.529292" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:32.524999" elapsed="0.004750">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:32.524772" elapsed="0.005065">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:32.530022" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:32.529868" elapsed="0.000213"/>
</branch>
<status status="FAIL" start="2026-10-16T01:22:32.524755" elapsed="0.005348">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:32.530465" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:32.530587" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:32.530554" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:32.530537" elapsed="0.000108"/>
</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-10-16T01:22:32.530798" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:22:32.530862" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:22:32.523160" elapsed="0.007806">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:32.531037" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:22:32.477037" elapsed="0.054132">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:22:32.531591" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:32.531341" elapsed="0.000337"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:32.531292" elapsed="0.000455"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:32.531839" elapsed="0.000038"/>
</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="FAIL" start="2026-10-16T01:22:32.474675" elapsed="0.057370">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:32.472247" elapsed="0.059903">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:22:32.472215" elapsed="0.060011">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:32.532543" elapsed="0.000030"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:22:32.532960" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:32.533313" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:22:32.533730" elapsed="0.000024"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:22:32.534176" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:32.534630" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:32.535021" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:22:32.535269" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:22:32.464452" elapsed="0.070919">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:22:32.535448" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:22:32.462555" elapsed="0.072984">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:32.535787" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:32.535619" elapsed="0.000221"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:32.536001" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:32.535862" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:32.536214" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:32.536073" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:32.535603" elapsed="0.000679"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:22:32.462191" elapsed="0.074129">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:22:32.461825" elapsed="0.074551">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:32.536455" elapsed="0.000024"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:22:32.453295" elapsed="0.083267">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:32.536825" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:32.537049" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:32.536906" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:32.536891" elapsed="0.000228"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:32.537295" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:32.537485" elapsed="0.000022"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:32.537550" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:22:32.451691" elapsed="0.085953">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:22:32.451189" elapsed="0.086591">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:22:32.450919" elapsed="0.086914">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:22:32.450098" elapsed="0.087819">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:32.538216" elapsed="0.000027"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:22:32.426660" elapsed="0.111669">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:22:33.559501" elapsed="0.000476"/>
</kw>
<msg time="2026-10-16T01:22:33.560120" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:33.558070" elapsed="0.002187"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:22:33.556903" elapsed="0.003516"/>
</kw>
<msg time="2026-10-16T01:22:33.560536" 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-10-16T01:22:33.549686" elapsed="0.010944"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:22:33.548798" elapsed="0.012014"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:33.561897" 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-10-16T01:22:33.561322" elapsed="0.000669"/>
</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-10-16T01:22:33.568956" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:33.568139" elapsed="0.000887"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:33.570033" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:33.569365" elapsed="0.000722"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:33.570188" elapsed="0.000067"/>
</return>
<msg time="2026-10-16T01:22:33.570512" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:33.567277" elapsed="0.003291"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:22:33.570930" elapsed="0.000290"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:33.572309" 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-10-16T01:22:33.571609" elapsed="0.000756"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:33.573334" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:33.572751" elapsed="0.000646"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:33.574467" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:33.573767" elapsed="0.000757"/>
</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-10-16T01:22:33.583344" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:22:33.581970" elapsed="0.001506"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:22:33.583608" elapsed="0.000299"/>
</return>
<msg time="2026-10-16T01:22:33.584368" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:22:33.578609" elapsed="0.005915"/>
</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-10-16T01:22:33.608295" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:33.607867" elapsed="0.000464"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:22:33.609409" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:22:33.609047" elapsed="0.000497">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:33.609667" 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-10-16T01:22:33.608575" elapsed="0.001145"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:33.610400" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:33.609962" elapsed="0.000473"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:22:33.610868" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:22:33.611164" 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-10-16T01:22:33.610681" elapsed="0.000517"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:33.611906" 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-10-16T01:22:33.611506" elapsed="0.000460"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:33.613148" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:33.612917" elapsed="0.000272"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:22:33.613797" 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-10-16T01:22:33.613363" elapsed="0.000460"/>
</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-10-16T01:22:33.614114" 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-10-16T01:22:33.614302" 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-10-16T01:22:33.614504" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:22:33.613982" elapsed="0.000580"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:22:33.613867" elapsed="0.000727"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:22:33.614639" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:22:33.614784" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:22:33.612416" elapsed="0.002392"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:33.612054" elapsed="0.002783"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:33.615013" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:33.614866" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:33.612030" elapsed="0.003054"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:22:33.615671" 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-10-16T01:22:33.615244" elapsed="0.000452"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:22:33.615755" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:22:33.607122" elapsed="0.008734"/>
</kw>
<msg time="2026-10-16T01:22:33.615946" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:33.601326" elapsed="0.014668"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:33.619898" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:33.623756" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:33.627605" elapsed="0.000031"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:33.627846" 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-10-16T01:22:33.628028" elapsed="0.000019"/>
</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-10-16T01:22:33.628373" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:33.628231" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:33.628217" elapsed="0.000245"/>
</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-10-16T01:22:33.628617" 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-10-16T01:22:33.628815" 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-10-16T01:22:33.628977" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:22:33.628191" elapsed="0.000833"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:22:33.628099" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:33.629200" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:33.629268" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:22:33.629373" 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-10-16T01:22:33.600457" elapsed="0.028939"/>
</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-10-16T01:22:33.630536" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:33.630319" elapsed="0.000283">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:33.630749" 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-10-16T01:22:33.629997" elapsed="0.000777"/>
</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-10-16T01:22:33.631058" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:33.630840" elapsed="0.000270"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:22:33.631576" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:33.631295" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:33.631133" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:33.630822" elapsed="0.000831"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:33.632166" 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-10-16T01:22:33.631827" elapsed="0.000364"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:22:33.632236" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:22:33.632359" 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-manganese/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-10-16T01:22:33.629680" elapsed="0.002702"/>
</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-10-16T01:22:33.633570" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:33.633346" elapsed="0.000283">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:33.633729" 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-10-16T01:22:33.632980" elapsed="0.000774"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:22:33.633923" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:22:33.633819" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:33.633801" elapsed="0.000202"/>
</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-10-16T01:22:33.634155" elapsed="0.000020"/>
</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-10-16T01:22:33.634328" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:33.634387" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:22:33.634527" 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-manganese/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-10-16T01:22:33.632647" elapsed="0.001904"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:33.635976" 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-10-16T01:22:33.635749" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:33.636421" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:33.636203" elapsed="0.000273"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:22:33.641205" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:22:33.641264" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:22:33.641376" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:33.636780" elapsed="0.005057">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:33.636541" elapsed="0.005384">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:33.642106" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:33.641956" elapsed="0.000240"/>
</branch>
<status status="FAIL" start="2026-10-16T01:22:33.636522" elapsed="0.005699">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:33.642595" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:33.642736" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:33.642683" elapsed="0.000093"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:33.642667" elapsed="0.000129"/>
</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-10-16T01:22:33.642933" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:22:33.642997" elapsed="0.000013"/>
</return>
<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="FAIL" start="2026-10-16T01:22:33.635019" elapsed="0.008085">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:33.643171" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:22:33.590372" elapsed="0.052927">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:22:33.643737" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:33.643489" elapsed="0.000335"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:33.643421" elapsed="0.000445"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:33.643950" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:22:33.588168" elapsed="0.055948">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:33.585143" elapsed="0.059074">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:22:33.585094" elapsed="0.059196">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:33.644563" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:22:33.644944" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:33.645263" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:22:33.645649" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:22:33.646147" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:33.646481" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:33.646864" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:22:33.647113" elapsed="0.000019"/>
</return>
<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="FAIL" start="2026-10-16T01:22:33.577261" elapsed="0.069956">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:22:33.647278" elapsed="0.000018"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:22:33.575357" elapsed="0.072012">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:33.647694" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:33.647552" elapsed="0.000224"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:33.647937" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:33.647798" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:33.648152" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:33.648009" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:33.647534" elapsed="0.000686"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:22:33.575024" elapsed="0.073234">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:22:33.574621" elapsed="0.073690">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:33.648360" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:22:33.565798" elapsed="0.082666">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:33.648642" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:33.648891" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:33.648747" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:33.648730" elapsed="0.000229"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:33.649085" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:33.649254" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:33.649312" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:22:33.564096" elapsed="0.085308">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:22:33.563589" elapsed="0.085933">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:22:33.563301" elapsed="0.086271">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:22:33.562501" elapsed="0.087154">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:33.649991" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:22:33.539284" elapsed="0.110812">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:22:34.670328" elapsed="0.000514"/>
</kw>
<msg time="2026-10-16T01:22:34.670987" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:34.669034" elapsed="0.002095"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:22:34.668082" elapsed="0.003209"/>
</kw>
<msg time="2026-10-16T01:22:34.671580" 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-10-16T01:22:34.661247" elapsed="0.010433"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:22:34.660329" elapsed="0.011547"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:34.672992" 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-10-16T01:22:34.672388" elapsed="0.000701"/>
</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-10-16T01:22:34.679968" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:34.679164" elapsed="0.000863"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:34.681022" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:34.680361" elapsed="0.000715"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:34.681176" elapsed="0.000067"/>
</return>
<msg time="2026-10-16T01:22:34.681522" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:34.678311" elapsed="0.003266"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:22:34.681938" elapsed="0.000313"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:34.683379" 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-10-16T01:22:34.682679" elapsed="0.000756"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:34.684356" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:34.683822" elapsed="0.000587"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:34.685265" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:34.684764" elapsed="0.000553"/>
</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-10-16T01:22:34.696146" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:22:34.694694" elapsed="0.001565"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:22:34.696394" elapsed="0.000178"/>
</return>
<msg time="2026-10-16T01:22:34.697371" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:22:34.690972" elapsed="0.006594"/>
</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-10-16T01:22:34.720885" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:34.720357" elapsed="0.000566"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:22:34.721731" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:22:34.721423" elapsed="0.000407">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:34.721916" 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-10-16T01:22:34.721101" elapsed="0.000838"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:34.722427" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:34.722115" elapsed="0.000355"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:22:34.722784" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:22:34.722986" 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-10-16T01:22:34.722644" elapsed="0.000366"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:34.723529" 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-10-16T01:22:34.723208" elapsed="0.000364"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:34.724663" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:34.724262" elapsed="0.000458"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:22:34.725166" 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-10-16T01:22:34.724899" 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-10-16T01:22:34.725567" 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-10-16T01:22:34.725770" 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-10-16T01:22:34.725956" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:22:34.725373" elapsed="0.000635"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:22:34.725243" elapsed="0.000797"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:22:34.726085" elapsed="0.000029"/>
</return>
<msg time="2026-10-16T01:22:34.726220" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:22:34.723926" elapsed="0.002317"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:34.723640" elapsed="0.002632"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:34.726446" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:34.726301" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:34.723620" elapsed="0.002918"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:22:34.727141" 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-10-16T01:22:34.726717" elapsed="0.000449"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:22:34.727210" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:22:34.719623" elapsed="0.007687"/>
</kw>
<msg time="2026-10-16T01:22:34.727359" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:34.713790" elapsed="0.013618"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:34.731243" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:34.735066" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:34.738869" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:34.739046" elapsed="0.000019"/>
</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-10-16T01:22:34.739223" 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-10-16T01:22:34.739689" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:34.739426" elapsed="0.000332"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:34.739412" elapsed="0.000369"/>
</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-10-16T01:22:34.739936" elapsed="0.000019"/>
</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-10-16T01:22:34.740111" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:34.740271" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:22:34.739385" elapsed="0.000935"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:22:34.739295" elapsed="0.001048"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:34.740512" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:34.740582" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:22:34.740687" 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-10-16T01:22:34.712905" elapsed="0.027822"/>
</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-10-16T01:22:34.741878" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:34.741645" elapsed="0.000298">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:34.742026" 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-10-16T01:22:34.741303" elapsed="0.000747"/>
</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-10-16T01:22:34.742332" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:34.742113" elapsed="0.000270"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:22:34.742893" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:34.742608" elapsed="0.000309"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:34.742406" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:34.742096" elapsed="0.000873"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:34.743476" 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-10-16T01:22:34.743126" elapsed="0.000375"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:22:34.743546" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:22:34.743671" 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-manganese/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-10-16T01:22:34.741003" elapsed="0.002707"/>
</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-10-16T01:22:34.744816" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:34.744599" elapsed="0.000277">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:34.744960" 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-10-16T01:22:34.744265" elapsed="0.000718"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:22:34.745149" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:22:34.745047" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:34.745030" elapsed="0.000198"/>
</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-10-16T01:22:34.745379" elapsed="0.000020"/>
</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-10-16T01:22:34.745570" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:34.745632" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:22:34.745775" 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-manganese/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-10-16T01:22:34.743967" elapsed="0.001879"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:34.747314" 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-10-16T01:22:34.747086" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:34.747800" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:34.747559" 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-10-16T01:22:34.752474" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:22:34.752533" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:22:34.752647" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:34.748127" elapsed="0.004982">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:34.747901" elapsed="0.005296">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:34.753379" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:34.753227" elapsed="0.000210"/>
</branch>
<status status="FAIL" start="2026-10-16T01:22:34.747885" elapsed="0.005588">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:34.753850" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:34.753970" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:34.753938" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:34.753921" elapsed="0.000107"/>
</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-10-16T01:22:34.754165" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:22:34.754229" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:22:34.746299" elapsed="0.008050">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:34.754420" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:22:34.703023" elapsed="0.051560">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:22:34.755017" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:34.754789" elapsed="0.000313"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:34.754736" elapsed="0.000409"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:34.755234" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:22:34.700739" elapsed="0.054662">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:34.698055" elapsed="0.057496">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:22:34.698012" elapsed="0.057623">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:34.755911" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:22:34.756273" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:34.756696" elapsed="0.000058"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:22:34.757111" elapsed="0.000024"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:22:34.757585" elapsed="0.000026"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:34.757945" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:34.758307" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:22:34.758572" elapsed="0.000019"/>
</return>
<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="FAIL" start="2026-10-16T01:22:34.689105" elapsed="0.069571">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:22:34.758768" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:22:34.686374" elapsed="0.072486">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:34.759083" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:34.758942" elapsed="0.000192"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:34.759292" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:34.759156" elapsed="0.000185"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:34.759533" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:34.759364" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:34.758927" elapsed="0.000679"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:22:34.685922" elapsed="0.073721">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:22:34.685410" elapsed="0.074286">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:34.759832" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:22:34.676929" elapsed="0.083002">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:34.760117" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:34.760338" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:34.760197" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:34.760182" elapsed="0.000226"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:34.760580" elapsed="0.000021"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:34.760840" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:34.760902" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:22:34.675194" elapsed="0.085854">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:22:34.674682" elapsed="0.086436">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:22:34.674369" elapsed="0.086801">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:22:34.673573" elapsed="0.087687">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:34.761502" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:22:34.651102" elapsed="0.110511">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:22:35.771529" elapsed="0.000266"/>
</kw>
<msg time="2026-10-16T01:22:35.771885" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:35.770915" elapsed="0.001056"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:22:35.770488" elapsed="0.001565"/>
</kw>
<msg time="2026-10-16T01:22:35.772096" 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-10-16T01:22:35.767259" elapsed="0.004882"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:22:35.766839" elapsed="0.005372"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:35.772739" 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-10-16T01:22:35.772485" 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-10-16T01:22:35.775868" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:35.775503" elapsed="0.000391"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:35.776318" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:35.776047" elapsed="0.000296"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:35.776402" elapsed="0.000041"/>
</return>
<msg time="2026-10-16T01:22:35.776594" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:35.775130" elapsed="0.001495"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:22:35.776811" elapsed="0.000139"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:35.777441" 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-10-16T01:22:35.777116" elapsed="0.000371"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:35.777957" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:35.777669" elapsed="0.000316"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:35.778494" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:35.778166" elapsed="0.000370"/>
</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-10-16T01:22:35.782987" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:22:35.782270" elapsed="0.000869"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:22:35.783203" elapsed="0.000068"/>
</return>
<msg time="2026-10-16T01:22:35.783546" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:22:35.780515" elapsed="0.003094"/>
</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-10-16T01:22:35.800247" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:35.799943" elapsed="0.000330"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:22:35.801079" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:22:35.800799" elapsed="0.000378">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:35.801263" 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-10-16T01:22:35.800432" elapsed="0.000855"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:35.801805" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:35.801457" elapsed="0.000373"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:22:35.802117" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:22:35.802309" 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-10-16T01:22:35.801997" elapsed="0.000336"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:35.802783" 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-10-16T01:22:35.802543" 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-10-16T01:22:35.803878" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:35.803623" elapsed="0.000297"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:22:35.804362" 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-10-16T01:22:35.804098" 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-10-16T01:22:35.804709" 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-10-16T01:22:35.804899" elapsed="0.000022"/>
</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-10-16T01:22:35.805081" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:22:35.804564" elapsed="0.000569"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:22:35.804431" elapsed="0.000734"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:22:35.805208" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:22:35.805335" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:22:35.803268" elapsed="0.002090"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:35.803004" 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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:35.805582" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:35.805420" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:35.802869" elapsed="0.002784"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:22:35.806237" 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-10-16T01:22:35.805825" elapsed="0.000437"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:22:35.806306" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:22:35.799405" elapsed="0.006999"/>
</kw>
<msg time="2026-10-16T01:22:35.806509" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:35.795234" elapsed="0.011324"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:35.810427" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:35.814279" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:35.818072" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:35.818251" 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-10-16T01:22:35.818430" elapsed="0.000019"/>
</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-10-16T01:22:35.818900" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:35.818666" elapsed="0.000308"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:35.818642" elapsed="0.000356"/>
</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-10-16T01:22:35.819159" 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-10-16T01:22:35.819336" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:35.819513" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:22:35.818606" elapsed="0.000958"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:22:35.818514" elapsed="0.001074"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:35.819755" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:35.819824" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:22:35.819934" 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-10-16T01:22:35.794619" elapsed="0.025338"/>
</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-10-16T01:22:35.821146" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:35.820915" elapsed="0.000300">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:35.821299" 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-10-16T01:22:35.820558" elapsed="0.000765"/>
</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-10-16T01:22:35.821632" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:35.821388" elapsed="0.000368"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:22:35.822248" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:35.821968" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:35.821783" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:35.821370" elapsed="0.000957"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:35.822892" 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-10-16T01:22:35.822517" elapsed="0.000400"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:22:35.822963" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:22:35.823090" 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-manganese/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-10-16T01:22:35.820234" elapsed="0.002885"/>
</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-10-16T01:22:35.826478" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:35.824040" elapsed="0.002503">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:35.826630" 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-10-16T01:22:35.823691" elapsed="0.002962"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:22:35.826839" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:22:35.826736" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:35.826717" elapsed="0.000200"/>
</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-10-16T01:22:35.827075" 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-10-16T01:22:35.827259" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:35.827320" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:22:35.827445" 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-manganese/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-10-16T01:22:35.823371" elapsed="0.004114"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:35.828743" 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-10-16T01:22:35.828487" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:35.829194" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:35.828973" elapsed="0.000263"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:22:35.833854" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:22:35.833915" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:22:35.834031" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:35.829540" elapsed="0.004953">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:35.829296" elapsed="0.005283">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:35.834782" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:35.834610" elapsed="0.000233"/>
</branch>
<status status="FAIL" start="2026-10-16T01:22:35.829279" elapsed="0.005586">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:35.835219" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:35.835380" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:35.835346" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:35.835328" elapsed="0.000110"/>
</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-10-16T01:22:35.835593" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:22:35.835657" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:22:35.827780" elapsed="0.007997">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:35.835846" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:22:35.787449" elapsed="0.048548">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:22:35.836406" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:35.836182" elapsed="0.000325"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:35.836130" elapsed="0.000421"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:35.836638" elapsed="0.000040"/>
</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="FAIL" start="2026-10-16T01:22:35.785844" elapsed="0.050994">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:35.783870" elapsed="0.053072">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:22:35.783843" elapsed="0.053174">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:35.837275" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:22:35.837732" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:35.838065" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:22:35.838433" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:22:35.838920" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:35.839249" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:35.839626" elapsed="0.000019"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:22:35.839904" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:22:35.779898" elapsed="0.060107">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:22:35.840067" elapsed="0.000014"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:22:35.778998" elapsed="0.061158">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:35.840375" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:35.840234" elapsed="0.000191"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:35.840638" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:35.840447" elapsed="0.000242"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:35.840879" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:35.840737" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:35.840219" elapsed="0.000727"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:22:35.778835" elapsed="0.062149">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:22:35.778593" elapsed="0.062444">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:35.841087" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:22:35.774519" elapsed="0.066659">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:35.841353" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:35.841585" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:35.841430" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:35.841415" elapsed="0.000243"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:35.841880" elapsed="0.000021"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:35.842052" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:35.842109" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:22:35.773787" elapsed="0.068413">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:22:35.773525" elapsed="0.068736">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:22:35.773365" elapsed="0.068945">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:22:35.773001" elapsed="0.069390">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:35.842621" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:22:35.762380" elapsed="0.080407">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:22:36.925511" elapsed="0.000239"/>
</kw>
<msg time="2026-10-16T01:22:36.925833" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:36.924911" elapsed="0.000997"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:22:36.924493" elapsed="0.001494"/>
</kw>
<msg time="2026-10-16T01:22:36.926030" 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-10-16T01:22:36.921395" elapsed="0.004675"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:22:36.920752" elapsed="0.005383"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:36.926758" 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-10-16T01:22:36.926503" elapsed="0.000298"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:36.929787" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:36.929412" elapsed="0.000402"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:36.930234" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:36.929964" elapsed="0.000294"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:36.930306" elapsed="0.000033"/>
</return>
<msg time="2026-10-16T01:22:36.930449" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:36.929060" elapsed="0.001432"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:22:36.930644" elapsed="0.000151"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:36.931258" 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-10-16T01:22:36.930961" elapsed="0.000321"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:36.931667" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:36.931428" elapsed="0.000263"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:36.932208" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:36.931845" elapsed="0.000387"/>
</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-10-16T01:22:36.936049" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:22:36.935395" elapsed="0.000704"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:22:36.936156" elapsed="0.000063"/>
</return>
<msg time="2026-10-16T01:22:36.936417" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:22:36.933901" 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-10-16T01:22:36.952744" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:36.952409" elapsed="0.000362"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:22:36.953515" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:22:36.953248" elapsed="0.000357">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:36.953691" 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-10-16T01:22:36.952929" elapsed="0.000799"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:36.954204" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:36.953897" elapsed="0.000333"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:22:36.954523" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:22:36.954720" 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-10-16T01:22:36.954392" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:36.955156" 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-10-16T01:22:36.954936" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:36.956099" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:36.955872" elapsed="0.000267"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:22:36.956628" 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-10-16T01:22:36.956311" elapsed="0.000342"/>
</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-10-16T01:22:36.956964" 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-10-16T01:22:36.957151" elapsed="0.000022"/>
</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-10-16T01:22:36.957329" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:22:36.956828" elapsed="0.000553"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:22:36.956711" elapsed="0.000700"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:22:36.957454" elapsed="0.000045"/>
</return>
<msg time="2026-10-16T01:22:36.957606" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:22:36.955522" elapsed="0.002107"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:36.955256" 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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:36.957845" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:36.957685" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:36.955239" elapsed="0.002677"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:22:36.958489" 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-10-16T01:22:36.958071" elapsed="0.000445"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:22:36.958560" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:22:36.951910" elapsed="0.006750"/>
</kw>
<msg time="2026-10-16T01:22:36.958725" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:36.947757" elapsed="0.011016"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:36.962562" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:36.966469" elapsed="0.000040"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:36.970427" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:36.970625" elapsed="0.000020"/>
</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-10-16T01:22:36.970819" 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-10-16T01:22:36.971164" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:36.971020" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:36.971006" 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-10-16T01:22:36.971387" elapsed="0.000019"/>
</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-10-16T01:22:36.971576" 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-10-16T01:22:36.971791" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:22:36.970980" elapsed="0.000862"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:22:36.970890" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:36.972018" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:36.972087" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:22:36.972192" 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-10-16T01:22:36.947120" elapsed="0.025096"/>
</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-10-16T01:22:36.973321" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:36.973131" elapsed="0.000250">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:36.973463" 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-10-16T01:22:36.972807" elapsed="0.000702"/>
</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-10-16T01:22:36.973805" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:36.973574" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:22:36.974302" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:36.974040" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:36.973882" elapsed="0.000476"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:36.973557" elapsed="0.000821"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:36.974904" 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-10-16T01:22:36.974553" elapsed="0.000375"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:22:36.974974" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:22:36.975097" 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-manganese/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-10-16T01:22:36.972492" elapsed="0.002627"/>
</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-10-16T01:22:36.976192" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:36.976005" elapsed="0.000245">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:36.976331" 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-10-16T01:22:36.975674" elapsed="0.000679"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:22:36.976584" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:22:36.976417" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:36.976400" elapsed="0.000261"/>
</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-10-16T01:22:36.976832" elapsed="0.000020"/>
</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-10-16T01:22:36.977002" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:36.977062" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:22:36.977185" 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-manganese/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-10-16T01:22:36.975361" elapsed="0.001846"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:36.978425" 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-10-16T01:22:36.978201" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:36.978956" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:36.978730" elapsed="0.000266"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:22:36.983773" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:22:36.983833" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:22:36.983960" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:36.979281" elapsed="0.005107">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:36.979058" elapsed="0.005434">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:36.984676" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:36.984525" elapsed="0.000230"/>
</branch>
<status status="FAIL" start="2026-10-16T01:22:36.979041" elapsed="0.005739">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:36.985122" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:36.985240" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:36.985208" elapsed="0.000069"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:36.985192" elapsed="0.000106"/>
</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-10-16T01:22:36.985431" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:22:36.985508" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:22:36.977494" elapsed="0.008119">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:36.985681" elapsed="0.000030"/>
</return>
<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="FAIL" start="2026-10-16T01:22:36.940176" elapsed="0.045653">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:22:36.986216" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:36.985997" elapsed="0.000301"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:36.985950" elapsed="0.000390"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:36.986423" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:22:36.938409" elapsed="0.048198">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:36.936744" elapsed="0.049990">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:22:36.936720" elapsed="0.050090">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:36.987060" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:22:36.987447" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:36.987804" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:22:36.988156" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:22:36.988612" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:36.988955" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:36.989299" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:22:36.989553" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:22:36.933304" elapsed="0.056350">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:22:36.989753" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:22:36.932616" elapsed="0.057228">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:36.990062" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:36.989924" elapsed="0.000188"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:36.990268" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:36.990134" elapsed="0.000183"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:36.990496" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:36.990338" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:36.989908" elapsed="0.000657"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:22:36.932447" elapsed="0.058155">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:22:36.932276" elapsed="0.058379">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:36.990723" elapsed="0.000016"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:22:36.928447" elapsed="0.062371">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:36.990993" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:36.991211" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:36.991071" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:36.991055" elapsed="0.000225"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:36.991405" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:36.991614" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:36.991675" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:22:36.927753" elapsed="0.064122">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:22:36.927514" elapsed="0.064426">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:22:36.927367" elapsed="0.064658">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:22:36.927014" elapsed="0.065095">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:36.992320" elapsed="0.000021"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:22:36.843778" elapsed="0.148648">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:22:38.011169" elapsed="0.000478"/>
</kw>
<msg time="2026-10-16T01:22:38.011818" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:38.009879" elapsed="0.002076"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:22:38.008949" elapsed="0.003170"/>
</kw>
<msg time="2026-10-16T01:22:38.012210" 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-10-16T01:22:38.002323" elapsed="0.009977"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:22:38.001418" elapsed="0.011029"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:38.013562" 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-10-16T01:22:38.013018" elapsed="0.000638"/>
</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-10-16T01:22:38.021136" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:38.020206" elapsed="0.000988"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:38.022271" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:38.021630" elapsed="0.000694"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:38.022422" elapsed="0.000089"/>
</return>
<msg time="2026-10-16T01:22:38.022785" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:38.019361" elapsed="0.003477"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:22:38.023169" elapsed="0.000286"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:38.024799" 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-10-16T01:22:38.023878" elapsed="0.000979"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:38.025750" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:38.025186" elapsed="0.000801"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:38.026889" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:38.026306" elapsed="0.000637"/>
</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-10-16T01:22:38.035535" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:22:38.034093" elapsed="0.001559"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:22:38.035827" elapsed="0.000138"/>
</return>
<msg time="2026-10-16T01:22:38.036393" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:22:38.030654" elapsed="0.005891"/>
</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-10-16T01:22:38.063349" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:38.062926" elapsed="0.000459"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:22:38.064414" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:22:38.064091" elapsed="0.000463">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:38.064676" 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-10-16T01:22:38.063623" elapsed="0.001104"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:38.065394" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:38.064966" elapsed="0.000463"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:22:38.065862" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:22:38.066077" 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-10-16T01:22:38.065679" elapsed="0.000431"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:38.066735" 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-10-16T01:22:38.066382" elapsed="0.000412"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:38.068067" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:38.067745" elapsed="0.000379"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:22:38.068775" 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-10-16T01:22:38.068367" elapsed="0.000442"/>
</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-10-16T01:22:38.069203" elapsed="0.000029"/>
</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-10-16T01:22:38.069461" elapsed="0.000052"/>
</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-10-16T01:22:38.069755" elapsed="0.000029"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:22:38.069024" elapsed="0.000806"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:22:38.068869" elapsed="0.001002"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:22:38.069930" elapsed="0.000036"/>
</return>
<msg time="2026-10-16T01:22:38.070108" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:22:38.067237" elapsed="0.002903"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:38.066881" elapsed="0.003298"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:38.070419" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:38.070217" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:38.066857" elapsed="0.003685"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:22:38.071355" 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-10-16T01:22:38.070782" elapsed="0.000609"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:22:38.071452" elapsed="0.000053"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:22:38.062188" elapsed="0.009424"/>
</kw>
<msg time="2026-10-16T01:22:38.071680" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:38.056468" elapsed="0.015305"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:38.076203" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:38.080056" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:38.083843" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:38.084020" elapsed="0.000019"/>
</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-10-16T01:22:38.084195" elapsed="0.000019"/>
</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-10-16T01:22:38.084559" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:38.084394" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:38.084380" 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-10-16T01:22:38.084801" 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-10-16T01:22:38.084979" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:38.085139" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:22:38.084354" elapsed="0.000833"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:22:38.084265" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:38.085359" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:38.085427" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:22:38.085548" 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-10-16T01:22:38.055622" elapsed="0.029950"/>
</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-10-16T01:22:38.086685" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:38.086476" elapsed="0.000285">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:38.086849" 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-10-16T01:22:38.086156" elapsed="0.000716"/>
</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-10-16T01:22:38.087153" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:38.086935" elapsed="0.000269"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:22:38.087677" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:38.087388" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:38.087227" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:38.086919" elapsed="0.000851"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:38.088267" 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-10-16T01:22:38.087932" elapsed="0.000389"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:22:38.088369" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:22:38.088515" 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-manganese/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-10-16T01:22:38.085858" elapsed="0.002682"/>
</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-10-16T01:22:38.089666" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:38.089435" elapsed="0.000307">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:38.089829" 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-10-16T01:22:38.089105" elapsed="0.000747"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:22:38.090014" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:22:38.089915" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:38.089899" elapsed="0.000192"/>
</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-10-16T01:22:38.090242" elapsed="0.000020"/>
</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-10-16T01:22:38.090413" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:38.090473" elapsed="0.000028"/>
</return>
<msg time="2026-10-16T01:22:38.090613" 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-manganese/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-10-16T01:22:38.088806" elapsed="0.001830"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:38.091886" 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-10-16T01:22:38.091643" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:38.092328" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:38.092112" elapsed="0.000255"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:22:38.097265" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:22:38.097325" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:22:38.097435" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:38.092678" elapsed="0.005220">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:38.092430" elapsed="0.005555">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:38.098172" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:38.098015" elapsed="0.000214"/>
</branch>
<status status="FAIL" start="2026-10-16T01:22:38.092411" elapsed="0.005839">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:38.098615" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:38.098752" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:38.098717" elapsed="0.000074"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:38.098685" elapsed="0.000126"/>
</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-10-16T01:22:38.098945" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:22:38.099039" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:22:38.090931" elapsed="0.008217">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:38.099214" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:22:38.045132" elapsed="0.054205">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:22:38.099771" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:38.099522" elapsed="0.000333"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:38.099457" elapsed="0.000438"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:38.099976" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:22:38.041577" elapsed="0.058563">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:38.037253" elapsed="0.062986">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:22:38.037205" elapsed="0.063108">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:38.100577" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:22:38.100940" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:38.101260" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:22:38.101625" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:22:38.102065" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:38.102376" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:38.102761" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:22:38.103002" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:22:38.029295" elapsed="0.073808">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:22:38.103163" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:22:38.027804" elapsed="0.075448">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:38.103469" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:38.103330" elapsed="0.000204"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:38.103692" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:38.103556" elapsed="0.000212"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:38.103932" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:38.103789" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:38.103314" elapsed="0.000720"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:22:38.027416" elapsed="0.076661">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:22:38.027042" elapsed="0.077089">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:38.104180" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:22:38.017986" elapsed="0.086285">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:38.104447" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:38.104681" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:38.104540" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:38.104524" elapsed="0.000247"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:38.104898" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:38.105075" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:38.105137" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:22:38.016340" elapsed="0.088891">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:22:38.015851" elapsed="0.089445">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:22:38.014967" elapsed="0.090381">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:22:38.014142" elapsed="0.091292">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:38.105670" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:22:37.993295" elapsed="0.112608">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:22:39.125154" elapsed="0.000456"/>
</kw>
<msg time="2026-10-16T01:22:39.125787" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:39.123859" elapsed="0.002089"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:22:39.122921" elapsed="0.003195"/>
</kw>
<msg time="2026-10-16T01:22:39.126206" 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-10-16T01:22:39.115833" elapsed="0.010461"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:22:39.114936" elapsed="0.011507"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:39.127561" 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-10-16T01:22:39.127014" elapsed="0.000644"/>
</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-10-16T01:22:39.134869" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:39.134059" elapsed="0.000869"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:39.135927" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:39.135265" elapsed="0.000715"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:39.136080" elapsed="0.000067"/>
</return>
<msg time="2026-10-16T01:22:39.136383" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:39.133204" elapsed="0.003229"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:22:39.136822" elapsed="0.000293"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:39.138212" 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-10-16T01:22:39.137488" elapsed="0.000780"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:39.139160" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:39.138620" elapsed="0.000596"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:39.140080" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:39.139544" elapsed="0.000588"/>
</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-10-16T01:22:39.148956" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:22:39.147517" elapsed="0.001549"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:22:39.149194" elapsed="0.000135"/>
</return>
<msg time="2026-10-16T01:22:39.149848" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:22:39.144169" elapsed="0.005807"/>
</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-10-16T01:22:39.175688" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:39.175218" elapsed="0.000527"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:22:39.176783" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:22:39.176409" elapsed="0.000494">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:39.177023" 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-10-16T01:22:39.175963" elapsed="0.001091"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:39.177769" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:39.177291" elapsed="0.000550"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:22:39.178246" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:22:39.178478" 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-10-16T01:22:39.178077" elapsed="0.000452"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:39.179156" 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-10-16T01:22:39.178820" elapsed="0.000409"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:39.180861" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:39.180474" elapsed="0.000445"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:22:39.181762" 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-10-16T01:22:39.181164" elapsed="0.000651"/>
</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-10-16T01:22:39.182244" elapsed="0.000030"/>
</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-10-16T01:22:39.182524" elapsed="0.000033"/>
</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-10-16T01:22:39.182874" elapsed="0.000035"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:22:39.182063" elapsed="0.000903"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:22:39.181901" elapsed="0.001115"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:22:39.183086" elapsed="0.000045"/>
</return>
<msg time="2026-10-16T01:22:39.183258" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:22:39.179867" elapsed="0.003414"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:39.179337" elapsed="0.003973"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:39.183492" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:39.183337" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:39.179307" elapsed="0.004274"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:22:39.184171" 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-10-16T01:22:39.183760" elapsed="0.000437"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:22:39.184241" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:22:39.174487" elapsed="0.009854"/>
</kw>
<msg time="2026-10-16T01:22:39.184388" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:39.168654" elapsed="0.015780"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:39.188411" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:39.192221" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:39.196024" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:39.196204" elapsed="0.000019"/>
</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-10-16T01:22:39.196382" elapsed="0.000019"/>
</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-10-16T01:22:39.196756" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:39.196599" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:39.196585" 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-10-16T01:22:39.196984" elapsed="0.000018"/>
</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-10-16T01:22:39.197158" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:39.197318" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:22:39.196558" elapsed="0.000808"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:22:39.196452" elapsed="0.000971"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:39.197623" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:39.197713" elapsed="0.000017"/>
</return>
<msg time="2026-10-16T01:22:39.197823" 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-10-16T01:22:39.167820" elapsed="0.030027"/>
</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-10-16T01:22:39.198994" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:39.198783" elapsed="0.000278">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:39.199145" 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-10-16T01:22:39.198421" elapsed="0.000747"/>
</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-10-16T01:22:39.199450" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:39.199231" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:22:39.199995" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:39.199728" elapsed="0.000292"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:39.199542" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:39.199214" elapsed="0.000859"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:39.200586" 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-10-16T01:22:39.200229" elapsed="0.000382"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:22:39.200657" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:22:39.200798" 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-manganese/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-10-16T01:22:39.198119" elapsed="0.002703"/>
</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-10-16T01:22:39.201925" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:39.201728" elapsed="0.000256">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:39.202068" 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-10-16T01:22:39.201372" elapsed="0.000719"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:22:39.202255" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:22:39.202154" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:39.202138" elapsed="0.000196"/>
</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-10-16T01:22:39.202483" 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-10-16T01:22:39.202674" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:39.202749" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:22:39.202874" 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-manganese/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-10-16T01:22:39.201073" elapsed="0.001824"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:39.206067" 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-10-16T01:22:39.205841" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:39.206536" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:39.206296" 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-10-16T01:22:39.211513" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:22:39.211629" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:22:39.211788" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:39.206880" elapsed="0.005398">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:39.206637" elapsed="0.005746">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:39.212617" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:39.212419" elapsed="0.000266"/>
</branch>
<status status="FAIL" start="2026-10-16T01:22:39.206620" elapsed="0.006108">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:39.213150" elapsed="0.000029"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:39.213290" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:39.213251" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:39.213233" elapsed="0.000126"/>
</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-10-16T01:22:39.213532" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:22:39.213611" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:22:39.205098" elapsed="0.008660">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:39.213841" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:22:39.158141" elapsed="0.055866">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:22:39.214468" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:39.214209" elapsed="0.000370"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:39.214154" elapsed="0.000466"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:39.214729" elapsed="0.000039"/>
</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="FAIL" start="2026-10-16T01:22:39.154631" elapsed="0.060272">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:39.150450" elapsed="0.064554">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:22:39.150403" elapsed="0.064674">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:39.215335" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:22:39.215723" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:39.216042" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:22:39.216398" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:22:39.216906" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:39.217228" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:39.217594" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:22:39.217865" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:22:39.142490" elapsed="0.075476">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:22:39.218029" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:22:39.140999" elapsed="0.077118">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:39.218336" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:39.218196" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:39.218555" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:39.218407" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:39.218787" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:39.218626" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:39.218181" elapsed="0.000675"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:22:39.140629" elapsed="0.078265">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:22:39.140226" elapsed="0.078722">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:39.218998" elapsed="0.000013"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:22:39.131482" elapsed="0.087605">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:39.219262" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:39.219477" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:39.219339" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:39.219324" elapsed="0.000255"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:39.219818" elapsed="0.000021"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:39.219990" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:39.220048" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:22:39.129900" elapsed="0.090240">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:22:39.129367" elapsed="0.090836">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:22:39.129106" elapsed="0.091146">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:22:39.128286" elapsed="0.092048">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:39.220599" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:22:39.106863" elapsed="0.113856">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:22:40.241077" elapsed="0.000481"/>
</kw>
<msg time="2026-10-16T01:22:40.241696" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:40.239657" elapsed="0.002204"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:22:40.238656" elapsed="0.003375"/>
</kw>
<msg time="2026-10-16T01:22:40.242125" 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-10-16T01:22:40.231648" elapsed="0.010568"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:22:40.230635" elapsed="0.011733"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:40.243461" 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-10-16T01:22:40.242925" elapsed="0.000654"/>
</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-10-16T01:22:40.250478" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:40.249614" elapsed="0.000949"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:40.251617" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:40.250968" elapsed="0.000706"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:40.251804" elapsed="0.000071"/>
</return>
<msg time="2026-10-16T01:22:40.252110" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:40.248789" elapsed="0.003373"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:22:40.252496" elapsed="0.000347"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:40.253991" 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-10-16T01:22:40.253219" elapsed="0.000830"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:40.255000" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:40.254380" elapsed="0.000679"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:40.256004" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:40.255376" elapsed="0.000688"/>
</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-10-16T01:22:40.265286" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:22:40.263818" elapsed="0.001582"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:22:40.265551" elapsed="0.000142"/>
</return>
<msg time="2026-10-16T01:22:40.266176" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:22:40.260272" elapsed="0.006030"/>
</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-10-16T01:22:40.290647" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:40.290205" elapsed="0.000478"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:22:40.291866" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:22:40.291467" elapsed="0.000519">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:40.292110" 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-10-16T01:22:40.291019" elapsed="0.001123"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:40.292897" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:40.292382" elapsed="0.000556"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:22:40.293455" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:22:40.293764" 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-10-16T01:22:40.293247" elapsed="0.000562"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:40.294519" 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-10-16T01:22:40.294213" elapsed="0.000354"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:40.295669" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:40.295273" elapsed="0.000454"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:22:40.296187" 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-10-16T01:22:40.295911" 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-10-16T01:22:40.296527" 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-10-16T01:22:40.296743" 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-10-16T01:22:40.296943" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:22:40.296379" elapsed="0.000617"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:22:40.296259" elapsed="0.000771"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:22:40.297075" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:22:40.297210" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:22:40.294926" elapsed="0.002307"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:40.294636" elapsed="0.002628"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:40.297436" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:40.297292" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:40.294617" elapsed="0.002904"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:22:40.298153" 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-10-16T01:22:40.297685" elapsed="0.000494"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:22:40.298224" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:22:40.289468" elapsed="0.008857"/>
</kw>
<msg time="2026-10-16T01:22:40.298376" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:40.283579" elapsed="0.014845"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:40.302302" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:40.306186" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:40.310138" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:40.310324" elapsed="0.000020"/>
</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-10-16T01:22:40.310519" 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-10-16T01:22:40.310906" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:40.310753" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:40.310732" 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-10-16T01:22:40.311143" 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-10-16T01:22:40.311322" elapsed="0.000018"/>
</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-10-16T01:22:40.311484" elapsed="0.000034"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:22:40.310688" elapsed="0.000864"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:22:40.310595" elapsed="0.000982"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:40.311774" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:40.311850" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:22:40.311960" 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-10-16T01:22:40.282670" elapsed="0.029315"/>
</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-10-16T01:22:40.313134" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:40.312933" elapsed="0.000266">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:40.313287" 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-10-16T01:22:40.312581" elapsed="0.000729"/>
</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-10-16T01:22:40.313614" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:40.313375" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:22:40.314155" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:40.313878" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:40.313693" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:40.313358" elapsed="0.000876"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:40.314792" 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-10-16T01:22:40.314394" elapsed="0.000426"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:22:40.314867" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:22:40.314994" 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-manganese/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-10-16T01:22:40.312259" elapsed="0.002759"/>
</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-10-16T01:22:40.316195" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:40.315998" elapsed="0.000258">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:40.316345" 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-10-16T01:22:40.315628" elapsed="0.000740"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:22:40.316560" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-16T01:22:40.316433" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:40.316416" elapsed="0.000230"/>
</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-10-16T01:22:40.316829" 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-10-16T01:22:40.317012" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:40.317074" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:22:40.317201" 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-manganese/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-10-16T01:22:40.315308" elapsed="0.001917"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:40.318671" 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-10-16T01:22:40.318422" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:40.319144" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:40.318920" elapsed="0.000265"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:22:40.323864" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:22:40.323928" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:22:40.324036" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:40.319476" elapsed="0.005000">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:40.319247" elapsed="0.005330">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:40.324787" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:40.324608" elapsed="0.000252"/>
</branch>
<status status="FAIL" start="2026-10-16T01:22:40.319230" elapsed="0.005654">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:40.325247" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:40.325372" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:40.325337" elapsed="0.000073"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:40.325321" elapsed="0.000111"/>
</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-10-16T01:22:40.325588" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:22:40.325655" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:22:40.317720" elapsed="0.008072">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:40.325903" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:22:40.272678" elapsed="0.053371">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:22:40.326449" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:40.326223" elapsed="0.000328"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:40.326175" elapsed="0.000420"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:40.326681" 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="FAIL" start="2026-10-16T01:22:40.270465" elapsed="0.056415">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:40.267270" elapsed="0.059713">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:22:40.267222" elapsed="0.059836">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:40.327318" elapsed="0.000025"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:22:40.327694" elapsed="0.000037"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:40.328045" elapsed="0.000022"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:22:40.328407" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:22:40.328949" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:40.329275" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:40.329646" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:22:40.329937" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:22:40.258866" elapsed="0.071177">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:22:40.330108" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:22:40.256931" elapsed="0.073268">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:40.330426" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:40.330282" elapsed="0.000196"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:40.330663" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:40.330501" elapsed="0.000234"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:40.330935" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:40.330758" elapsed="0.000231"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:40.330266" elapsed="0.000747"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:22:40.256560" elapsed="0.074493">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:22:40.256161" elapsed="0.074950">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:40.331161" elapsed="0.000016"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:22:40.247357" elapsed="0.083935">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:40.331478" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:40.331796" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:40.331576" elapsed="0.000272"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:40.331560" elapsed="0.000311"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:40.332001" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:40.332174" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:40.332235" elapsed="0.000015"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:22:40.245762" elapsed="0.086570">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:22:40.245231" elapsed="0.087166">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:22:40.244961" elapsed="0.087488">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:22:40.244101" elapsed="0.088452">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:40.332843" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:22:40.221547" elapsed="0.111410">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:22:41.352559" elapsed="0.000475"/>
</kw>
<msg time="2026-10-16T01:22:41.353169" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:41.351255" elapsed="0.002050"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:22:41.350318" elapsed="0.003150"/>
</kw>
<msg time="2026-10-16T01:22:41.353585" 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-10-16T01:22:41.343760" elapsed="0.009917"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:22:41.342577" elapsed="0.011287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:41.354938" 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-10-16T01:22:41.354368" elapsed="0.000661"/>
</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-10-16T01:22:41.361830" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:41.361027" elapsed="0.000861"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:41.362882" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:41.362223" elapsed="0.000716"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:41.363202" elapsed="0.000071"/>
</return>
<msg time="2026-10-16T01:22:41.363540" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:41.360174" elapsed="0.003420"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:22:41.363960" elapsed="0.000293"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:41.365367" 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-10-16T01:22:41.364660" elapsed="0.000763"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:41.366343" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:41.365828" elapsed="0.000568"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:41.367358" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:41.366852" elapsed="0.000558"/>
</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-10-16T01:22:41.376250" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:22:41.374880" elapsed="0.001440"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:22:41.376399" elapsed="0.000087"/>
</return>
<msg time="2026-10-16T01:22:41.376803" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:22:41.371478" elapsed="0.005405"/>
</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-10-16T01:22:41.399546" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:41.399101" elapsed="0.000483"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:22:41.400628" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:22:41.400277" elapsed="0.000489">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:41.400888" 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-10-16T01:22:41.399827" elapsed="0.001093"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:41.401617" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:41.401156" elapsed="0.000497"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:22:41.402103" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:22:41.402333" 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-10-16T01:22:41.401905" elapsed="0.000453"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:41.402843" 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-10-16T01:22:41.402601" 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-10-16T01:22:41.403933" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:41.403685" elapsed="0.000288"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:22:41.404413" 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-10-16T01:22:41.404149" 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-10-16T01:22:41.404773" elapsed="0.000026"/>
</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-10-16T01:22:41.404986" 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-10-16T01:22:41.405186" elapsed="0.000025"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:22:41.404610" elapsed="0.000635"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:22:41.404480" elapsed="0.000797"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:22:41.405325" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:22:41.405505" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:22:41.403324" elapsed="0.002232"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:41.402946" elapsed="0.002642"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:41.405802" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:41.405618" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:41.402929" elapsed="0.002950"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:22:41.406476" 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-10-16T01:22:41.406051" elapsed="0.000451"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:22:41.406566" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:22:41.398363" elapsed="0.008305"/>
</kw>
<msg time="2026-10-16T01:22:41.406733" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:41.392577" elapsed="0.014204"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:41.410574" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:41.414410" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:41.418213" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:41.418391" elapsed="0.000020"/>
</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-10-16T01:22:41.418585" 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-10-16T01:22:41.418945" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:41.418802" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:41.418788" 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-10-16T01:22:41.419176" elapsed="0.000019"/>
</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-10-16T01:22:41.419350" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:41.419509" elapsed="0.000035"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:22:41.418761" elapsed="0.000814"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:22:41.418657" elapsed="0.000941"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:41.419763" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:41.419832" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:22:41.419936" 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-10-16T01:22:41.391734" elapsed="0.028225"/>
</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-10-16T01:22:41.421110" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:41.420917" elapsed="0.000253">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:41.421252" 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-10-16T01:22:41.420577" elapsed="0.000698"/>
</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-10-16T01:22:41.421581" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:41.421338" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:22:41.422100" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:41.421834" elapsed="0.000290"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:41.421658" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:41.421321" elapsed="0.000856"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:41.422692" 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-10-16T01:22:41.422335" elapsed="0.000397"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:22:41.422779" elapsed="0.000034"/>
</return>
<msg time="2026-10-16T01:22:41.422926" 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-manganese/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-10-16T01:22:41.420262" elapsed="0.002690"/>
</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-10-16T01:22:41.424056" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:41.423862" elapsed="0.000253">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:41.424198" 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-10-16T01:22:41.423513" elapsed="0.000708"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:22:41.424562" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:22:41.424443" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:41.424269" elapsed="0.000371"/>
</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-10-16T01:22:41.424806" 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-10-16T01:22:41.424983" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:41.425043" elapsed="0.000013"/>
</return>
<msg time="2026-10-16T01:22:41.425167" 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-manganese/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-10-16T01:22:41.423214" elapsed="0.001976"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:41.426473" 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-10-16T01:22:41.426245" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:41.426957" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:41.426737" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:22:41.431393" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:22:41.431452" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:22:41.431608" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:41.427279" elapsed="0.004787">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:41.427055" elapsed="0.005098">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:41.432333" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:41.432183" elapsed="0.000208"/>
</branch>
<status status="FAIL" start="2026-10-16T01:22:41.427039" elapsed="0.005374">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:41.432792" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:41.432913" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:41.432880" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:41.432864" elapsed="0.000107"/>
</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-10-16T01:22:41.433109" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:22:41.433173" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:22:41.425464" elapsed="0.007815">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:41.433348" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:22:41.381982" elapsed="0.051491">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:22:41.433928" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:41.433663" elapsed="0.000352"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:41.433614" elapsed="0.000442"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:41.434138" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:22:41.379780" elapsed="0.054524">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:41.377190" elapsed="0.057212">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:22:41.377159" elapsed="0.057315">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:41.434763" elapsed="0.000025"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:22:41.435121" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:41.435432" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:22:41.435818" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:22:41.436244" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:41.436579" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:41.436998" elapsed="0.000026"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:22:41.437284" elapsed="0.000019"/>
</return>
<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="FAIL" start="2026-10-16T01:22:41.370160" elapsed="0.067228">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:22:41.437449" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:22:41.368278" elapsed="0.069277">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:41.437802" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:41.437639" elapsed="0.000215"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:41.438018" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:41.437876" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:41.438230" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:41.438089" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:41.437623" elapsed="0.000675"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:22:41.367941" elapsed="0.070394">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:22:41.367508" elapsed="0.070881">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:41.438437" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:22:41.358823" elapsed="0.079719">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:41.438794" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:41.439019" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:41.438876" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:41.438860" elapsed="0.000226"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:41.439211" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:41.439380" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:41.439437" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:22:41.357186" elapsed="0.082358">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:22:41.356682" elapsed="0.082925">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:22:41.356383" elapsed="0.083272">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:22:41.355482" elapsed="0.084325">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:41.440018" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:22:41.333861" elapsed="0.106262">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:22:42.460381" elapsed="0.000499"/>
</kw>
<msg time="2026-10-16T01:22:42.461022" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:42.459089" elapsed="0.002067"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:22:42.458139" elapsed="0.003180"/>
</kw>
<msg time="2026-10-16T01:22:42.461413" 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-10-16T01:22:42.451106" elapsed="0.010397"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:22:42.449934" elapsed="0.011751"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:42.462902" 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-10-16T01:22:42.462320" elapsed="0.000675"/>
</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-10-16T01:22:42.469846" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:42.468971" elapsed="0.000935"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:42.471014" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:42.470249" elapsed="0.000821"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:42.471169" elapsed="0.000068"/>
</return>
<msg time="2026-10-16T01:22:42.471473" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:42.468073" elapsed="0.003476"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:22:42.471924" elapsed="0.000297"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:42.473339" 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-10-16T01:22:42.472624" elapsed="0.000772"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:42.474297" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:42.473784" elapsed="0.000568"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:42.475222" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:42.474687" elapsed="0.000588"/>
</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-10-16T01:22:42.484197" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:22:42.482804" elapsed="0.001503"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:22:42.484434" elapsed="0.000159"/>
</return>
<msg time="2026-10-16T01:22:42.485063" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:22:42.479412" elapsed="0.005776"/>
</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-10-16T01:22:42.508748" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:42.508283" elapsed="0.000503"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:22:42.509818" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:22:42.509447" elapsed="0.000489">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:42.510053" 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-10-16T01:22:42.509005" elapsed="0.001079"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:42.510910" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:42.510420" elapsed="0.000530"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:22:42.511385" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:22:42.511657" 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-10-16T01:22:42.511215" elapsed="0.000503"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:42.512370" 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-10-16T01:22:42.512018" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:42.513459" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:42.513229" elapsed="0.000270"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:22:42.513974" 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-10-16T01:22:42.513695" 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-10-16T01:22:42.514288" elapsed="0.000020"/>
</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-10-16T01:22:42.514474" 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-10-16T01:22:42.514676" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:22:42.514156" elapsed="0.000587"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:22:42.514043" elapsed="0.000732"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:22:42.514818" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:22:42.514948" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:22:42.512888" elapsed="0.002083"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:42.512478" elapsed="0.002522"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:42.515176" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:42.515029" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:42.512461" elapsed="0.002785"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:22:42.515844" 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-10-16T01:22:42.515401" elapsed="0.000469"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:22:42.515913" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:22:42.507545" elapsed="0.008467"/>
</kw>
<msg time="2026-10-16T01:22:42.516060" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:42.501659" elapsed="0.014447"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:42.519959" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:42.523869" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:42.527636" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:42.527861" 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-10-16T01:22:42.528042" 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-10-16T01:22:42.528390" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:42.528248" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:42.528233" 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-10-16T01:22:42.528631" 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-10-16T01:22:42.528825" 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-10-16T01:22:42.528988" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:22:42.528207" elapsed="0.000828"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:22:42.528115" elapsed="0.000944"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:42.529210" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:42.529277" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:22:42.529381" 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-10-16T01:22:42.500773" elapsed="0.028632"/>
</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-10-16T01:22:42.530518" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:42.530324" elapsed="0.000271">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:42.530678" 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-10-16T01:22:42.530005" elapsed="0.000710"/>
</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-10-16T01:22:42.530998" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:42.530779" elapsed="0.000275"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:22:42.531505" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:42.531239" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:42.531077" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:42.530762" elapsed="0.000835"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:42.532108" 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-10-16T01:22:42.531770" elapsed="0.000362"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:22:42.532176" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:22:42.532297" 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-manganese/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-10-16T01:22:42.529691" elapsed="0.002629"/>
</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-10-16T01:22:42.533410" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:42.533218" elapsed="0.000252">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:42.533590" 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-10-16T01:22:42.532900" elapsed="0.000719"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:22:42.535819" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:22:42.535694" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:42.533722" elapsed="0.002178"/>
</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-10-16T01:22:42.536053" 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-10-16T01:22:42.536227" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:42.536288" elapsed="0.000013"/>
</return>
<msg time="2026-10-16T01:22:42.536414" 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-manganese/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-10-16T01:22:42.532585" elapsed="0.003852"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:42.537681" 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-10-16T01:22:42.537438" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:42.538151" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:42.537926" elapsed="0.000264"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:22:42.542982" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:22:42.543042" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:22:42.543155" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:42.538476" elapsed="0.005128">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:42.538253" elapsed="0.005440">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:42.543898" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:42.543743" elapsed="0.000214"/>
</branch>
<status status="FAIL" start="2026-10-16T01:22:42.538237" elapsed="0.005742">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:42.544327" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:42.544447" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:42.544414" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:42.544398" elapsed="0.000107"/>
</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-10-16T01:22:42.544655" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:22:42.544736" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:22:42.536743" elapsed="0.008101">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:42.544912" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:22:42.491104" elapsed="0.053934">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:22:42.545424" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:42.545205" elapsed="0.000346"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:42.545158" elapsed="0.000435"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:42.545678" elapsed="0.000056"/>
</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="FAIL" start="2026-10-16T01:22:42.488864" elapsed="0.057002">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:42.485690" elapsed="0.060277">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:22:42.485641" elapsed="0.060408">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:42.546309" elapsed="0.000025"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:22:42.546682" elapsed="0.000035"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:42.547014" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:22:42.547364" elapsed="0.000024"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:22:42.547830" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:42.548147" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:42.548495" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:22:42.548780" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:22:42.478049" elapsed="0.070833">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:22:42.548943" elapsed="0.000014"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:22:42.476140" elapsed="0.072890">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:42.549249" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:42.549109" elapsed="0.000190"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:42.549457" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:42.549322" elapsed="0.000184"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:42.549681" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:42.549539" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:42.549094" elapsed="0.000675"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:22:42.475800" elapsed="0.074008">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:22:42.475370" elapsed="0.074492">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:42.549909" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:22:42.466652" elapsed="0.083346">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:42.550176" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:42.550431" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:42.550291" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:42.550276" elapsed="0.000264"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:42.550668" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:42.550945" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:42.551003" elapsed="0.000015"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:22:42.465038" elapsed="0.086058">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:22:42.464515" elapsed="0.086643">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:22:42.464255" elapsed="0.086951">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:22:42.463448" elapsed="0.087838">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:42.551492" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:22:42.441047" elapsed="0.110565">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:22:43.571929" elapsed="0.000444"/>
</kw>
<msg time="2026-10-16T01:22:43.572515" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:43.570599" elapsed="0.002073"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:22:43.569653" elapsed="0.003212"/>
</kw>
<msg time="2026-10-16T01:22:43.572957" 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-10-16T01:22:43.562823" elapsed="0.010227"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:22:43.561912" elapsed="0.011287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:43.574316" 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-10-16T01:22:43.573789" elapsed="0.000618"/>
</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-10-16T01:22:43.581424" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:43.580615" elapsed="0.000867"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:43.582498" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:43.581891" elapsed="0.000686"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:43.582678" elapsed="0.000098"/>
</return>
<msg time="2026-10-16T01:22:43.583016" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:43.579784" elapsed="0.003282"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:22:43.583402" elapsed="0.000338"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:43.585000" 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-10-16T01:22:43.584112" elapsed="0.000946"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:43.585960" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:43.585387" elapsed="0.000627"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:43.586893" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:43.586329" elapsed="0.000619"/>
</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-10-16T01:22:43.595928" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:22:43.594480" elapsed="0.001558"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:22:43.596165" elapsed="0.000135"/>
</return>
<msg time="2026-10-16T01:22:43.596992" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:22:43.591195" elapsed="0.005929"/>
</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-10-16T01:22:43.620307" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:43.619881" elapsed="0.000462"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:22:43.621482" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:22:43.621085" elapsed="0.000523">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:43.621713" 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-10-16T01:22:43.620583" elapsed="0.001155"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:43.622222" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:43.621911" elapsed="0.000336"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:22:43.622532" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:22:43.622751" 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-10-16T01:22:43.622412" elapsed="0.000364"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:43.623192" 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-10-16T01:22:43.622973" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:43.624166" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:43.623938" elapsed="0.000274"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:22:43.624832" 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-10-16T01:22:43.624387" elapsed="0.000472"/>
</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-10-16T01:22:43.625151" 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-10-16T01:22:43.625338" elapsed="0.000022"/>
</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-10-16T01:22:43.625520" elapsed="0.000034"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:22:43.625020" elapsed="0.000567"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:22:43.624904" elapsed="0.000715"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:22:43.625663" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:22:43.625809" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:22:43.623581" elapsed="0.002251"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:43.623295" 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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:43.626039" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:43.625889" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:43.623277" elapsed="0.002833"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:22:43.626708" 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-10-16T01:22:43.626270" elapsed="0.000507"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:22:43.626824" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:22:43.619125" elapsed="0.007803"/>
</kw>
<msg time="2026-10-16T01:22:43.626976" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:43.613358" elapsed="0.013664"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:43.630899" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:43.634720" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:43.638504" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:43.638712" 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-10-16T01:22:43.638891" 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-10-16T01:22:43.639232" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:43.639092" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:43.639078" elapsed="0.000228"/>
</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-10-16T01:22:43.639458" elapsed="0.000019"/>
</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-10-16T01:22:43.639651" 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-10-16T01:22:43.639836" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:22:43.639053" elapsed="0.000833"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:22:43.638963" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:43.640060" elapsed="0.000023"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:43.640132" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:22:43.640235" 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-10-16T01:22:43.612492" elapsed="0.027767"/>
</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-10-16T01:22:43.641500" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:43.641256" elapsed="0.000329">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:43.641670" 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-10-16T01:22:43.640924" elapsed="0.000770"/>
</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-10-16T01:22:43.641995" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:43.641774" elapsed="0.000273"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:22:43.642495" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:43.642230" elapsed="0.000290"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:43.642069" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:43.641756" elapsed="0.000838"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:43.643109" 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-10-16T01:22:43.642767" elapsed="0.000367"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:22:43.643179" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:22:43.643303" 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-manganese/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-10-16T01:22:43.640525" elapsed="0.002807"/>
</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-10-16T01:22:43.644464" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:43.644276" elapsed="0.000249">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:43.644628" 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-10-16T01:22:43.643954" elapsed="0.000697"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:22:43.644831" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:22:43.644730" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:43.644712" elapsed="0.000197"/>
</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-10-16T01:22:43.645060" elapsed="0.000019"/>
</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-10-16T01:22:43.645230" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:43.645290" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:22:43.645414" 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-manganese/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-10-16T01:22:43.643613" elapsed="0.001825"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:43.646911" 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-10-16T01:22:43.646654" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:43.647424" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:43.647160" 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-10-16T01:22:43.652197" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:22:43.652256" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:22:43.652362" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:43.647851" elapsed="0.004997">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:43.647572" elapsed="0.005402">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:43.653165" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:43.653007" elapsed="0.000215"/>
</branch>
<status status="FAIL" start="2026-10-16T01:22:43.647530" elapsed="0.005714">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:43.653613" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:43.653752" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:43.653717" elapsed="0.000074"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:43.653686" 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-10-16T01:22:43.653946" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:22:43.654015" elapsed="0.000019"/>
</return>
<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="FAIL" start="2026-10-16T01:22:43.645930" elapsed="0.008212">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:43.654228" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:22:43.602511" elapsed="0.051861">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:22:43.654846" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:43.654583" elapsed="0.000356"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:43.654503" elapsed="0.000481"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:43.655075" elapsed="0.000041"/>
</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="FAIL" start="2026-10-16T01:22:43.600324" elapsed="0.054930">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:43.597626" elapsed="0.057734">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:22:43.597575" elapsed="0.057858">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:43.655730" elapsed="0.000025"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:22:43.656086" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:43.656398" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:22:43.656784" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:22:43.657223" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:43.657550" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:43.657929" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:22:43.658174" elapsed="0.000022"/>
</return>
<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="FAIL" start="2026-10-16T01:22:43.589876" elapsed="0.068421">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:22:43.658413" elapsed="0.000021"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:22:43.587840" elapsed="0.070682">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:43.658830" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:43.658638" elapsed="0.000256"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:43.659082" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:43.658922" elapsed="0.000219"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:43.659333" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:43.659167" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:43.658618" elapsed="0.000787"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:22:43.587439" elapsed="0.072005">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:22:43.587044" elapsed="0.072463">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:43.659573" elapsed="0.000016"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:22:43.578344" elapsed="0.081325">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:43.659927" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:43.660156" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:43.660007" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:43.659992" elapsed="0.000233"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:43.660349" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:43.660526" elapsed="0.000032"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:43.660599" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:22:43.576484" elapsed="0.084208">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:22:43.576007" elapsed="0.084827">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:22:43.575736" elapsed="0.085149">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:22:43.574922" elapsed="0.086046">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:43.661178" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:22:43.552495" elapsed="0.108789">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:22:44.681347" elapsed="0.000495"/>
</kw>
<msg time="2026-10-16T01:22:44.681979" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:44.680057" elapsed="0.002197"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:22:44.678907" elapsed="0.003534"/>
</kw>
<msg time="2026-10-16T01:22:44.682536" 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-10-16T01:22:44.672173" elapsed="0.010490"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:22:44.671256" elapsed="0.011637"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:44.683980" 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-10-16T01:22:44.683397" elapsed="0.000678"/>
</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-10-16T01:22:44.691096" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:44.690294" elapsed="0.000861"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:44.692160" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:44.691493" elapsed="0.000721"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:44.692316" elapsed="0.000065"/>
</return>
<msg time="2026-10-16T01:22:44.692645" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:44.689436" elapsed="0.003290"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:22:44.693084" elapsed="0.000296"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:44.694479" 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-10-16T01:22:44.693807" elapsed="0.000729"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:44.695436" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:44.694927" elapsed="0.000562"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:44.696374" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:44.695870" elapsed="0.000557"/>
</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-10-16T01:22:44.705459" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:22:44.704086" elapsed="0.001510"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:22:44.705798" elapsed="0.000138"/>
</return>
<msg time="2026-10-16T01:22:44.706360" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:22:44.700821" elapsed="0.005664"/>
</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-10-16T01:22:44.733843" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:44.733299" elapsed="0.000583"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:22:44.734871" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:22:44.734591" elapsed="0.000373">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:44.735051" 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-10-16T01:22:44.734107" elapsed="0.000966"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:44.735577" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:44.735245" elapsed="0.000358"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:22:44.735912" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:22:44.736142" 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-10-16T01:22:44.735788" elapsed="0.000378"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:44.736599" 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-10-16T01:22:44.736360" 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-10-16T01:22:44.737724" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:44.737323" elapsed="0.000444"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:22:44.738213" 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-10-16T01:22:44.737947" 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-10-16T01:22:44.738532" elapsed="0.000036"/>
</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-10-16T01:22:44.738754" 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-10-16T01:22:44.738939" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:22:44.738399" elapsed="0.000592"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:22:44.738284" elapsed="0.000739"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:22:44.739066" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:22:44.739201" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:22:44.736985" elapsed="0.002239"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:44.736721" elapsed="0.002532"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:44.739425" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:44.739281" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:44.736688" elapsed="0.002807"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:22:44.740092" 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-10-16T01:22:44.739667" elapsed="0.000451"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:22:44.740161" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:22:44.732520" elapsed="0.007739"/>
</kw>
<msg time="2026-10-16T01:22:44.740308" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:44.726726" elapsed="0.013628"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:44.744233" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:44.748015" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:44.751981" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:44.752195" 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-10-16T01:22:44.752375" 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-10-16T01:22:44.752774" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:44.752616" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:44.752601" elapsed="0.000250"/>
</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-10-16T01:22:44.753004" 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-10-16T01:22:44.753202" 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-10-16T01:22:44.753366" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:22:44.752540" elapsed="0.000875"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:22:44.752448" elapsed="0.000990"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:44.753604" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:44.753675" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:22:44.753796" 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-10-16T01:22:44.725726" elapsed="0.028093"/>
</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-10-16T01:22:44.754964" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:44.754767" elapsed="0.000257">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:44.755107" 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-10-16T01:22:44.754408" elapsed="0.000722"/>
</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-10-16T01:22:44.755414" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:44.755192" elapsed="0.000274"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:22:44.755951" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:44.755672" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:44.755489" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:44.755176" elapsed="0.000852"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:44.756525" 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-10-16T01:22:44.756189" elapsed="0.000375"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:22:44.756610" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:22:44.756751" 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-manganese/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-10-16T01:22:44.754101" elapsed="0.002673"/>
</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-10-16T01:22:44.757987" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:44.757791" elapsed="0.000256">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:44.758135" 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-10-16T01:22:44.757324" elapsed="0.000835"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:22:44.758325" elapsed="0.000022"/>
</return>
<status status="PASS" start="2026-10-16T01:22:44.758222" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:44.758205" elapsed="0.000197"/>
</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-10-16T01:22:44.758569" 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-10-16T01:22:44.758806" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:44.758869" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:22:44.758994" 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-manganese/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-10-16T01:22:44.757026" elapsed="0.001992"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:44.760418" 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-10-16T01:22:44.760192" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:44.760897" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:44.760661" elapsed="0.000276"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:22:44.765568" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:22:44.765628" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:22:44.765753" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:44.761219" elapsed="0.004962">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:44.760996" elapsed="0.005273">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:44.766449" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:44.766299" elapsed="0.000209"/>
</branch>
<status status="FAIL" start="2026-10-16T01:22:44.760980" elapsed="0.005550">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:44.766910" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:44.767031" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:44.766998" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:44.766981" elapsed="0.000107"/>
</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-10-16T01:22:44.767221" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:22:44.767284" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:22:44.759463" elapsed="0.007927">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:44.767457" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:22:44.712674" elapsed="0.054926">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:22:44.768023" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:44.767795" elapsed="0.000311"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:44.767746" elapsed="0.000401"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:44.768232" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:22:44.710487" elapsed="0.057951">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:44.707024" elapsed="0.061513">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:22:44.706975" elapsed="0.061653">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:44.768913" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:22:44.769309" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:44.769640" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:22:44.770020" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:22:44.770452" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:44.770801" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:44.771151" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:22:44.771388" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:22:44.699207" elapsed="0.072282">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:22:44.771563" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:22:44.697288" elapsed="0.074366">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:44.771896" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:44.771755" elapsed="0.000191"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:44.772103" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:44.771968" elapsed="0.000185"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:44.772317" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:44.772174" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:44.771738" elapsed="0.000646"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:22:44.696954" elapsed="0.075468">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:22:44.696523" elapsed="0.075953">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:44.772524" elapsed="0.000013"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:22:44.688014" elapsed="0.084615">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:44.772928" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:44.773150" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:44.773008" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:44.772993" elapsed="0.000226"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:44.773390" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:44.773611" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:44.773672" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:22:44.686315" elapsed="0.087467">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:22:44.685840" elapsed="0.088007">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:22:44.685501" elapsed="0.088401">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:22:44.684528" elapsed="0.089459">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:44.774335" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:22:44.662174" elapsed="0.112284">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:22:45.787648" elapsed="0.000321"/>
</kw>
<msg time="2026-10-16T01:22:45.788072" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:45.786808" elapsed="0.001364"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:22:45.786215" elapsed="0.002063"/>
</kw>
<msg time="2026-10-16T01:22:45.788336" 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-10-16T01:22:45.781749" elapsed="0.006643"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:22:45.781116" elapsed="0.007368"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:45.789209" 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-10-16T01:22:45.788877" elapsed="0.000391"/>
</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-10-16T01:22:45.793623" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:45.793133" elapsed="0.000527"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:45.794271" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:45.793894" elapsed="0.000411"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:45.794370" elapsed="0.000046"/>
</return>
<msg time="2026-10-16T01:22:45.794579" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:45.792606" elapsed="0.002009"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:22:45.794844" elapsed="0.000187"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:45.795696" 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-10-16T01:22:45.795260" elapsed="0.000494"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:45.796279" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:45.795962" elapsed="0.000350"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:45.796996" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:45.796503" elapsed="0.000528"/>
</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-10-16T01:22:45.802543" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:22:45.801689" elapsed="0.000941"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:22:45.802744" elapsed="0.000091"/>
</return>
<msg time="2026-10-16T01:22:45.803109" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:22:45.799542" elapsed="0.003647"/>
</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-10-16T01:22:45.825969" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:45.825509" elapsed="0.000497"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:22:45.827043" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:22:45.826685" elapsed="0.000476">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:45.827282" 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-10-16T01:22:45.826223" elapsed="0.001090"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:45.827974" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:45.827552" elapsed="0.000447"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:22:45.828285" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:22:45.828488" 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-10-16T01:22:45.828164" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:45.828962" 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-10-16T01:22:45.828739" elapsed="0.000264"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:45.830044" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:45.829812" elapsed="0.000273"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:22:45.830522" 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-10-16T01:22:45.830260" 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-10-16T01:22:45.830869" 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-10-16T01:22:45.831056" elapsed="0.000021"/>
</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-10-16T01:22:45.831235" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:22:45.830737" elapsed="0.000549"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:22:45.830604" elapsed="0.000714"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:22:45.831362" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:22:45.831489" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:22:45.829446" elapsed="0.002066"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:45.829178" elapsed="0.002363"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:45.831743" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:45.831584" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:45.829047" elapsed="0.002769"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:22:45.832393" 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-10-16T01:22:45.831973" elapsed="0.000446"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:22:45.832463" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:22:45.824813" elapsed="0.007764"/>
</kw>
<msg time="2026-10-16T01:22:45.832666" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:45.818905" elapsed="0.013823"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:45.836586" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:45.840381" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:45.844170" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:45.844347" elapsed="0.000020"/>
</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-10-16T01:22:45.844524" elapsed="0.000019"/>
</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-10-16T01:22:45.844921" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:45.844778" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:45.844764" 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-10-16T01:22:45.845148" 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-10-16T01:22:45.845330" elapsed="0.000018"/>
</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-10-16T01:22:45.845489" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:22:45.844737" elapsed="0.000801"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:22:45.844629" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:45.845768" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:45.845838" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:22:45.845943" 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-10-16T01:22:45.818047" elapsed="0.027920"/>
</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-10-16T01:22:45.847095" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:45.846899" elapsed="0.000255">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:45.847276" 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-10-16T01:22:45.846537" 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-10-16T01:22:45.847600" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:45.847365" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:22:45.848121" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:45.847854" elapsed="0.000291"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:45.847677" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:45.847347" elapsed="0.000855"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:45.848731" 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-10-16T01:22:45.848361" elapsed="0.000396"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:22:45.848803" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:22:45.848927" 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-manganese/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-10-16T01:22:45.846239" elapsed="0.002711"/>
</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-10-16T01:22:45.852221" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:45.849852" elapsed="0.002429">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:45.852366" 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-10-16T01:22:45.849498" elapsed="0.002891"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:22:45.852555" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-10-16T01:22:45.852453" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:45.852436" elapsed="0.000213"/>
</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-10-16T01:22:45.852815" 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-10-16T01:22:45.852990" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:45.853050" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:22:45.853175" 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-manganese/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-10-16T01:22:45.849200" elapsed="0.004002"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:45.854436" 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-10-16T01:22:45.854208" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:45.854915" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:45.854678" 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-10-16T01:22:45.860051" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:22:45.860112" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:22:45.860229" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:45.855241" elapsed="0.005439">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:45.855017" elapsed="0.005768">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:45.860967" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:45.860816" elapsed="0.000245"/>
</branch>
<status status="FAIL" start="2026-10-16T01:22:45.855000" elapsed="0.006086">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:45.861430" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:45.861550" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:45.861517" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:45.861501" 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-10-16T01:22:45.861777" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:22:45.861843" elapsed="0.000013"/>
</return>
<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="FAIL" start="2026-10-16T01:22:45.853480" elapsed="0.008468">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:45.862016" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:22:45.808286" elapsed="0.053856">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:22:45.862534" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:45.862316" elapsed="0.000320"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:45.862269" elapsed="0.000410"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:45.862794" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:22:45.806113" elapsed="0.056846">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:45.803505" elapsed="0.059553">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:22:45.803473" elapsed="0.059658">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:45.863383" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:22:45.863765" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:45.864081" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:22:45.864441" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:22:45.864931" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:45.865246" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:45.865611" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:22:45.865890" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:22:45.798753" elapsed="0.067238">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:22:45.866052" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:22:45.797536" elapsed="0.068606">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:45.866401" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:45.866260" elapsed="0.000192"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:45.866628" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:45.866474" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:45.866871" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:45.866726" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:45.866243" elapsed="0.000697"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:22:45.797324" elapsed="0.069655">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:22:45.797091" elapsed="0.069941">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:45.867080" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:22:45.791645" elapsed="0.075525">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:45.867344" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:45.867597" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:45.867422" elapsed="0.000226"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:45.867407" elapsed="0.000263"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:45.867886" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:45.868058" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:45.868117" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:22:45.790637" elapsed="0.077573">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:22:45.790280" elapsed="0.077991">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:22:45.790101" elapsed="0.078219">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:22:45.789591" elapsed="0.078810">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:45.868625" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:22:45.775224" elapsed="0.093571">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:22:46.888767" elapsed="0.000424"/>
</kw>
<msg time="2026-10-16T01:22:46.889328" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:46.887412" elapsed="0.002076"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:22:46.886444" elapsed="0.003226"/>
</kw>
<msg time="2026-10-16T01:22:46.890026" 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-10-16T01:22:46.879815" elapsed="0.010311"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:22:46.878910" elapsed="0.011373"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:46.891372" 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-10-16T01:22:46.890837" elapsed="0.000629"/>
</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-10-16T01:22:46.898250" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:46.897441" elapsed="0.000870"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:46.899313" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:46.898669" elapsed="0.000699"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:46.899468" elapsed="0.000063"/>
</return>
<msg time="2026-10-16T01:22:46.899931" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:46.896618" elapsed="0.003366"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:22:46.900316" elapsed="0.000320"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:46.901792" 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-10-16T01:22:46.901039" elapsed="0.000813"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:46.902768" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:46.902189" elapsed="0.000637"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:46.903681" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:46.903140" elapsed="0.000627"/>
</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-10-16T01:22:46.913334" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:22:46.911932" elapsed="0.001517"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:22:46.913600" elapsed="0.000304"/>
</return>
<msg time="2026-10-16T01:22:46.914356" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:22:46.908425" elapsed="0.006061"/>
</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-10-16T01:22:46.941935" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:46.941417" elapsed="0.000556"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:22:46.943010" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:22:46.942665" elapsed="0.000453">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:46.943240" 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-10-16T01:22:46.942192" elapsed="0.001080"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:46.944005" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:46.943512" elapsed="0.000529"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:22:46.944436" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:22:46.944686" 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-10-16T01:22:46.944271" elapsed="0.000469"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:46.945378" 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-10-16T01:22:46.945010" elapsed="0.000428"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:46.946789" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:46.946425" elapsed="0.000423"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:22:46.947682" 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-10-16T01:22:46.947091" elapsed="0.000648"/>
</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-10-16T01:22:46.948140" elapsed="0.000029"/>
</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-10-16T01:22:46.948396" 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-10-16T01:22:46.948670" elapsed="0.000048"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:22:46.947960" elapsed="0.000806"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:22:46.947804" elapsed="0.001002"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:22:46.948863" elapsed="0.000037"/>
</return>
<msg time="2026-10-16T01:22:46.949049" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:22:46.945928" elapsed="0.003154"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:46.945525" elapsed="0.003598"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:46.949361" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:46.949159" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:46.945501" elapsed="0.003959"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:22:46.950267" 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-10-16T01:22:46.949695" elapsed="0.000607"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:22:46.950364" elapsed="0.000036"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:22:46.940694" elapsed="0.009811"/>
</kw>
<msg time="2026-10-16T01:22:46.950618" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:46.934917" elapsed="0.015769"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:46.954864" elapsed="0.000036"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:46.958709" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:46.962509" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:46.962715" 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-10-16T01:22:46.962896" 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-10-16T01:22:46.963287" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:46.963101" elapsed="0.000238"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:46.963086" elapsed="0.000277"/>
</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-10-16T01:22:46.963515" 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-10-16T01:22:46.963722" 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-10-16T01:22:46.963887" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:22:46.963060" elapsed="0.000877"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:22:46.962969" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:46.964112" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:46.964181" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:22:46.964287" 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-10-16T01:22:46.934033" elapsed="0.030277"/>
</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-10-16T01:22:46.965440" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:46.965241" elapsed="0.000260">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:46.965600" 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-10-16T01:22:46.964916" elapsed="0.000709"/>
</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-10-16T01:22:46.965929" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:46.965690" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:22:46.966439" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:46.966171" elapsed="0.000293"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:46.966004" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:46.965673" elapsed="0.000843"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:46.967051" 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-10-16T01:22:46.966690" elapsed="0.000385"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:22:46.967121" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:22:46.967245" 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-manganese/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-10-16T01:22:46.964594" elapsed="0.002674"/>
</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-10-16T01:22:46.968363" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:46.968174" elapsed="0.000249">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:46.968506" 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-10-16T01:22:46.967853" elapsed="0.000676"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:22:46.968728" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:22:46.968608" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:46.968590" elapsed="0.000217"/>
</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-10-16T01:22:46.968963" elapsed="0.000020"/>
</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-10-16T01:22:46.969137" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:46.969199" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:22:46.969324" 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-manganese/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-10-16T01:22:46.967520" elapsed="0.001867"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:46.970839" 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-10-16T01:22:46.970594" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:46.971286" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:46.971068" elapsed="0.000259"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:22:46.975978" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:22:46.976038" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:22:46.976144" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:46.971625" elapsed="0.004991">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:46.971387" elapsed="0.005332">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:46.976903" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:46.976751" elapsed="0.000210"/>
</branch>
<status status="FAIL" start="2026-10-16T01:22:46.971370" elapsed="0.005613">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:46.977330" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:46.977448" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:46.977416" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:46.977400" elapsed="0.000107"/>
</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-10-16T01:22:46.977666" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:22:46.977746" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:22:46.969881" elapsed="0.007973">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:46.977922" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:22:46.922795" elapsed="0.055255">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:22:46.978438" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:46.978217" elapsed="0.000304"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:46.978170" elapsed="0.000391"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:46.978662" 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="FAIL" start="2026-10-16T01:22:46.919092" elapsed="0.059763">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:46.915132" elapsed="0.063855">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:22:46.915086" elapsed="0.063978">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:46.979318" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:22:46.979681" elapsed="0.000038"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:46.980017" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:22:46.980372" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:22:46.980859" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:46.981177" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:46.981544" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:22:46.981904" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:22:46.906767" elapsed="0.075241">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:22:46.982071" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:22:46.904601" elapsed="0.077560">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:46.982382" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:46.982241" elapsed="0.000192"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:46.982607" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:46.982455" elapsed="0.000202"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:46.982848" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:46.982679" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:46.982226" elapsed="0.000692"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:22:46.904244" elapsed="0.078711">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:22:46.903866" elapsed="0.079142">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:46.983055" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:22:46.895194" elapsed="0.087955">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:46.983324" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:46.983539" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:46.983400" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:46.983386" elapsed="0.000257"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:46.983857" elapsed="0.000021"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:46.984030" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:46.984088" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:22:46.893504" elapsed="0.090716">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:22:46.893040" elapsed="0.091249">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:22:46.892784" elapsed="0.091554">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:22:46.891975" elapsed="0.092447">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:46.984652" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:22:46.869871" elapsed="0.114948">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:22:48.004314" elapsed="0.000495"/>
</kw>
<msg time="2026-10-16T01:22:48.004927" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:48.003025" elapsed="0.002019"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:22:48.001800" elapsed="0.003402"/>
</kw>
<msg time="2026-10-16T01:22:48.005293" 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-10-16T01:22:47.994990" elapsed="0.010394"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:22:47.994101" elapsed="0.011431"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:48.006618" 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-10-16T01:22:48.006071" elapsed="0.000681"/>
</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-10-16T01:22:48.013675" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:48.012907" elapsed="0.000862"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:48.014773" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:48.014109" elapsed="0.000720"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:48.014924" elapsed="0.000063"/>
</return>
<msg time="2026-10-16T01:22:48.015212" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:48.012068" elapsed="0.003195"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:22:48.015667" elapsed="0.000329"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:48.017095" 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-10-16T01:22:48.016366" elapsed="0.000785"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:48.018049" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:48.017480" elapsed="0.000622"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:48.018974" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:48.018408" elapsed="0.000619"/>
</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-10-16T01:22:48.027954" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:22:48.026464" elapsed="0.001698"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:22:48.028298" elapsed="0.000135"/>
</return>
<msg time="2026-10-16T01:22:48.029142" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:22:48.023138" elapsed="0.006130"/>
</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-10-16T01:22:48.053608" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:48.053161" elapsed="0.000485"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:22:48.054645" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:22:48.054326" elapsed="0.000441">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:48.054886" 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-10-16T01:22:48.053883" elapsed="0.001035"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:48.055612" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:48.055153" elapsed="0.000496"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:22:48.056062" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:22:48.056279" 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-10-16T01:22:48.055902" elapsed="0.000410"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:48.056937" 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-10-16T01:22:48.056603" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:48.058468" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:48.057961" elapsed="0.000565"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:22:48.059173" 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-10-16T01:22:48.058806" elapsed="0.000402"/>
</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-10-16T01:22:48.059628" elapsed="0.000031"/>
</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-10-16T01:22:48.059911" 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-10-16T01:22:48.060166" elapsed="0.000027"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:22:48.059421" elapsed="0.000817"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:22:48.059268" elapsed="0.001015"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:22:48.060352" elapsed="0.000044"/>
</return>
<msg time="2026-10-16T01:22:48.060573" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:22:48.057430" elapsed="0.003206"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:48.057079" elapsed="0.003596"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:48.060862" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:48.060717" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:48.057056" elapsed="0.003876"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:22:48.061480" 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-10-16T01:22:48.061087" elapsed="0.000418"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:22:48.061549" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:22:48.052423" elapsed="0.009240"/>
</kw>
<msg time="2026-10-16T01:22:48.061761" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:48.046759" elapsed="0.015051"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:48.065638" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:48.069432" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:48.073265" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:48.073443" elapsed="0.000019"/>
</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-10-16T01:22:48.073637" 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-10-16T01:22:48.073994" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:48.073851" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:48.073838" elapsed="0.000229"/>
</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-10-16T01:22:48.074220" elapsed="0.000019"/>
</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-10-16T01:22:48.074393" elapsed="0.000018"/>
</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-10-16T01:22:48.074550" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:22:48.073812" elapsed="0.000802"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:22:48.073721" elapsed="0.000916"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:48.074802" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:48.074872" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:22:48.074977" 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-10-16T01:22:48.045901" elapsed="0.029099"/>
</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-10-16T01:22:48.076184" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:48.075990" elapsed="0.000254">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:48.076327" 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-10-16T01:22:48.075647" elapsed="0.000702"/>
</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-10-16T01:22:48.076648" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:48.076412" elapsed="0.000339"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:22:48.077207" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:48.076942" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:48.076777" elapsed="0.000487"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:48.076396" elapsed="0.000888"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:48.077830" 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-10-16T01:22:48.077442" elapsed="0.000412"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:22:48.077900" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:22:48.078023" 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-manganese/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-10-16T01:22:48.075264" elapsed="0.002781"/>
</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-10-16T01:22:48.079136" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:48.078944" elapsed="0.000252">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:48.079282" 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-10-16T01:22:48.078606" elapsed="0.000709"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:22:48.079491" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:22:48.079385" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:48.079368" elapsed="0.000201"/>
</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-10-16T01:22:48.079758" 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-10-16T01:22:48.079934" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:48.079995" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:22:48.080118" 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-manganese/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-10-16T01:22:48.078293" elapsed="0.001848"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:48.081544" 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-10-16T01:22:48.081320" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:48.082021" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:48.081803" elapsed="0.000258"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:22:48.086635" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:22:48.086694" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:22:48.086829" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:48.082349" elapsed="0.004884">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:48.082122" elapsed="0.005208">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:48.087516" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:48.087365" elapsed="0.000210"/>
</branch>
<status status="FAIL" start="2026-10-16T01:22:48.082105" elapsed="0.005506">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:48.087971" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:48.088126" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:48.088093" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:48.088075" elapsed="0.000110"/>
</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-10-16T01:22:48.088328" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:22:48.088391" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:22:48.080606" elapsed="0.007888">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:48.088562" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:22:48.036197" elapsed="0.052531">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:22:48.089121" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:48.088900" elapsed="0.000305"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:48.088851" elapsed="0.000395"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:48.089328" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:22:48.033755" elapsed="0.055737">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:48.029797" elapsed="0.059810">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:22:48.029751" elapsed="0.059931">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:48.089954" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:22:48.090307" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:48.090637" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:22:48.091027" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:22:48.091480" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:48.091836" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:48.092200" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:22:48.092444" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:22:48.021829" elapsed="0.070717">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:22:48.092621" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:22:48.019883" elapsed="0.072853">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:48.092964" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:48.092820" elapsed="0.000193"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:48.093214" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:48.093037" elapsed="0.000229"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:48.093430" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:48.093288" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:48.092803" elapsed="0.000694"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:22:48.019489" elapsed="0.074047">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:22:48.019121" elapsed="0.074482">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:48.093653" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:22:48.010636" elapsed="0.083189">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:48.094005" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:48.094225" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:48.094083" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:48.094068" elapsed="0.000226"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:48.094420" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:48.094603" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:48.094662" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:22:48.009024" elapsed="0.085811">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:22:48.008512" elapsed="0.086387">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:22:48.008240" elapsed="0.086709">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:22:48.007196" elapsed="0.087834">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:48.095238" elapsed="0.000021"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:22:47.985470" elapsed="0.109871">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:22:49.114530" elapsed="0.000478"/>
</kw>
<msg time="2026-10-16T01:22:49.115118" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:49.113262" elapsed="0.001968"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:22:49.112296" elapsed="0.003089"/>
</kw>
<msg time="2026-10-16T01:22:49.115507" 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-10-16T01:22:49.105444" elapsed="0.010182"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:22:49.104279" elapsed="0.011661"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:49.117190" 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-10-16T01:22:49.116583" elapsed="0.000702"/>
</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-10-16T01:22:49.124001" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:49.123203" elapsed="0.000855"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:49.125086" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:49.124420" elapsed="0.000720"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:49.125235" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:22:49.125522" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:49.122366" elapsed="0.003254"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:22:49.125990" elapsed="0.000289"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:49.127402" 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-10-16T01:22:49.126725" elapsed="0.000733"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:49.128420" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:49.127873" elapsed="0.000599"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:49.129336" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:49.128835" elapsed="0.000553"/>
</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-10-16T01:22:49.138117" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:22:49.136682" elapsed="0.001544"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:22:49.138353" elapsed="0.000130"/>
</return>
<msg time="2026-10-16T01:22:49.138996" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:22:49.133405" elapsed="0.005717"/>
</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-10-16T01:22:49.163190" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:49.162763" elapsed="0.000463"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:22:49.164211" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:22:49.163930" elapsed="0.000374">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:49.164421" 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-10-16T01:22:49.163442" elapsed="0.001011"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:49.165164" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:49.164728" elapsed="0.000472"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:22:49.165611" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:22:49.165824" 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-10-16T01:22:49.165432" elapsed="0.000425"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:49.166444" 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-10-16T01:22:49.166140" elapsed="0.000361"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:49.167997" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:49.167658" elapsed="0.000396"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:22:49.168759" 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-10-16T01:22:49.168302" elapsed="0.000493"/>
</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-10-16T01:22:49.169191" elapsed="0.000029"/>
</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-10-16T01:22:49.169475" elapsed="0.000038"/>
</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-10-16T01:22:49.169788" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:22:49.169010" elapsed="0.000832"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:22:49.168857" elapsed="0.001012"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:22:49.169910" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:22:49.170041" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:22:49.167152" elapsed="0.002912"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:49.166782" elapsed="0.003311"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:49.170260" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:49.170116" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:49.166562" elapsed="0.003768"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:22:49.170912" 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-10-16T01:22:49.170482" elapsed="0.000454"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:22:49.170980" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:22:49.162027" elapsed="0.009052"/>
</kw>
<msg time="2026-10-16T01:22:49.171127" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:49.156344" elapsed="0.014828"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:49.175107" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:49.178950" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:49.182729" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:49.182913" elapsed="0.000020"/>
</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-10-16T01:22:49.183089" elapsed="0.000018"/>
</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-10-16T01:22:49.183425" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:49.183285" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:49.183271" elapsed="0.000227"/>
</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-10-16T01:22:49.183666" 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-10-16T01:22:49.183859" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:49.184054" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:22:49.183246" elapsed="0.000858"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:22:49.183157" elapsed="0.000971"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:49.184278" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:49.184346" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:22:49.184450" 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-10-16T01:22:49.155477" elapsed="0.028996"/>
</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-10-16T01:22:49.185571" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:49.185382" elapsed="0.000268">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:49.185747" 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-10-16T01:22:49.185063" elapsed="0.000708"/>
</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-10-16T01:22:49.186054" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:49.185834" elapsed="0.000272"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:22:49.186546" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:49.186286" elapsed="0.000284"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:49.186129" elapsed="0.000486"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:49.185817" elapsed="0.000819"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:49.187147" 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-10-16T01:22:49.186808" elapsed="0.000364"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:22:49.187216" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:22:49.187339" 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-manganese/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-10-16T01:22:49.184766" elapsed="0.002595"/>
</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-10-16T01:22:49.190278" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:49.188256" elapsed="0.002083">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:49.190423" 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-10-16T01:22:49.187942" elapsed="0.002504"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:22:49.190630" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:22:49.190510" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:49.190493" elapsed="0.000231"/>
</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-10-16T01:22:49.190879" elapsed="0.000020"/>
</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-10-16T01:22:49.191052" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:49.191114" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:22:49.191241" 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-manganese/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-10-16T01:22:49.187627" elapsed="0.003638"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:49.192485" 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-10-16T01:22:49.192261" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:49.192999" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:49.192773" elapsed="0.000267"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:22:49.197153" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:22:49.197205" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:22:49.197315" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:49.193325" elapsed="0.004396">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:49.193099" elapsed="0.004705">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:49.197985" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:49.197834" elapsed="0.000209"/>
</branch>
<status status="FAIL" start="2026-10-16T01:22:49.193083" elapsed="0.004982">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:49.198402" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:49.198526" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:49.198493" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:49.198477" elapsed="0.000106"/>
</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-10-16T01:22:49.198748" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:22:49.198813" elapsed="0.000013"/>
</return>
<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="FAIL" start="2026-10-16T01:22:49.191539" elapsed="0.007376">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:49.198983" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:22:49.145849" elapsed="0.053257">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:22:49.199493" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:49.199273" elapsed="0.000303"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:49.199225" elapsed="0.000408"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:49.199746" elapsed="0.000037"/>
</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="FAIL" start="2026-10-16T01:22:49.143665" elapsed="0.056249">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:49.139576" elapsed="0.060437">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:22:49.139533" elapsed="0.060552">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:49.200332" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:22:49.200744" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:49.201058" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:22:49.201409" elapsed="0.000026"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:22:49.201883" elapsed="0.000031"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:49.202208" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:49.202554" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:22:49.202837" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:22:49.132098" elapsed="0.070841">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:22:49.203000" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:22:49.130254" elapsed="0.072834">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:49.203309" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:49.203167" elapsed="0.000193"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:49.203520" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:49.203382" elapsed="0.000186"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:49.203771" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:49.203603" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:49.203151" elapsed="0.000690"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:22:49.129918" elapsed="0.073962">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:22:49.129483" elapsed="0.074450">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:49.203981" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:22:49.120940" elapsed="0.083131">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:49.204245" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:49.204462" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:49.204322" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:49.204307" elapsed="0.000223"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:49.204667" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:49.204964" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:49.205023" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:22:49.119298" elapsed="0.085818">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:22:49.118839" elapsed="0.086338">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:22:49.118535" elapsed="0.086791">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:22:49.117794" elapsed="0.087616">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:49.205632" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:22:49.096053" elapsed="0.109704">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:22:50.225392" elapsed="0.000468"/>
</kw>
<msg time="2026-10-16T01:22:50.225979" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:50.224115" elapsed="0.001984"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:22:50.223141" elapsed="0.003114"/>
</kw>
<msg time="2026-10-16T01:22:50.226345" 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-10-16T01:22:50.216477" elapsed="0.009956"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:22:50.215597" elapsed="0.010982"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:50.227682" 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-10-16T01:22:50.227119" elapsed="0.000687"/>
</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-10-16T01:22:50.234730" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:50.233893" elapsed="0.000899"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:50.235791" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:50.235126" elapsed="0.000719"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:50.235943" elapsed="0.000068"/>
</return>
<msg time="2026-10-16T01:22:50.236241" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:50.233050" elapsed="0.003241"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:22:50.236675" elapsed="0.000322"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:50.238107" 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-10-16T01:22:50.237368" elapsed="0.000795"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:50.239099" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:50.238517" elapsed="0.000635"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:50.240025" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:50.239464" elapsed="0.000614"/>
</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-10-16T01:22:50.249026" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:22:50.247545" elapsed="0.001590"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:22:50.249261" elapsed="0.000135"/>
</return>
<msg time="2026-10-16T01:22:50.250091" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:22:50.244165" elapsed="0.006054"/>
</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-10-16T01:22:50.274420" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:50.273992" elapsed="0.000464"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:22:50.275473" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:22:50.275164" elapsed="0.000418">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:50.275774" 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-10-16T01:22:50.274694" elapsed="0.001113"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:50.276484" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:50.276047" elapsed="0.000473"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:22:50.276949" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:22:50.277171" 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-10-16T01:22:50.276785" elapsed="0.000419"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:50.277878" 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-10-16T01:22:50.277479" elapsed="0.000457"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:50.279142" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:50.278910" elapsed="0.000273"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:22:50.279830" 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-10-16T01:22:50.279356" elapsed="0.000499"/>
</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-10-16T01:22:50.280144" 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-10-16T01:22:50.280327" elapsed="0.000022"/>
</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-10-16T01:22:50.280507" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:22:50.280013" elapsed="0.000546"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:22:50.279899" elapsed="0.000691"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:22:50.280649" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:22:50.280797" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:22:50.278381" elapsed="0.002440"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:50.278023" elapsed="0.002828"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:50.281024" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:50.280878" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:50.277999" elapsed="0.003095"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:22:50.281669" 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-10-16T01:22:50.281250" elapsed="0.000445"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:22:50.281754" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:22:50.273245" elapsed="0.008610"/>
</kw>
<msg time="2026-10-16T01:22:50.281904" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:50.267432" elapsed="0.014520"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:50.285828" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:50.289717" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:50.293557" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:50.293763" 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-10-16T01:22:50.293944" 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-10-16T01:22:50.294291" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:50.294148" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:50.294134" 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-10-16T01:22:50.294518" elapsed="0.000019"/>
</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-10-16T01:22:50.294726" 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-10-16T01:22:50.294891" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:22:50.294108" elapsed="0.000833"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:22:50.294017" elapsed="0.000947"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:50.295115" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:50.295183" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:22:50.295288" 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-10-16T01:22:50.266437" elapsed="0.028874"/>
</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-10-16T01:22:50.296422" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:50.296231" elapsed="0.000251">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:50.296564" 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-10-16T01:22:50.295911" elapsed="0.000676"/>
</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-10-16T01:22:50.296906" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:50.296669" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:22:50.297408" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:50.297143" elapsed="0.000290"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:50.296981" elapsed="0.000485"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:50.296652" elapsed="0.000833"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:50.298035" 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-10-16T01:22:50.297676" elapsed="0.000415"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:22:50.298139" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:22:50.298265" 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-manganese/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-10-16T01:22:50.295583" elapsed="0.002705"/>
</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-10-16T01:22:50.299373" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:50.299184" elapsed="0.000248">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:50.299517" 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-10-16T01:22:50.298863" elapsed="0.000677"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:22:50.299740" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:22:50.299618" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:50.299588" 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-10-16T01:22:50.299972" elapsed="0.000020"/>
</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-10-16T01:22:50.300144" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:50.300204" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:22:50.300330" 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-manganese/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-10-16T01:22:50.298533" elapsed="0.001821"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:50.301789" 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-10-16T01:22:50.301530" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:50.302238" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:50.302018" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:22:50.306629" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:22:50.306690" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:22:50.306820" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:50.302562" elapsed="0.004688">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:50.302338" elapsed="0.004997">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:50.307518" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:50.307366" elapsed="0.000210"/>
</branch>
<status status="FAIL" start="2026-10-16T01:22:50.302321" elapsed="0.005277">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:50.307977" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:50.308097" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:50.308064" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:50.308049" elapsed="0.000106"/>
</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-10-16T01:22:50.308290" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:22:50.308387" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:22:50.300835" elapsed="0.007665">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:50.308569" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:22:50.256590" elapsed="0.052169">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:22:50.309155" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:50.308933" elapsed="0.000305"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:50.308885" elapsed="0.000394"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:50.309362" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:22:50.254394" elapsed="0.055133">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:50.250739" elapsed="0.058949">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:22:50.250665" elapsed="0.059119">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:50.310034" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:22:50.310384" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:50.310743" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:22:50.311095" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:22:50.311526" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:50.311883" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:50.312237" elapsed="0.000019"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:22:50.312477" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:22:50.242843" elapsed="0.069735">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:22:50.312655" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:22:50.240943" elapsed="0.071829">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:50.312996" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:50.312853" elapsed="0.000194"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:50.313261" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:50.313119" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:50.313477" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:50.313334" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:50.312837" elapsed="0.000751"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:22:50.240548" elapsed="0.073096">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:22:50.240175" elapsed="0.073654">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:50.313883" elapsed="0.000016"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:22:50.231448" elapsed="0.082530">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:50.314158" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:50.314378" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:50.314237" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:50.314222" elapsed="0.000224"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:50.314572" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:50.314782" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:50.314842" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:22:50.229860" elapsed="0.085074">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:22:50.229341" elapsed="0.085656">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:22:50.229083" elapsed="0.085963">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:22:50.228247" elapsed="0.086881">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:50.315338" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:22:50.206412" elapsed="0.109031">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:22:51.336294" elapsed="0.000509"/>
</kw>
<msg time="2026-10-16T01:22:51.336947" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:51.334970" elapsed="0.002118"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:22:51.333972" elapsed="0.003286"/>
</kw>
<msg time="2026-10-16T01:22:51.337351" 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-10-16T01:22:51.326805" elapsed="0.010636"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:22:51.325879" elapsed="0.011714"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:51.338749" 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-10-16T01:22:51.338159" elapsed="0.000687"/>
</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-10-16T01:22:51.345964" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:51.345151" elapsed="0.000873"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:51.347038" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:51.346362" elapsed="0.000731"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:51.347194" elapsed="0.000066"/>
</return>
<msg time="2026-10-16T01:22:51.347492" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:51.344309" elapsed="0.003235"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:22:51.347932" elapsed="0.000295"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:51.349333" 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-10-16T01:22:51.348595" elapsed="0.000793"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:51.350293" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:51.349782" elapsed="0.000564"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:51.351312" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:51.350806" elapsed="0.000560"/>
</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-10-16T01:22:51.360272" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:22:51.358856" elapsed="0.001524"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:22:51.360506" elapsed="0.000172"/>
</return>
<msg time="2026-10-16T01:22:51.361153" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:22:51.355460" elapsed="0.005817"/>
</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-10-16T01:22:51.383855" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:51.383388" elapsed="0.000503"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:22:51.384927" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:22:51.384551" elapsed="0.000494">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:51.385164" 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-10-16T01:22:51.384109" elapsed="0.001087"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:51.385935" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:51.385430" elapsed="0.000540"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:22:51.386361" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:22:51.386597" 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-10-16T01:22:51.386197" elapsed="0.000463"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:51.387167" 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-10-16T01:22:51.386945" elapsed="0.000263"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:51.388261" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:51.387899" elapsed="0.000403"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:22:51.388771" 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-10-16T01:22:51.388478" elapsed="0.000318"/>
</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-10-16T01:22:51.389085" 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-10-16T01:22:51.389270" elapsed="0.000022"/>
</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-10-16T01:22:51.389487" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:22:51.388954" elapsed="0.000591"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:22:51.388840" elapsed="0.000738"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:22:51.389637" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:22:51.389784" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:22:51.387527" elapsed="0.002280"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:51.387268" elapsed="0.002568"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:51.390008" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:51.389864" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:51.387251" elapsed="0.002828"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:22:51.390663" 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-10-16T01:22:51.390233" elapsed="0.000456"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:22:51.390747" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:22:51.382675" elapsed="0.008173"/>
</kw>
<msg time="2026-10-16T01:22:51.390896" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:51.377006" elapsed="0.013937"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:51.394775" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:51.398564" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:51.402360" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:51.402560" elapsed="0.000025"/>
</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-10-16T01:22:51.402781" 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-10-16T01:22:51.403120" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:51.402979" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:51.402966" elapsed="0.000227"/>
</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-10-16T01:22:51.403347" elapsed="0.000018"/>
</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-10-16T01:22:51.403520" elapsed="0.000018"/>
</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-10-16T01:22:51.403692" elapsed="0.000036"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:22:51.402941" elapsed="0.000864"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:22:51.402851" elapsed="0.001011"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:51.404021" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:51.404090" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:22:51.404196" 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-10-16T01:22:51.376145" elapsed="0.028075"/>
</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-10-16T01:22:51.405336" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:51.405141" elapsed="0.000253">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:51.405477" 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-10-16T01:22:51.404818" elapsed="0.000682"/>
</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-10-16T01:22:51.405823" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:51.405563" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:22:51.406321" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:51.406057" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:51.405899" elapsed="0.000478"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:51.405546" elapsed="0.000850"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:51.406922" 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-10-16T01:22:51.406553" elapsed="0.000393"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:22:51.406991" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:22:51.407114" 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-manganese/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-10-16T01:22:51.404490" elapsed="0.002647"/>
</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-10-16T01:22:51.408255" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:51.408065" elapsed="0.000250">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:51.408398" 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-10-16T01:22:51.407747" elapsed="0.000674"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:22:51.408589" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-10-16T01:22:51.408483" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:51.408466" elapsed="0.000216"/>
</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-10-16T01:22:51.408853" 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-10-16T01:22:51.409026" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:51.409086" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:22:51.409210" 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-manganese/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-10-16T01:22:51.407384" elapsed="0.001850"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:51.410646" 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-10-16T01:22:51.410405" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:51.411115" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:51.410895" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:22:51.415647" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:22:51.415765" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:22:51.415876" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:51.411440" elapsed="0.004877">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:51.411216" elapsed="0.005188">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:51.416592" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:51.416435" elapsed="0.000230"/>
</branch>
<status status="FAIL" start="2026-10-16T01:22:51.411199" elapsed="0.005489">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:51.417047" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:51.417167" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:51.417134" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:51.417117" elapsed="0.000109"/>
</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-10-16T01:22:51.417361" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:22:51.417424" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:22:51.409712" elapsed="0.007818">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:51.417597" elapsed="0.000028"/>
</return>
<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="FAIL" start="2026-10-16T01:22:51.366429" elapsed="0.051330">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:22:51.418149" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:51.417927" elapsed="0.000304"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:51.417880" elapsed="0.000392"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:51.418357" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:22:51.364265" elapsed="0.054257">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:51.361857" elapsed="0.056798">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:22:51.361824" elapsed="0.056934">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:51.419015" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:22:51.419367" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:51.419721" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:22:51.420076" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:22:51.420542" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:51.420901" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:51.421254" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:22:51.421503" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:22:51.354126" elapsed="0.067479">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:22:51.421680" elapsed="0.000053"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:22:51.352234" elapsed="0.069578">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:51.422031" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:51.421891" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:51.422238" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:51.422102" elapsed="0.000185"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:51.422450" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:51.422308" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:51.421875" elapsed="0.000643"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:22:51.351899" elapsed="0.070658">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:22:51.351461" elapsed="0.071149">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:51.422673" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:22:51.342749" elapsed="0.080044">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:51.422968" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:51.423188" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:51.423047" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:51.423032" elapsed="0.000224"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:51.423380" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:51.423547" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:51.423605" 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="FAIL" start="2026-10-16T01:22:51.341086" elapsed="0.082734">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:22:51.340541" elapsed="0.083345">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:22:51.340267" elapsed="0.083669">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:22:51.339306" elapsed="0.084716">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:51.424281" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:22:51.316435" elapsed="0.107953">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:22:52.445523" elapsed="0.000535"/>
</kw>
<msg time="2026-10-16T01:22:52.446204" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:52.444156" elapsed="0.002193"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:22:52.443173" elapsed="0.003343"/>
</kw>
<msg time="2026-10-16T01:22:52.446613" 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-10-16T01:22:52.435599" elapsed="0.011173"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:22:52.434738" elapsed="0.012215"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:52.448170" 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-10-16T01:22:52.447469" elapsed="0.000802"/>
</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-10-16T01:22:52.455810" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:52.454970" elapsed="0.000910"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:52.456923" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:52.456232" elapsed="0.000753"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:52.457089" elapsed="0.000068"/>
</return>
<msg time="2026-10-16T01:22:52.457396" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:52.454098" elapsed="0.003349"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:22:52.457848" elapsed="0.000319"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:52.459360" 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-10-16T01:22:52.458560" elapsed="0.000858"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:52.460341" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:52.459802" elapsed="0.000592"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:52.461294" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:52.460755" elapsed="0.000593"/>
</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-10-16T01:22:52.470484" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:22:52.469094" elapsed="0.001496"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:22:52.470781" elapsed="0.000142"/>
</return>
<msg time="2026-10-16T01:22:52.471350" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:22:52.465678" elapsed="0.005796"/>
</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-10-16T01:22:52.496027" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:52.495521" elapsed="0.000545"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:22:52.497236" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:22:52.496893" elapsed="0.000460">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:52.497473" 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-10-16T01:22:52.496371" elapsed="0.001133"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:52.498212" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:52.497778" elapsed="0.000470"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:22:52.498659" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:22:52.498908" 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-10-16T01:22:52.498475" elapsed="0.000466"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:52.499519" 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-10-16T01:22:52.499210" elapsed="0.000375"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:52.500846" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:52.500563" elapsed="0.000338"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:22:52.501355" 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-10-16T01:22:52.501081" 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-10-16T01:22:52.501849" elapsed="0.000030"/>
</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-10-16T01:22:52.502056" 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-10-16T01:22:52.502242" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:22:52.501538" elapsed="0.000757"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:22:52.501423" elapsed="0.000904"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:22:52.502370" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:22:52.502502" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:22:52.500220" elapsed="0.002305"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:52.499938" elapsed="0.002616"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:52.502783" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:52.502586" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:52.499727" elapsed="0.003138"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:22:52.503456" 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-10-16T01:22:52.503036" elapsed="0.000446"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:22:52.503527" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:22:52.494805" elapsed="0.008834"/>
</kw>
<msg time="2026-10-16T01:22:52.503693" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:52.489009" elapsed="0.014747"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:52.507720" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:52.511542" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:52.515476" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:52.515712" 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-10-16T01:22:52.515912" 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-10-16T01:22:52.516263" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:52.516120" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:52.516106" 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-10-16T01:22:52.516490" elapsed="0.000019"/>
</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-10-16T01:22:52.516684" 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-10-16T01:22:52.516877" elapsed="0.000024"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:22:52.516078" elapsed="0.000855"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:22:52.515989" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:52.517110" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:52.517179" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:22:52.517286" 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-10-16T01:22:52.488112" elapsed="0.029200"/>
</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-10-16T01:22:52.518464" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:52.518270" elapsed="0.000255">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:52.518612" 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-10-16T01:22:52.517939" elapsed="0.000714"/>
</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-10-16T01:22:52.518971" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:52.518735" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:22:52.519484" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:52.519211" elapsed="0.000298"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:52.519051" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:52.518717" elapsed="0.000845"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:52.520125" 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-10-16T01:22:52.519758" elapsed="0.000393"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:22:52.520199" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:22:52.520326" 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-manganese/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-10-16T01:22:52.517584" elapsed="0.002766"/>
</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-10-16T01:22:52.523863" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:52.521314" elapsed="0.002620">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:52.524023" 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-10-16T01:22:52.520994" elapsed="0.003053"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:22:52.524218" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:22:52.524112" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:52.524095" elapsed="0.000202"/>
</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-10-16T01:22:52.524449" 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-10-16T01:22:52.524637" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:52.524721" elapsed="0.000016"/>
</return>
<msg time="2026-10-16T01:22:52.524853" 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-manganese/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-10-16T01:22:52.520662" elapsed="0.004223"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:52.526146" 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-10-16T01:22:52.525910" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:52.526605" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:52.526379" 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-10-16T01:22:52.531231" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:22:52.531291" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:22:52.531405" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:52.526998" elapsed="0.004870">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:52.526754" elapsed="0.005230">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:52.532168" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:52.532016" elapsed="0.000233"/>
</branch>
<status status="FAIL" start="2026-10-16T01:22:52.526735" elapsed="0.005538">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:52.532643" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:52.532788" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:52.532754" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:52.532737" elapsed="0.000110"/>
</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-10-16T01:22:52.532998" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:22:52.533065" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:22:52.525166" elapsed="0.008005">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:52.533305" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:22:52.478137" elapsed="0.055304">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:22:52.533916" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:52.533620" elapsed="0.000385"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:52.533568" elapsed="0.000481"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:52.534133" elapsed="0.000037"/>
</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="FAIL" start="2026-10-16T01:22:52.475830" elapsed="0.058470">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:52.472182" elapsed="0.062219">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:22:52.472132" elapsed="0.062348">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:52.534767" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:22:52.535132" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:52.535450" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:22:52.535852" elapsed="0.000030"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:22:52.536300" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:52.536621" elapsed="0.000034"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:52.537027" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:22:52.537290" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:22:52.464259" elapsed="0.073134">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:22:52.537456" elapsed="0.000014"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:22:52.462261" elapsed="0.075308">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:52.537875" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:52.537686" elapsed="0.000243"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:52.538090" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:52.537952" elapsed="0.000187"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:52.538300" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:52.538161" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:52.537668" elapsed="0.000701"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:22:52.461907" elapsed="0.076500">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:22:52.461443" elapsed="0.077017">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:52.538507" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:22:52.452567" elapsed="0.086089">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:52.538917" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:52.539136" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:52.538998" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:52.538982" elapsed="0.000222"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:52.539328" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:52.539494" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:52.539552" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:22:52.450763" elapsed="0.088894">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:22:52.450164" elapsed="0.089632">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:22:52.449844" elapsed="0.090003">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:22:52.448929" elapsed="0.090998">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:52.540135" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:22:52.425366" elapsed="0.114877">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:22:53.559739" elapsed="0.000422"/>
</kw>
<msg time="2026-10-16T01:22:53.560282" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:53.558423" elapsed="0.001978"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:22:53.557480" elapsed="0.003083"/>
</kw>
<msg time="2026-10-16T01:22:53.560680" 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-10-16T01:22:53.550895" elapsed="0.009907"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:22:53.550006" elapsed="0.010950"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:53.562010" 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-10-16T01:22:53.561437" elapsed="0.000665"/>
</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-10-16T01:22:53.568757" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:53.567958" elapsed="0.000860"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:53.569818" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:53.569155" elapsed="0.000720"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:53.570083" elapsed="0.000067"/>
</return>
<msg time="2026-10-16T01:22:53.570387" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:53.567118" elapsed="0.003321"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:22:53.570821" elapsed="0.000290"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:53.572217" 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-10-16T01:22:53.571483" elapsed="0.000789"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:53.573172" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:53.572604" elapsed="0.000621"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:53.574091" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:53.573538" elapsed="0.000605"/>
</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-10-16T01:22:53.582935" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:22:53.581491" elapsed="0.001553"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:22:53.583171" elapsed="0.000131"/>
</return>
<msg time="2026-10-16T01:22:53.583810" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:22:53.578228" elapsed="0.005746"/>
</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-10-16T01:22:53.607680" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:53.607233" elapsed="0.000504"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:22:53.608759" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:22:53.608403" elapsed="0.000465">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:53.608988" 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-10-16T01:22:53.607956" elapsed="0.001064"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:53.609731" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:53.609256" elapsed="0.000512"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:22:53.610157" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:22:53.610380" 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-10-16T01:22:53.609995" elapsed="0.000418"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:53.611031" 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-10-16T01:22:53.610720" elapsed="0.000368"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:53.612362" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:53.612043" elapsed="0.000376"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:22:53.613249" 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-10-16T01:22:53.612732" elapsed="0.000542"/>
</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-10-16T01:22:53.613563" elapsed="0.000020"/>
</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-10-16T01:22:53.613780" 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-10-16T01:22:53.613965" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:22:53.613432" elapsed="0.000586"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:22:53.613318" elapsed="0.000729"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:22:53.614090" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:22:53.614267" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:22:53.611521" elapsed="0.002769"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:53.611172" elapsed="0.003147"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:53.614491" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:53.614345" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:53.611149" elapsed="0.003413"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:22:53.615163" 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-10-16T01:22:53.614751" elapsed="0.000437"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:22:53.615232" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:22:53.606495" elapsed="0.008836"/>
</kw>
<msg time="2026-10-16T01:22:53.615381" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:53.600768" elapsed="0.014659"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:53.619277" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:53.623104" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:53.626943" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:53.627120" elapsed="0.000020"/>
</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-10-16T01:22:53.627297" 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-10-16T01:22:53.627656" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:53.627499" elapsed="0.000223"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:53.627485" elapsed="0.000260"/>
</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-10-16T01:22:53.627901" 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-10-16T01:22:53.628077" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:53.628237" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:22:53.627458" elapsed="0.000827"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:22:53.627367" elapsed="0.000941"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:53.628460" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:53.628528" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:22:53.628647" 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-10-16T01:22:53.599895" elapsed="0.028778"/>
</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-10-16T01:22:53.629844" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:53.629619" elapsed="0.000286">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:53.629989" 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-10-16T01:22:53.629297" elapsed="0.000715"/>
</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-10-16T01:22:53.630298" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:53.630075" elapsed="0.000274"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:22:53.630832" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:53.630534" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:53.630372" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:53.630058" elapsed="0.000852"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:53.631413" 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-10-16T01:22:53.631068" elapsed="0.000369"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:22:53.631483" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:22:53.631608" 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-manganese/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-10-16T01:22:53.628998" elapsed="0.002633"/>
</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-10-16T01:22:53.632753" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:53.632532" elapsed="0.000281">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:53.632896" 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-10-16T01:22:53.632214" elapsed="0.000705"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:22:53.633084" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:22:53.632983" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:53.632966" elapsed="0.000196"/>
</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-10-16T01:22:53.633313" elapsed="0.000020"/>
</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-10-16T01:22:53.633484" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:53.633543" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:22:53.633686" 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-manganese/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-10-16T01:22:53.631914" elapsed="0.001809"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:53.635129" 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-10-16T01:22:53.634904" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:53.635610" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:53.635386" 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-10-16T01:22:53.639972" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:22:53.640030" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:22:53.640175" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:53.635966" elapsed="0.004646">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:53.635740" elapsed="0.004983">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:53.640908" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:53.640756" elapsed="0.000211"/>
</branch>
<status status="FAIL" start="2026-10-16T01:22:53.635722" elapsed="0.005266">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:53.641332" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:53.641452" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:53.641418" elapsed="0.000073"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:53.641402" elapsed="0.000109"/>
</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-10-16T01:22:53.641670" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:22:53.641750" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:22:53.634177" elapsed="0.007679">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:53.641924" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:22:53.590172" elapsed="0.051877">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:22:53.642441" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:53.642217" elapsed="0.000306"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:53.642170" elapsed="0.000395"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:53.642665" 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="FAIL" start="2026-10-16T01:22:53.588006" elapsed="0.054852">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:53.584535" elapsed="0.058423">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:22:53.584485" elapsed="0.058545">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:53.643279" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:22:53.643623" elapsed="0.000035"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:53.643965" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:22:53.644317" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:22:53.644790" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:53.645107" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:53.645457" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:22:53.645790" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:22:53.576903" elapsed="0.068991">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:22:53.645956" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:22:53.575005" elapsed="0.071040">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:53.646267" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:53.646125" elapsed="0.000192"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:53.646474" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:53.646338" elapsed="0.000185"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:53.646730" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:53.646544" elapsed="0.000235"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:53.646110" elapsed="0.000691"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:22:53.574613" elapsed="0.072226">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:22:53.574240" elapsed="0.072653">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:53.646941" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:22:53.565750" elapsed="0.081283">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:53.647208" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:53.647428" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:53.647286" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:53.647270" elapsed="0.000226"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:53.647621" elapsed="0.000035"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:53.647930" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:53.647990" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:22:53.564110" elapsed="0.084021">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:22:53.563600" elapsed="0.084597">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:22:53.563349" elapsed="0.084899">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:22:53.562546" elapsed="0.085786">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:53.648541" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:22:53.540971" elapsed="0.107690">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:22:54.667994" elapsed="0.000389"/>
</kw>
<msg time="2026-10-16T01:22:54.668489" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:54.666744" elapsed="0.001854"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:22:54.665806" elapsed="0.003004"/>
</kw>
<msg time="2026-10-16T01:22:54.668904" 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-10-16T01:22:54.659212" elapsed="0.009783"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:22:54.658320" elapsed="0.010825"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:54.670178" 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-10-16T01:22:54.669611" elapsed="0.000660"/>
</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-10-16T01:22:54.676828" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:54.676036" elapsed="0.000851"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:54.678040" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:54.677220" elapsed="0.000875"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:54.678189" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:22:54.678475" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:54.675200" elapsed="0.003325"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:22:54.678910" elapsed="0.000288"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:54.680288" 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-10-16T01:22:54.679563" elapsed="0.000780"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:54.681243" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:54.680725" elapsed="0.000572"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:54.682163" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:54.681605" elapsed="0.000611"/>
</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-10-16T01:22:54.690917" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:22:54.689486" elapsed="0.001539"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:22:54.691153" elapsed="0.000134"/>
</return>
<msg time="2026-10-16T01:22:54.691769" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:22:54.686234" elapsed="0.005661"/>
</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-10-16T01:22:54.715738" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:54.715275" elapsed="0.000500"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:22:54.716751" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:22:54.716431" elapsed="0.000422">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:54.716971" 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-10-16T01:22:54.715991" elapsed="0.001011"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:54.717791" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:54.717310" elapsed="0.000518"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:22:54.718215" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:22:54.718420" 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-10-16T01:22:54.718054" elapsed="0.000399"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:54.719077" 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-10-16T01:22:54.718764" elapsed="0.000372"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:54.720593" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:54.720089" elapsed="0.000594"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:22:54.721280" 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-10-16T01:22:54.721010" 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-10-16T01:22:54.721586" elapsed="0.000020"/>
</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-10-16T01:22:54.721799" 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-10-16T01:22:54.721982" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:22:54.721458" elapsed="0.000574"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:22:54.721348" elapsed="0.000711"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:22:54.722098" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:22:54.722227" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:22:54.719571" elapsed="0.002679"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:54.719222" elapsed="0.003057"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:54.722445" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:54.722302" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:54.719198" elapsed="0.003316"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:22:54.723091" 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-10-16T01:22:54.722685" elapsed="0.000432"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:22:54.723161" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:22:54.714544" elapsed="0.008717"/>
</kw>
<msg time="2026-10-16T01:22:54.723307" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:54.708885" elapsed="0.014469"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:54.727178" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:54.731010" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:54.734825" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:54.735035" elapsed="0.000020"/>
</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-10-16T01:22:54.735214" elapsed="0.000019"/>
</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-10-16T01:22:54.735555" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:54.735413" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:54.735399" elapsed="0.000229"/>
</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-10-16T01:22:54.735813" 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-10-16T01:22:54.735992" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:54.736151" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:22:54.735373" elapsed="0.000827"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:22:54.735282" elapsed="0.000941"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:54.736373" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:54.736441" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:22:54.736546" 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-10-16T01:22:54.708020" elapsed="0.028549"/>
</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-10-16T01:22:54.737683" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:54.737479" elapsed="0.000277">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:54.737841" 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-10-16T01:22:54.737160" elapsed="0.000703"/>
</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-10-16T01:22:54.738141" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:54.737926" elapsed="0.000268"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:22:54.738636" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:54.738374" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:54.738217" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:54.737910" elapsed="0.000839"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:54.739245" 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-10-16T01:22:54.738908" elapsed="0.000362"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:22:54.739315" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:22:54.739438" 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-manganese/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-10-16T01:22:54.736864" elapsed="0.002597"/>
</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-10-16T01:22:54.740562" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:54.740372" elapsed="0.000248">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:54.740754" 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-10-16T01:22:54.740054" elapsed="0.000725"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:22:54.741014" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:22:54.740910" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:54.740891" elapsed="0.000201"/>
</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-10-16T01:22:54.741242" elapsed="0.000020"/>
</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-10-16T01:22:54.741413" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:54.741473" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:22:54.741597" 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-manganese/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-10-16T01:22:54.739739" elapsed="0.001881"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:54.743056" 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-10-16T01:22:54.742831" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:54.743499" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:54.743284" elapsed="0.000255"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:22:54.747731" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:22:54.747788" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:22:54.747889" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:54.743856" elapsed="0.004432">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:54.743599" elapsed="0.004770">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:54.748556" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:54.748399" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-10-16T01:22:54.743583" elapsed="0.005078">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:54.749048" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:54.749168" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:54.749136" elapsed="0.000069"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:54.749120" elapsed="0.000105"/>
</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-10-16T01:22:54.749361" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:22:54.749423" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:22:54.742108" elapsed="0.007418">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:54.749593" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:22:54.698330" elapsed="0.051428">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:22:54.750147" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:54.749929" elapsed="0.000331"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:54.749882" elapsed="0.000420"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:54.750386" elapsed="0.000037"/>
</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="FAIL" start="2026-10-16T01:22:54.696206" elapsed="0.054345">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:54.692346" elapsed="0.058319">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:22:54.692303" elapsed="0.058460">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:54.751015" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:22:54.751368" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:54.751691" elapsed="0.000051"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:22:54.752072" elapsed="0.000024"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:22:54.752498" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:54.752841" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:54.753192" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:22:54.753433" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:22:54.684927" elapsed="0.068608">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:22:54.753595" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:22:54.683067" elapsed="0.070653">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:54.753946" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:54.753804" elapsed="0.000192"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:54.754154" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:54.754018" elapsed="0.000185"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:54.754366" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:54.754225" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:54.753787" elapsed="0.000648"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:22:54.682733" elapsed="0.071740">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:22:54.682310" elapsed="0.072214">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:54.754571" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:22:54.673844" elapsed="0.080836">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:54.754992" elapsed="0.000052"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:54.755250" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:54.755107" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:54.755091" elapsed="0.000228"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:54.755444" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:54.755610" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:54.755713" elapsed="0.000019"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:22:54.672223" elapsed="0.083592">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:22:54.671784" elapsed="0.084093">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:22:54.671497" elapsed="0.084429">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:22:54.670764" elapsed="0.085243">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:54.756213" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:22:54.649441" elapsed="0.106876">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:22:55.768226" elapsed="0.000262"/>
</kw>
<msg time="2026-10-16T01:22:55.768562" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:55.767358" elapsed="0.001279"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:22:55.766802" elapsed="0.001974"/>
</kw>
<msg time="2026-10-16T01:22:55.768834" 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-10-16T01:22:55.762537" elapsed="0.006354"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:22:55.762012" elapsed="0.006972"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:55.769614" 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-10-16T01:22:55.769291" elapsed="0.000398"/>
</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-10-16T01:22:55.773823" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:55.773318" elapsed="0.000541"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:55.774448" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:55.774069" elapsed="0.000413"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:55.774543" elapsed="0.000039"/>
</return>
<msg time="2026-10-16T01:22:55.774756" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:55.772828" elapsed="0.001961"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:22:55.774998" elapsed="0.000180"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:55.775959" 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-10-16T01:22:55.775406" elapsed="0.000590"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:55.776524" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:55.776204" elapsed="0.000354"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:55.777110" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:55.776791" elapsed="0.000354"/>
</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-10-16T01:22:55.782492" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:22:55.781640" elapsed="0.000923"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:22:55.782643" elapsed="0.000135"/>
</return>
<msg time="2026-10-16T01:22:55.783052" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:22:55.779613" elapsed="0.003519"/>
</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-10-16T01:22:55.805386" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:55.804963" elapsed="0.000460"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:22:55.806410" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:22:55.806115" elapsed="0.000389">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:55.806622" 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-10-16T01:22:55.805637" elapsed="0.001035"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:55.807363" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:55.806930" elapsed="0.000470"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:22:55.807820" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:22:55.808031" 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-10-16T01:22:55.807626" elapsed="0.000439"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:55.808638" 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-10-16T01:22:55.808332" elapsed="0.000404"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:55.810171" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:55.809848" elapsed="0.000382"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:22:55.810863" 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-10-16T01:22:55.810472" elapsed="0.000426"/>
</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-10-16T01:22:55.811288" elapsed="0.000028"/>
</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-10-16T01:22:55.811540" 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-10-16T01:22:55.811793" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:22:55.811110" elapsed="0.000736"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:22:55.810958" elapsed="0.000915"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:22:55.811913" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:22:55.812042" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:22:55.809341" elapsed="0.002724"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:55.808986" elapsed="0.003108"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:55.812260" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:55.812118" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:55.808799" elapsed="0.003532"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:22:55.812904" 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-10-16T01:22:55.812484" elapsed="0.000480"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:22:55.813010" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:22:55.804225" elapsed="0.008887"/>
</kw>
<msg time="2026-10-16T01:22:55.813159" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:55.798611" elapsed="0.014595"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:55.816998" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:55.820771" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:55.824526" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:55.824728" elapsed="0.000020"/>
</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-10-16T01:22:55.824907" 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-10-16T01:22:55.825245" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:55.825103" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:55.825090" elapsed="0.000228"/>
</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-10-16T01:22:55.825469" elapsed="0.000019"/>
</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-10-16T01:22:55.825646" elapsed="0.000032"/>
</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-10-16T01:22:55.825843" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:22:55.825064" elapsed="0.000828"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:22:55.824975" elapsed="0.000941"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:55.826064" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:55.826132" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:22:55.826234" 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-10-16T01:22:55.797783" elapsed="0.028475"/>
</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-10-16T01:22:55.827394" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:55.827201" elapsed="0.000252">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:55.827535" 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-10-16T01:22:55.826880" elapsed="0.000678"/>
</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-10-16T01:22:55.827869" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:55.827621" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:22:55.828443" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:55.828138" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:55.827944" elapsed="0.000557"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:55.827604" elapsed="0.000917"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:55.829049" 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-10-16T01:22:55.828694" elapsed="0.000380"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:22:55.829119" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:22:55.829243" 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-manganese/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-10-16T01:22:55.826518" elapsed="0.002748"/>
</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-10-16T01:22:55.832088" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:55.830163" elapsed="0.001989">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:55.832237" 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-10-16T01:22:55.829843" elapsed="0.002421"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:22:55.832427" elapsed="0.000022"/>
</return>
<status status="PASS" start="2026-10-16T01:22:55.832328" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:55.832311" elapsed="0.000192"/>
</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-10-16T01:22:55.832653" elapsed="0.000037"/>
</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-10-16T01:22:55.832857" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:55.832917" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:22:55.833041" 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-manganese/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-10-16T01:22:55.829509" elapsed="0.003556"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:55.834283" 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-10-16T01:22:55.834055" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:55.834761" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:55.834511" 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-10-16T01:22:55.839139" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:22:55.839196" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:22:55.839310" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:55.835088" elapsed="0.004661">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:55.834864" elapsed="0.005017">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:55.840065" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:55.839914" elapsed="0.000210"/>
</branch>
<status status="FAIL" start="2026-10-16T01:22:55.834847" elapsed="0.005298">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:55.840485" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:55.840604" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:55.840572" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:55.840556" 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-10-16T01:22:55.840828" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:22:55.840891" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:22:55.833332" elapsed="0.007663">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:55.841061" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:22:55.788143" elapsed="0.053048">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:22:55.841578" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:55.841357" elapsed="0.000316"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:55.841310" elapsed="0.000430"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:55.841827" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:22:55.785977" elapsed="0.056015">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:55.783427" elapsed="0.058663">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:22:55.783392" elapsed="0.058770">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:55.842412" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:22:55.842799" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:55.843132" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:22:55.843481" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:22:55.843951" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:55.844266" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:55.844615" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:22:55.844923" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:22:55.778830" elapsed="0.066195">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:22:55.845148" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:22:55.777649" elapsed="0.067593">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:55.845462" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:55.845321" elapsed="0.000190"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:55.845684" elapsed="0.000104"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:55.845534" elapsed="0.000287"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:55.845985" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:55.845844" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:55.845306" elapsed="0.000747"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:22:55.777439" elapsed="0.068652">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:22:55.777205" elapsed="0.068938">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:55.846192" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:22:55.771950" elapsed="0.074332">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:55.846454" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:55.846754" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:55.846530" elapsed="0.000276"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:55.846515" elapsed="0.000313"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:55.846955" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:55.847121" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:55.847178" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:22:55.770960" elapsed="0.076309">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:22:55.770605" elapsed="0.076725">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:22:55.770449" elapsed="0.076929">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:22:55.769988" elapsed="0.077496">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:55.847734" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:22:55.756823" elapsed="0.091018">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:22:56.868260" elapsed="0.000521"/>
</kw>
<msg time="2026-10-16T01:22:56.868944" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:56.866859" elapsed="0.002418"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:22:56.865796" elapsed="0.003658"/>
</kw>
<msg time="2026-10-16T01:22:56.869548" 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-10-16T01:22:56.859101" elapsed="0.010537"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:22:56.858146" elapsed="0.011727"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:56.871042" 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-10-16T01:22:56.870427" elapsed="0.000708"/>
</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-10-16T01:22:56.878572" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:56.877811" elapsed="0.000819"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:56.879889" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:56.879204" elapsed="0.000741"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:56.880048" elapsed="0.000066"/>
</return>
<msg time="2026-10-16T01:22:56.880348" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:56.876928" elapsed="0.003471"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:22:56.880784" elapsed="0.000295"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:56.882183" 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-10-16T01:22:56.881449" elapsed="0.000791"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:56.883129" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:56.882566" elapsed="0.000618"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:56.884128" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:56.883495" elapsed="0.000694"/>
</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-10-16T01:22:56.893448" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:22:56.892009" elapsed="0.001551"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:22:56.893935" elapsed="0.000143"/>
</return>
<msg time="2026-10-16T01:22:56.894512" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:22:56.888487" elapsed="0.006152"/>
</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-10-16T01:22:56.920836" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:56.920281" elapsed="0.000598"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:22:56.922122" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:22:56.921720" elapsed="0.000541">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:56.922408" 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-10-16T01:22:56.921143" elapsed="0.001304"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:56.923517" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:56.922811" elapsed="0.000752"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:22:56.924104" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:22:56.924433" 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-10-16T01:22:56.923900" elapsed="0.000575"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:56.925266" 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-10-16T01:22:56.924912" elapsed="0.000403"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:56.926400" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:56.926125" elapsed="0.000321"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:22:56.927093" 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-10-16T01:22:56.926638" elapsed="0.000481"/>
</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-10-16T01:22:56.927412" 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-10-16T01:22:56.927601" elapsed="0.000022"/>
</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-10-16T01:22:56.927811" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:22:56.927281" elapsed="0.000584"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:22:56.927164" elapsed="0.000733"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:22:56.927940" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:22:56.928071" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:22:56.925744" elapsed="0.002350"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:56.925389" elapsed="0.002734"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:56.928296" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:56.928152" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:56.925367" elapsed="0.003000"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:22:56.928982" 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-10-16T01:22:56.928525" elapsed="0.000483"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:22:56.929051" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:22:56.919375" elapsed="0.009777"/>
</kw>
<msg time="2026-10-16T01:22:56.929200" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:56.912938" elapsed="0.016308"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:56.933093" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:56.936893" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:56.940658" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:56.940896" 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-10-16T01:22:56.941076" elapsed="0.000019"/>
</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-10-16T01:22:56.941423" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:56.941279" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:56.941266" 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-10-16T01:22:56.941649" elapsed="0.000082"/>
</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-10-16T01:22:56.941893" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:56.942053" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:22:56.941240" elapsed="0.000860"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:22:56.941148" elapsed="0.000975"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:56.942276" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:56.942344" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:22:56.942450" 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-10-16T01:22:56.912014" elapsed="0.030459"/>
</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-10-16T01:22:56.943602" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:56.943406" elapsed="0.000275">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:56.943782" 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-10-16T01:22:56.943085" elapsed="0.000720"/>
</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-10-16T01:22:56.944088" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:56.943869" elapsed="0.000272"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:22:56.944600" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:56.944334" elapsed="0.000291"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:56.944164" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:56.943852" elapsed="0.000842"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:56.945216" 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-10-16T01:22:56.944874" elapsed="0.000367"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:22:56.945286" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:22:56.945410" 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-manganese/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-10-16T01:22:56.942785" elapsed="0.002648"/>
</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-10-16T01:22:56.946538" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:56.946347" elapsed="0.000251">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:56.946715" 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-10-16T01:22:56.946030" elapsed="0.000711"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:22:56.946910" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:22:56.946806" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:56.946788" elapsed="0.000200"/>
</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-10-16T01:22:56.947139" 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-10-16T01:22:56.947370" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:56.947432" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:22:56.947559" 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-manganese/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-10-16T01:22:56.945715" elapsed="0.001868"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:56.949038" 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-10-16T01:22:56.948810" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:56.949489" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:56.949269" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:22:56.954146" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:22:56.954204" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:22:56.954309" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:56.949848" elapsed="0.004938">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:56.949590" elapsed="0.005282">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:56.955053" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:56.954902" elapsed="0.000209"/>
</branch>
<status status="FAIL" start="2026-10-16T01:22:56.949573" elapsed="0.005560">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:56.955483" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:56.955604" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:56.955570" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:56.955554" elapsed="0.000106"/>
</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-10-16T01:22:56.955836" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:22:56.955901" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:22:56.948075" elapsed="0.007932">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:56.956075" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:22:56.902086" elapsed="0.054118">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:22:56.956597" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:56.956375" elapsed="0.000342"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:56.956327" elapsed="0.000438"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:56.956850" elapsed="0.000037"/>
</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="FAIL" start="2026-10-16T01:22:56.899211" elapsed="0.057841">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:56.895170" elapsed="0.061983">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:22:56.895122" elapsed="0.062106">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:56.957485" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:22:56.957875" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:56.958193" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:22:56.958550" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:22:56.959034" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:56.959356" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:56.959757" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:22:56.960002" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:22:56.887073" elapsed="0.073031">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:22:56.960166" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:22:56.885090" elapsed="0.075167">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:56.960481" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:56.960339" elapsed="0.000191"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:56.960725" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:56.960552" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:56.960943" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:56.960799" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:56.960323" elapsed="0.000688"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:22:56.884663" elapsed="0.076386">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:22:56.884289" elapsed="0.076815">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:56.961153" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:22:56.875485" elapsed="0.085758">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:56.961420" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:56.961646" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:56.961500" elapsed="0.000290"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:56.961485" elapsed="0.000329"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:56.961982" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:56.962157" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:56.962216" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:22:56.873272" elapsed="0.089038">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:22:56.872737" elapsed="0.089638">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:22:56.872416" elapsed="0.090008">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:22:56.871592" elapsed="0.090916">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:56.962798" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:22:56.848884" elapsed="0.114023">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:22:57.981624" elapsed="0.000721"/>
</kw>
<msg time="2026-10-16T01:22:57.982459" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:57.980364" elapsed="0.002206"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:22:57.979415" elapsed="0.003366"/>
</kw>
<msg time="2026-10-16T01:22:57.982877" 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-10-16T01:22:57.972588" elapsed="0.010381"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:22:57.971770" elapsed="0.011348"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:57.984166" 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-10-16T01:22:57.983591" elapsed="0.000669"/>
</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-10-16T01:22:57.991035" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:57.990252" elapsed="0.000841"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:57.992082" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:57.991426" elapsed="0.000709"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:57.992228" elapsed="0.000059"/>
</return>
<msg time="2026-10-16T01:22:57.992512" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:57.989415" elapsed="0.003148"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:22:57.992946" elapsed="0.000293"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:57.994323" 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-10-16T01:22:57.993605" elapsed="0.000772"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:57.995265" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:57.994756" elapsed="0.000561"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:57.996320" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:57.995622" elapsed="0.000752"/>
</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-10-16T01:22:58.005272" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:22:58.003863" elapsed="0.001518"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:22:58.005510" elapsed="0.000133"/>
</return>
<msg time="2026-10-16T01:22:58.006273" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:22:58.000485" elapsed="0.005913"/>
</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-10-16T01:22:58.030485" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:58.030060" elapsed="0.000461"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:22:58.031496" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:22:58.031213" elapsed="0.000376">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:58.031742" 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-10-16T01:22:58.030772" elapsed="0.001004"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:58.032442" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:58.032013" elapsed="0.000464"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:22:58.032923" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:22:58.033125" 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-10-16T01:22:58.032760" elapsed="0.000398"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:58.033772" 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-10-16T01:22:58.033429" elapsed="0.000401"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:58.035263" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:58.034760" elapsed="0.000561"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:22:58.036003" 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-10-16T01:22:58.035563" elapsed="0.000483"/>
</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-10-16T01:22:58.036388" 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-10-16T01:22:58.036574" elapsed="0.000022"/>
</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-10-16T01:22:58.036780" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:22:58.036259" elapsed="0.000575"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:22:58.036121" elapsed="0.000740"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:22:58.036901" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:22:58.037030" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:22:58.034261" elapsed="0.002792"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:58.033915" elapsed="0.003166"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:58.037247" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:58.037105" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:58.033891" elapsed="0.003427"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:22:58.037887" 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-10-16T01:22:58.037470" elapsed="0.000442"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:22:58.037955" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:22:58.029321" elapsed="0.008733"/>
</kw>
<msg time="2026-10-16T01:22:58.038136" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:58.023673" elapsed="0.014511"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:58.041995" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:58.045810" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:58.049612" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:58.049822" elapsed="0.000020"/>
</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-10-16T01:22:58.050001" elapsed="0.000019"/>
</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-10-16T01:22:58.050340" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:58.050199" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:58.050185" elapsed="0.000228"/>
</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-10-16T01:22:58.050566" elapsed="0.000019"/>
</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-10-16T01:22:58.050769" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:58.050932" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:22:58.050159" elapsed="0.000821"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:22:58.050070" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:58.051151" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:58.051218" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:22:58.051321" 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-10-16T01:22:58.022851" elapsed="0.028494"/>
</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-10-16T01:22:58.052444" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:58.052252" elapsed="0.000252">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:58.052627" 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-10-16T01:22:58.051929" elapsed="0.000721"/>
</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-10-16T01:22:58.052959" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:58.052741" elapsed="0.000271"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:22:58.053455" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:58.053192" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:58.053035" elapsed="0.000476"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:58.052723" elapsed="0.000808"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:58.054057" 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-10-16T01:22:58.053720" elapsed="0.000362"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:22:58.054127" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:22:58.054252" 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-manganese/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-10-16T01:22:58.051604" elapsed="0.002671"/>
</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-10-16T01:22:58.055395" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:58.055192" elapsed="0.000264">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:58.055540" 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-10-16T01:22:58.054874" elapsed="0.000690"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:22:58.055763" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:22:58.055627" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:58.055610" 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-10-16T01:22:58.055992" elapsed="0.000020"/>
</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-10-16T01:22:58.056165" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:58.056224" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:22:58.056348" 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-manganese/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-10-16T01:22:58.054519" elapsed="0.001853"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:58.057791" 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-10-16T01:22:58.057535" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:58.058239" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:58.058021" elapsed="0.000259"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:22:58.062370" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:22:58.062423" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:22:58.062525" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:58.058561" elapsed="0.004361">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:58.058339" elapsed="0.004661">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:58.063181" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:58.063030" elapsed="0.000241"/>
</branch>
<status status="FAIL" start="2026-10-16T01:22:58.058323" elapsed="0.004972">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:58.063645" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:58.063797" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:58.063763" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:58.063745" elapsed="0.000110"/>
</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-10-16T01:22:58.063991" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:22:58.064054" elapsed="0.000013"/>
</return>
<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="FAIL" start="2026-10-16T01:22:58.056836" elapsed="0.007320">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:58.064223" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:22:58.013191" elapsed="0.051157">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:22:58.064772" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:58.064515" elapsed="0.000347"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:58.064467" elapsed="0.000436"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:58.064987" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:22:58.011039" elapsed="0.054113">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:58.007118" elapsed="0.058134">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:22:58.007073" elapsed="0.058253">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:58.065572" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:22:58.065980" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:58.066292" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:22:58.066640" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:22:58.067103" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:58.067416" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:58.067804" elapsed="0.000022"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:22:58.068048" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:22:57.999116" elapsed="0.069032">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:22:58.068210" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:22:57.997250" elapsed="0.071049">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:58.068558" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:58.068416" elapsed="0.000191"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:58.068811" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:58.068629" elapsed="0.000234"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:58.069034" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:58.068885" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:58.068400" elapsed="0.000702"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:22:57.996912" elapsed="0.072228">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:22:57.996471" elapsed="0.072722">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:58.069242" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:22:57.988049" elapsed="0.081284">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:58.069507" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:58.069765" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:58.069584" elapsed="0.000230"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:58.069569" elapsed="0.000267"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:58.069963" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:58.070131" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:58.070188" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:22:57.986250" elapsed="0.084030">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:22:57.985784" elapsed="0.084558">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:22:57.985495" elapsed="0.084895">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:22:57.984750" elapsed="0.085722">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:58.070830" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:22:57.963515" elapsed="0.107425">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:22:59.090180" elapsed="0.000415"/>
</kw>
<msg time="2026-10-16T01:22:59.090771" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:59.088627" elapsed="0.002312"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:22:59.087743" elapsed="0.003357"/>
</kw>
<msg time="2026-10-16T01:22:59.091307" 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-10-16T01:22:59.081021" elapsed="0.010383"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:22:59.080112" elapsed="0.011446"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:59.092661" 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-10-16T01:22:59.092105" elapsed="0.000698"/>
</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-10-16T01:22:59.099792" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:22:59.099005" elapsed="0.000847"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:59.100841" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:59.100192" elapsed="0.000704"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:22:59.100996" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:22:59.101283" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:22:59.098170" elapsed="0.003163"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:22:59.101659" elapsed="0.000332"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:59.103077" 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-10-16T01:22:59.102357" elapsed="0.000776"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:59.104020" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:59.103460" elapsed="0.000613"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:22:59.104924" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:22:59.104380" elapsed="0.000596"/>
</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-10-16T01:22:59.113889" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:22:59.112430" elapsed="0.001571"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:22:59.114128" elapsed="0.000135"/>
</return>
<msg time="2026-10-16T01:22:59.114864" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:22:59.108940" elapsed="0.006066"/>
</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-10-16T01:22:59.139438" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:59.139017" elapsed="0.000457"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:22:59.140478" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:22:59.140174" elapsed="0.000411">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:59.140734" 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-10-16T01:22:59.139727" elapsed="0.001041"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:59.141434" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:59.141006" elapsed="0.000463"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:22:59.141892" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:22:59.142108" 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-10-16T01:22:59.141729" elapsed="0.000412"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:59.142802" 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-10-16T01:22:59.142413" elapsed="0.000446"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:59.144295" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:59.143973" elapsed="0.000379"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:22:59.144999" 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-10-16T01:22:59.144597" elapsed="0.000437"/>
</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-10-16T01:22:59.145433" elapsed="0.000030"/>
</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-10-16T01:22:59.145718" elapsed="0.000034"/>
</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-10-16T01:22:59.145981" elapsed="0.000027"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:22:59.145246" elapsed="0.000806"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:22:59.145094" elapsed="0.000997"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:22:59.146148" elapsed="0.000036"/>
</return>
<msg time="2026-10-16T01:22:59.146327" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:22:59.143462" elapsed="0.002897"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:59.143105" elapsed="0.003294"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:59.146633" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:59.146434" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:59.142921" elapsed="0.003843"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:22:59.147368" 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-10-16T01:22:59.146963" elapsed="0.000431"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:22:59.147438" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:22:59.138291" elapsed="0.009244"/>
</kw>
<msg time="2026-10-16T01:22:59.147583" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:22:59.132620" elapsed="0.015009"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:59.151446" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:59.155304" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:59.159229" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:59.159408" elapsed="0.000019"/>
</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-10-16T01:22:59.159585" elapsed="0.000019"/>
</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-10-16T01:22:59.159994" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:59.159813" elapsed="0.000235"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:59.159800" elapsed="0.000270"/>
</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-10-16T01:22:59.160223" elapsed="0.000019"/>
</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-10-16T01:22:59.160398" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:59.160558" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:22:59.159773" elapsed="0.000834"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:22:59.159654" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:59.160806" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:59.160877" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:22:59.160981" 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-10-16T01:22:59.131804" elapsed="0.029201"/>
</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-10-16T01:22:59.162115" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:59.161922" elapsed="0.000253">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:59.162257" 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-10-16T01:22:59.161569" elapsed="0.000712"/>
</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-10-16T01:22:59.162561" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:59.162344" elapsed="0.000268"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:22:59.163093" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:22:59.162821" elapsed="0.000296"/>
</kw>
<status status="PASS" start="2026-10-16T01:22:59.162635" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:59.162327" elapsed="0.000842"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:22:59.163676" 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-10-16T01:22:59.163324" elapsed="0.000409"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:22:59.163780" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:22:59.163904" 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-manganese/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-10-16T01:22:59.161270" elapsed="0.002657"/>
</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-10-16T01:22:59.166941" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:22:59.164816" elapsed="0.002186">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:22:59.167087" 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-10-16T01:22:59.164472" elapsed="0.002638"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:22:59.167274" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:22:59.167175" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-16T01:22:59.167157" elapsed="0.000193"/>
</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-10-16T01:22:59.167499" elapsed="0.000020"/>
</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-10-16T01:22:59.167670" elapsed="0.000050"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:59.167764" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:22:59.167891" 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-manganese/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-10-16T01:22:59.164174" elapsed="0.003780"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:59.169179" 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-10-16T01:22:59.168952" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:22:59.169628" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:22:59.169407" elapsed="0.000262"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:22:59.173958" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:22:59.174014" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:22:59.174128" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:59.169982" elapsed="0.004549">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:59.169758" elapsed="0.004858">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:59.174827" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:59.174647" elapsed="0.000241"/>
</branch>
<status status="FAIL" start="2026-10-16T01:22:59.169741" elapsed="0.005168">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:22:59.175253" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:59.175372" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:22:59.175340" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:59.175324" elapsed="0.000108"/>
</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-10-16T01:22:59.175568" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:22:59.175631" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:22:59.168232" elapsed="0.007530">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:59.175832" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:22:59.122173" elapsed="0.053784">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:22:59.176346" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:59.176127" elapsed="0.000303"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:59.176079" elapsed="0.000392"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:22:59.176557" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:22:59.119419" elapsed="0.057336">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:22:59.115467" elapsed="0.061426">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:22:59.115424" elapsed="0.061546">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:59.177223" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:22:59.177577" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:59.177932" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:22:59.178285" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:22:59.178757" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:59.179082" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:22:59.179432" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:22:59.179676" elapsed="0.000062"/>
</return>
<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="FAIL" start="2026-10-16T01:22:59.107587" elapsed="0.072237">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:22:59.179885" elapsed="0.000014"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:22:59.105811" elapsed="0.074159">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:59.180187" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:59.180048" elapsed="0.000188"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:59.180394" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:59.180258" elapsed="0.000185"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:59.180604" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:59.180464" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:59.180032" elapsed="0.000640"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:22:59.105435" elapsed="0.075310">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:22:59.105071" elapsed="0.075729">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:59.180847" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:22:59.096822" elapsed="0.084115">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:59.181108" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:59.181324" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:22:59.181186" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:22:59.181171" elapsed="0.000221"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:59.181515" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:59.181683" elapsed="0.000122"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:22:59.181847" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:22:59.094786" elapsed="0.087197">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:22:59.094298" elapsed="0.087748">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:22:59.094050" elapsed="0.088044">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:22:59.093252" elapsed="0.088922">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:22:59.182381" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:22:59.071626" elapsed="0.110859">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:00.201419" elapsed="0.000457"/>
</kw>
<msg time="2026-10-16T01:23:00.201988" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:00.200065" elapsed="0.002036"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:00.199068" elapsed="0.003190"/>
</kw>
<msg time="2026-10-16T01:23:00.202351" 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-10-16T01:23:00.192433" elapsed="0.010009"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:00.191546" elapsed="0.011046"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:00.203863" 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-10-16T01:23:00.203289" elapsed="0.000668"/>
</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-10-16T01:23:00.210484" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:00.209692" elapsed="0.000849"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:00.211559" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:00.210948" elapsed="0.000665"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:00.211751" elapsed="0.000065"/>
</return>
<msg time="2026-10-16T01:23:00.212047" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:00.208911" elapsed="0.003186"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:00.212427" elapsed="0.000340"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:00.213981" 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-10-16T01:23:00.213140" elapsed="0.000896"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:00.214925" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:00.214367" elapsed="0.000611"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:00.215843" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:00.215286" elapsed="0.000638"/>
</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-10-16T01:23:00.224768" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:00.223334" elapsed="0.001647"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:00.225117" elapsed="0.000136"/>
</return>
<msg time="2026-10-16T01:23:00.225684" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:00.220045" elapsed="0.006029"/>
</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-10-16T01:23:00.249538" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:00.249113" elapsed="0.000462"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:00.250563" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:00.250270" elapsed="0.000391">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:00.250823" 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-10-16T01:23:00.249826" elapsed="0.001030"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:00.251520" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:00.251092" elapsed="0.000463"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:00.251982" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:00.252193" 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-10-16T01:23:00.251821" elapsed="0.000405"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:00.252851" 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-10-16T01:23:00.252510" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:00.254163" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:00.253843" elapsed="0.000376"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:00.255046" 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-10-16T01:23:00.254459" elapsed="0.000616"/>
</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-10-16T01:23:00.255365" elapsed="0.000020"/>
</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-10-16T01:23:00.255551" elapsed="0.000022"/>
</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-10-16T01:23:00.255759" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:00.255234" elapsed="0.000579"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:00.255120" elapsed="0.000721"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:00.255883" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:23:00.256013" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:00.253343" elapsed="0.002693"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:00.252995" elapsed="0.003069"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:00.256235" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:00.256091" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:00.252971" elapsed="0.003335"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:00.256888" 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-10-16T01:23:00.256461" elapsed="0.000453"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:00.256964" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:00.248381" elapsed="0.008682"/>
</kw>
<msg time="2026-10-16T01:23:00.257150" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:00.242654" elapsed="0.014544"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:00.261073" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:00.264889" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:00.268674" elapsed="0.000048"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:00.268877" 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-10-16T01:23:00.269067" 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-10-16T01:23:00.269414" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:00.269270" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:00.269256" 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-10-16T01:23:00.269641" elapsed="0.000019"/>
</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-10-16T01:23:00.269844" 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-10-16T01:23:00.270012" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:00.269230" elapsed="0.000830"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:00.269141" elapsed="0.000947"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:00.270239" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:00.270308" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:00.270412" 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-10-16T01:23:00.241828" elapsed="0.028608"/>
</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-10-16T01:23:00.271541" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:00.271348" elapsed="0.000251">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:00.271682" 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-10-16T01:23:00.271025" elapsed="0.000706"/>
</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-10-16T01:23:00.272017" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:00.271797" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:00.272555" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:00.272291" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:00.272130" elapsed="0.000482"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:00.271780" elapsed="0.000852"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:00.273168" 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-10-16T01:23:00.272819" elapsed="0.000373"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:00.273238" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:00.273362" 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-manganese/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-10-16T01:23:00.270724" elapsed="0.002661"/>
</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-10-16T01:23:00.274476" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:00.274275" elapsed="0.000260">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:00.274619" 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-10-16T01:23:00.273957" elapsed="0.000685"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:00.274838" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:23:00.274735" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:00.274689" elapsed="0.000226"/>
</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-10-16T01:23:00.275067" elapsed="0.000020"/>
</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-10-16T01:23:00.275240" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:00.275300" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:00.275424" 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-manganese/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-10-16T01:23:00.273629" elapsed="0.001818"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:00.276893" 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-10-16T01:23:00.276637" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:00.277353" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:00.277128" elapsed="0.000269"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:23:00.281562" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:00.281616" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:00.281760" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:00.277687" elapsed="0.004450">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:00.277457" elapsed="0.004760">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:00.282397" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:00.282247" elapsed="0.000209"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:00.277440" elapsed="0.005038">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:00.282871" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:00.283037" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:00.283004" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:00.282986" elapsed="0.000110"/>
</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-10-16T01:23:00.283232" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:00.283295" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:23:00.275938" elapsed="0.007458">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:00.283464" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:23:00.232073" elapsed="0.051517">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:00.284023" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:00.283803" elapsed="0.000302"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:00.283754" elapsed="0.000393"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:00.284231" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:23:00.229868" elapsed="0.054535">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:00.226537" elapsed="0.057967">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:00.226493" elapsed="0.058084">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:00.284858" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:00.285209" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:00.285521" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:00.285911" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:00.286336" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:00.286649" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:00.287032" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:00.287269" elapsed="0.000019"/>
</return>
<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="FAIL" start="2026-10-16T01:23:00.218664" elapsed="0.068708">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:00.287434" elapsed="0.000017"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:00.216821" elapsed="0.070704">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:00.287784" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:00.287607" elapsed="0.000229"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:00.288034" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:00.287859" elapsed="0.000225"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:00.288249" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:00.288107" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:00.287589" elapsed="0.000728"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:00.216432" elapsed="0.071923">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:00.216051" elapsed="0.072357">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:00.288456" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:00.207508" elapsed="0.081040">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:00.288862" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:00.289093" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:00.288949" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:00.288934" elapsed="0.000227"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:00.289286" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:00.289455" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:00.289512" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:00.205943" elapsed="0.083662">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:00.205448" elapsed="0.084219">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:00.205205" elapsed="0.084540">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:00.204401" elapsed="0.085429">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:00.290041" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:00.183163" elapsed="0.106981">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:01.309081" elapsed="0.000402"/>
</kw>
<msg time="2026-10-16T01:23:01.309594" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:01.307827" elapsed="0.001934"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:01.306884" elapsed="0.003041"/>
</kw>
<msg time="2026-10-16T01:23:01.310016" 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-10-16T01:23:01.300125" elapsed="0.009982"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:01.299238" elapsed="0.011017"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:01.311790" 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-10-16T01:23:01.311196" elapsed="0.000692"/>
</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-10-16T01:23:01.318469" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:01.317678" elapsed="0.000849"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:01.319522" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:01.318917" elapsed="0.000659"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:01.319674" elapsed="0.000116"/>
</return>
<msg time="2026-10-16T01:23:01.320029" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:01.316898" elapsed="0.003182"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:01.320410" elapsed="0.000284"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:01.321974" 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-10-16T01:23:01.321243" elapsed="0.000787"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:01.322916" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:01.322352" elapsed="0.000618"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:01.323886" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:01.323278" elapsed="0.000663"/>
</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-10-16T01:23:01.332678" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:01.331268" elapsed="0.001699"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:01.333097" elapsed="0.000137"/>
</return>
<msg time="2026-10-16T01:23:01.333668" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:01.327973" elapsed="0.006014"/>
</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-10-16T01:23:01.358615" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:01.358194" elapsed="0.000457"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:01.359636" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:01.359343" elapsed="0.000426">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:01.359888" 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-10-16T01:23:01.358903" elapsed="0.001016"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:01.360580" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:01.360154" elapsed="0.000461"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:01.361036" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:01.361244" 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-10-16T01:23:01.360878" elapsed="0.000399"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:01.361892" 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-10-16T01:23:01.361543" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:01.363396" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:01.362893" elapsed="0.000561"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:01.364144" 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-10-16T01:23:01.363696" elapsed="0.000482"/>
</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-10-16T01:23:01.364572" elapsed="0.000028"/>
</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-10-16T01:23:01.364863" elapsed="0.000032"/>
</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-10-16T01:23:01.365148" elapsed="0.000033"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:01.364393" elapsed="0.000844"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:01.364240" elapsed="0.001044"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:01.365352" elapsed="0.000032"/>
</return>
<msg time="2026-10-16T01:23:01.365492" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:01.362379" elapsed="0.003135"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:01.362035" elapsed="0.003508"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:01.365743" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:01.365568" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:01.362011" elapsed="0.003805"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:01.366360" 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-10-16T01:23:01.365970" elapsed="0.000416"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:01.366429" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:01.357461" elapsed="0.009066"/>
</kw>
<msg time="2026-10-16T01:23:01.366573" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:01.351795" elapsed="0.014823"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:01.370436" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:01.374228" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:01.378026" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:01.378202" elapsed="0.000020"/>
</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-10-16T01:23:01.378377" elapsed="0.000019"/>
</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-10-16T01:23:01.378740" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:01.378572" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:01.378559" elapsed="0.000256"/>
</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-10-16T01:23:01.378968" elapsed="0.000019"/>
</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-10-16T01:23:01.379141" elapsed="0.000018"/>
</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-10-16T01:23:01.379336" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:01.378533" elapsed="0.000853"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:01.378446" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:01.379562" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:01.379630" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:01.379763" 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-10-16T01:23:01.350935" elapsed="0.028853"/>
</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-10-16T01:23:01.380888" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:01.380667" elapsed="0.000281">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:01.381030" 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-10-16T01:23:01.380350" elapsed="0.000702"/>
</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-10-16T01:23:01.381330" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:01.381115" elapsed="0.000267"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:01.381859" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:01.381562" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:01.381405" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:01.381098" elapsed="0.000837"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:01.382426" 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-10-16T01:23:01.382091" elapsed="0.000359"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:01.382495" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:01.382617" 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-manganese/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-10-16T01:23:01.380054" elapsed="0.002586"/>
</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-10-16T01:23:01.383760" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:01.383531" elapsed="0.000290">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:01.383906" 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-10-16T01:23:01.383217" elapsed="0.000712"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:01.384093" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:23:01.383993" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:01.383976" elapsed="0.000193"/>
</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-10-16T01:23:01.384320" elapsed="0.000019"/>
</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-10-16T01:23:01.384492" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:01.384550" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:23:01.384674" 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-manganese/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-10-16T01:23:01.382917" elapsed="0.001780"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:01.386119" 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-10-16T01:23:01.385893" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:01.386613" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:01.386391" elapsed="0.000262"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:23:01.390993" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:01.391052" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:01.391156" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:01.386967" elapsed="0.004578">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:01.386742" elapsed="0.004885">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:01.391841" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:01.391657" elapsed="0.000244"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:01.386696" elapsed="0.005228">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:01.392266" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:01.392385" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:01.392352" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:01.392336" elapsed="0.000107"/>
</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-10-16T01:23:01.392577" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:01.392639" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:23:01.385164" elapsed="0.007608">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:01.392842" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:23:01.341071" elapsed="0.051897">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:01.393357" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:01.393136" elapsed="0.000304"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:01.393088" elapsed="0.000392"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:01.393564" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:23:01.338411" elapsed="0.055354">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:01.334452" elapsed="0.059419">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:01.334408" elapsed="0.059538">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:01.394203" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:01.394589" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:01.394946" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:01.395304" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:01.395773" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:01.396089" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:01.396437" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:01.396675" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:23:01.326590" elapsed="0.070239">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:01.396890" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:01.324792" elapsed="0.072186">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:01.397199" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:01.397058" elapsed="0.000191"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:01.397407" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:01.397271" elapsed="0.000184"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:01.397618" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:01.397477" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:01.397042" elapsed="0.000644"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:01.324409" elapsed="0.073462">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:01.324038" elapsed="0.073890">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:01.397977" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:01.315480" elapsed="0.082589">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:01.398244" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:01.398463" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:01.398322" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:01.398307" elapsed="0.000224"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:01.398655" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:01.399029" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:01.399091" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:01.313895" elapsed="0.085288">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:01.313395" elapsed="0.085850">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:01.313146" elapsed="0.086200">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:01.312336" elapsed="0.087094">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:01.399643" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:01.290847" elapsed="0.108976">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:02.420185" elapsed="0.000467"/>
</kw>
<msg time="2026-10-16T01:23:02.420842" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:02.418840" elapsed="0.002135"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:02.417560" elapsed="0.003576"/>
</kw>
<msg time="2026-10-16T01:23:02.421225" 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-10-16T01:23:02.410782" elapsed="0.010529"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:02.409848" elapsed="0.011608"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:02.422518" 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-10-16T01:23:02.421999" elapsed="0.000611"/>
</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-10-16T01:23:02.429861" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:02.428998" elapsed="0.000921"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:02.430931" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:02.430259" elapsed="0.000727"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:02.431085" elapsed="0.000066"/>
</return>
<msg time="2026-10-16T01:23:02.431383" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:02.428069" elapsed="0.003369"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:02.431830" elapsed="0.000289"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:02.433244" 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-10-16T01:23:02.432517" elapsed="0.000782"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:02.434187" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:02.433622" elapsed="0.000618"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:02.435137" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:02.434582" elapsed="0.000607"/>
</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-10-16T01:23:02.444230" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:02.442843" elapsed="0.001496"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:02.444469" elapsed="0.000136"/>
</return>
<msg time="2026-10-16T01:23:02.445150" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:02.439353" elapsed="0.005925"/>
</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-10-16T01:23:02.470327" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:02.469716" elapsed="0.000649"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:02.471402" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:02.471077" elapsed="0.000434">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:02.471631" 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-10-16T01:23:02.470588" elapsed="0.001075"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:02.472488" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:02.472043" elapsed="0.000481"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:02.472962" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:02.473179" 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-10-16T01:23:02.472796" elapsed="0.000417"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:02.473836" 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-10-16T01:23:02.473484" elapsed="0.000410"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:02.475434" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:02.475073" elapsed="0.000431"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:02.476315" 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-10-16T01:23:02.476042" 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-10-16T01:23:02.476645" elapsed="0.000020"/>
</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-10-16T01:23:02.476864" 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-10-16T01:23:02.477047" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:02.476512" elapsed="0.000587"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:02.476390" elapsed="0.000740"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:02.477173" elapsed="0.000030"/>
</return>
<msg time="2026-10-16T01:23:02.477309" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:02.474542" elapsed="0.002790"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:02.474174" elapsed="0.003186"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:02.477529" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:02.477387" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:02.473961" elapsed="0.003638"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:02.478191" 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-10-16T01:23:02.477784" elapsed="0.000432"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:02.478262" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:02.468995" elapsed="0.009390"/>
</kw>
<msg time="2026-10-16T01:23:02.478445" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:02.463271" elapsed="0.015223"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:02.482388" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:02.486325" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:02.490139" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:02.490328" 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-10-16T01:23:02.490506" elapsed="0.000019"/>
</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-10-16T01:23:02.490882" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:02.490738" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:02.490690" 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-10-16T01:23:02.491127" 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-10-16T01:23:02.491302" 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-10-16T01:23:02.491503" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:02.490665" elapsed="0.000888"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:02.490575" elapsed="0.001000"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:02.491777" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:02.491849" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:02.491954" 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-10-16T01:23:02.462349" elapsed="0.029628"/>
</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-10-16T01:23:02.493137" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:02.492908" elapsed="0.000290">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:02.493280" 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-10-16T01:23:02.492557" 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-10-16T01:23:02.493583" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:02.493365" elapsed="0.000270"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:02.494142" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:02.493863" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:02.493657" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:02.493348" elapsed="0.000870"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:02.494747" 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-10-16T01:23:02.494376" elapsed="0.000445"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:02.494869" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:23:02.494994" 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-manganese/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-10-16T01:23:02.492260" elapsed="0.002757"/>
</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-10-16T01:23:02.498229" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:02.495946" elapsed="0.002350">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:02.498402" 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-10-16T01:23:02.495599" elapsed="0.002831"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:02.498606" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:23:02.498505" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:02.498488" elapsed="0.000195"/>
</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-10-16T01:23:02.498865" 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-10-16T01:23:02.499039" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:02.499101" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:02.499226" 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-manganese/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-10-16T01:23:02.495266" elapsed="0.003983"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:02.500472" 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-10-16T01:23:02.500246" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:02.500952" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:02.500716" elapsed="0.000276"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:23:02.505327" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:02.505384" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:02.505500" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:02.501275" elapsed="0.004668">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:02.501051" elapsed="0.004977">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:02.506209" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:02.506059" elapsed="0.000208"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:02.501035" elapsed="0.005254">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:02.506638" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:02.506789" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:02.506755" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:02.506737" elapsed="0.000110"/>
</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-10-16T01:23:02.506982" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:02.507077" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:23:02.499525" elapsed="0.007659">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:02.507250" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:23:02.452141" elapsed="0.055255">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:02.507824" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:02.507568" elapsed="0.000345"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:02.507520" elapsed="0.000480"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:02.508088" elapsed="0.000038"/>
</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="FAIL" start="2026-10-16T01:23:02.449830" elapsed="0.058429">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:02.445977" elapsed="0.062384">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:02.445929" elapsed="0.062505">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:02.508683" elapsed="0.000054"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:02.509073" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:02.509388" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:02.509787" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:02.510227" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:02.510544" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:02.510939" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:02.511180" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:23:02.438009" elapsed="0.073271">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:02.511341" elapsed="0.000014"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:02.436047" elapsed="0.075381">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:02.511646" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:02.511507" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:02.511899" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:02.511760" elapsed="0.000188"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:02.512110" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:02.511969" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:02.511492" elapsed="0.000757"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:02.435655" elapsed="0.076638">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:02.435286" elapsed="0.077062">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:02.512396" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:02.426434" elapsed="0.086054">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:02.512666" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:02.513029" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:02.512885" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:02.512868" elapsed="0.000230"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:02.513222" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:02.513388" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:02.513446" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:02.424792" elapsed="0.088746">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:02.424239" elapsed="0.089361">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:02.423979" elapsed="0.089669">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:02.423139" elapsed="0.090629">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:02.513981" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:02.400777" elapsed="0.113308">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:03.535008" elapsed="0.000487"/>
</kw>
<msg time="2026-10-16T01:23:03.535643" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:03.533614" elapsed="0.002225"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:03.532649" elapsed="0.003363"/>
</kw>
<msg time="2026-10-16T01:23:03.536104" 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-10-16T01:23:03.525558" elapsed="0.010637"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:03.524604" elapsed="0.011738"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:03.537567" 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-10-16T01:23:03.536913" elapsed="0.000746"/>
</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-10-16T01:23:03.544663" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:03.543900" elapsed="0.000905"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:03.545816" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:03.545154" elapsed="0.000719"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:03.545974" elapsed="0.000067"/>
</return>
<msg time="2026-10-16T01:23:03.546277" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:03.543039" elapsed="0.003289"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:03.546659" elapsed="0.000350"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:03.548110" 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-10-16T01:23:03.547380" elapsed="0.000786"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:03.549064" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:03.548494" elapsed="0.000649"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:03.550135" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:03.549544" elapsed="0.000645"/>
</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-10-16T01:23:03.559397" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:03.557952" elapsed="0.001557"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:03.559639" elapsed="0.000226"/>
</return>
<msg time="2026-10-16T01:23:03.560309" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:03.554474" elapsed="0.005915"/>
</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-10-16T01:23:03.583235" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:03.582806" elapsed="0.000466"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:03.584367" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:03.584025" elapsed="0.000485">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:03.584636" 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-10-16T01:23:03.583490" elapsed="0.001178"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:03.585386" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:03.584949" elapsed="0.000473"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:03.585862" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:03.586093" 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-10-16T01:23:03.585651" elapsed="0.000483"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:03.586715" 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-10-16T01:23:03.586470" elapsed="0.000321"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:03.587695" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:03.587465" elapsed="0.000301"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:03.588380" 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-10-16T01:23:03.587944" elapsed="0.000461"/>
</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-10-16T01:23:03.588725" elapsed="0.000034"/>
</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-10-16T01:23:03.588930" elapsed="0.000022"/>
</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-10-16T01:23:03.589157" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:03.588570" elapsed="0.000641"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:03.588450" elapsed="0.000794"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:03.589289" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:03.589419" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:03.587119" elapsed="0.002324"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:03.586858" elapsed="0.002614"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:03.589645" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:03.589501" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:03.586840" elapsed="0.002911"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:03.590336" 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-10-16T01:23:03.589917" elapsed="0.000445"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:03.590407" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:03.582067" elapsed="0.008439"/>
</kw>
<msg time="2026-10-16T01:23:03.590555" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:03.576372" elapsed="0.014230"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:03.594474" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:03.598340" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:03.602316" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:03.602502" elapsed="0.000019"/>
</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-10-16T01:23:03.602679" elapsed="0.000036"/>
</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-10-16T01:23:03.603057" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:03.602913" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:03.602900" 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-10-16T01:23:03.603284" elapsed="0.000019"/>
</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-10-16T01:23:03.603459" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:03.603617" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:03.602874" elapsed="0.000791"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:03.602783" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:03.603916" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:03.603986" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:23:03.604092" 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-10-16T01:23:03.575477" elapsed="0.028638"/>
</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-10-16T01:23:03.605235" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:03.605040" elapsed="0.000255">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:03.605379" 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-10-16T01:23:03.604686" elapsed="0.000716"/>
</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-10-16T01:23:03.605682" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:03.605466" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:03.606219" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:03.605951" elapsed="0.000292"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:03.605788" elapsed="0.000487"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:03.605449" elapsed="0.000846"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:03.606819" 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-10-16T01:23:03.606451" elapsed="0.000392"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:03.606889" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:23:03.607011" 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-manganese/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-10-16T01:23:03.604387" elapsed="0.002647"/>
</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-10-16T01:23:03.608120" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:03.607929" elapsed="0.000250">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:03.608264" 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-10-16T01:23:03.607582" elapsed="0.000704"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:03.608451" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:23:03.608350" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:03.608333" elapsed="0.000197"/>
</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-10-16T01:23:03.608683" 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-10-16T01:23:03.608911" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:03.608972" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:23:03.609099" 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-manganese/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-10-16T01:23:03.607283" elapsed="0.001844"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:03.610548" 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-10-16T01:23:03.610322" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:03.611029" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:03.610807" elapsed="0.000263"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:23:03.615968" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:03.616067" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:03.616180" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:03.611353" elapsed="0.005291">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:03.611129" elapsed="0.005631">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:03.616945" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:03.616793" elapsed="0.000211"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:03.611113" elapsed="0.005914">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:03.617378" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:03.617497" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:03.617465" elapsed="0.000069"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:03.617449" elapsed="0.000105"/>
</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-10-16T01:23:03.617690" elapsed="0.000036"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:03.617780" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:23:03.609585" elapsed="0.008303">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:03.617955" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:23:03.565590" elapsed="0.052491">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:03.618482" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:03.618256" elapsed="0.000310"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:03.618208" elapsed="0.000400"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:03.618693" elapsed="0.000075"/>
</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="FAIL" start="2026-10-16T01:23:03.563242" elapsed="0.055660">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:03.560746" elapsed="0.058256">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:03.560676" elapsed="0.058399">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:03.619330" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:03.619682" elapsed="0.000040"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:03.620063" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:03.620423" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:03.620986" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:03.621312" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:03.621662" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:03.621932" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:23:03.553109" elapsed="0.068926">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:03.622097" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:03.551054" elapsed="0.071131">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:03.622406" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:03.622264" elapsed="0.000193"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:03.622619" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:03.622480" elapsed="0.000188"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:03.622878" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:03.622689" elapsed="0.000238"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:03.622248" elapsed="0.000700"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:03.550660" elapsed="0.072326">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:03.550284" elapsed="0.072756">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:03.623089" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:03.541456" elapsed="0.081723">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:03.623356" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:03.623576" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:03.623434" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:03.623419" elapsed="0.000226"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:03.623813" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:03.623987" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:03.624046" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:03.539828" elapsed="0.084311">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:03.539282" elapsed="0.084920">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:03.539007" elapsed="0.085244">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:03.538178" elapsed="0.086158">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:03.624595" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:03.515109" elapsed="0.109609">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:04.643984" elapsed="0.000399"/>
</kw>
<msg time="2026-10-16T01:23:04.644493" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:04.642670" elapsed="0.001933"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:04.641782" elapsed="0.003152"/>
</kw>
<msg time="2026-10-16T01:23:04.645036" 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-10-16T01:23:04.634971" elapsed="0.010160"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:04.634086" elapsed="0.011196"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:04.646337" 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-10-16T01:23:04.645818" elapsed="0.000613"/>
</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-10-16T01:23:04.653161" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:04.652371" elapsed="0.000849"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:04.654215" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:04.653551" elapsed="0.000717"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:04.654361" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:23:04.654648" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:04.651533" elapsed="0.003197"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:04.655084" elapsed="0.000286"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:04.656454" 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-10-16T01:23:04.655785" elapsed="0.000724"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:04.657396" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:04.656892" elapsed="0.000557"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:04.658306" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:04.657809" elapsed="0.000550"/>
</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-10-16T01:23:04.667159" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:04.665759" elapsed="0.001511"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:04.667397" elapsed="0.000136"/>
</return>
<msg time="2026-10-16T01:23:04.668048" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:04.662348" elapsed="0.005829"/>
</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-10-16T01:23:04.691604" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:04.691179" elapsed="0.000461"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:04.692730" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:04.692423" elapsed="0.000423">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:04.692967" 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-10-16T01:23:04.691970" elapsed="0.001031"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:04.693678" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:04.693243" elapsed="0.000492"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:04.694144" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:04.694342" 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-10-16T01:23:04.693983" elapsed="0.000392"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:04.694993" 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-10-16T01:23:04.694643" elapsed="0.000407"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:04.696600" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:04.696034" elapsed="0.000607"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:04.697113" 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-10-16T01:23:04.696847" 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-10-16T01:23:04.697426" 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-10-16T01:23:04.697610" elapsed="0.000022"/>
</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-10-16T01:23:04.697822" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:04.697297" elapsed="0.000579"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:04.697180" elapsed="0.000723"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:04.697944" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:04.698072" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:04.695485" elapsed="0.002610"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:04.695135" elapsed="0.002989"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:04.698293" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:04.698148" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:04.695112" elapsed="0.003250"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:04.698945" 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-10-16T01:23:04.698517" elapsed="0.000453"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:04.699014" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:04.690444" elapsed="0.008669"/>
</kw>
<msg time="2026-10-16T01:23:04.699161" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:04.684804" elapsed="0.014404"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:04.703025" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:04.706824" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:04.710627" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:04.710833" elapsed="0.000020"/>
</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-10-16T01:23:04.711013" elapsed="0.000019"/>
</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-10-16T01:23:04.711353" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:04.711211" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:04.711197" elapsed="0.000228"/>
</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-10-16T01:23:04.711588" elapsed="0.000019"/>
</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-10-16T01:23:04.711791" 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-10-16T01:23:04.711955" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:04.711171" elapsed="0.000831"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:04.711081" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:04.712260" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:04.712329" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:04.712433" 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-10-16T01:23:04.683951" elapsed="0.028506"/>
</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-10-16T01:23:04.713568" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:04.713376" elapsed="0.000252">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:04.713735" 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-10-16T01:23:04.713056" elapsed="0.000718"/>
</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-10-16T01:23:04.714060" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:04.713838" elapsed="0.000274"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:04.714555" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:04.714292" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:04.714135" elapsed="0.000475"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:04.713821" elapsed="0.000808"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:04.715155" 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-10-16T01:23:04.714819" elapsed="0.000360"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:04.715223" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:04.715345" 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-manganese/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-10-16T01:23:04.712756" elapsed="0.002613"/>
</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-10-16T01:23:04.716492" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:04.716302" elapsed="0.000249">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:04.716635" 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-10-16T01:23:04.715984" elapsed="0.000673"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:04.716854" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:23:04.716737" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:04.716719" elapsed="0.000213"/>
</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-10-16T01:23:04.717084" elapsed="0.000020"/>
</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-10-16T01:23:04.717255" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:04.717315" elapsed="0.000013"/>
</return>
<msg time="2026-10-16T01:23:04.717437" 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-manganese/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-10-16T01:23:04.715654" elapsed="0.001806"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:04.718886" 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-10-16T01:23:04.718626" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:04.719330" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:04.719115" elapsed="0.000255"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:23:04.723724" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:04.723793" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:04.723895" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:04.719651" elapsed="0.004616">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:04.719429" elapsed="0.004916">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:04.724525" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:04.724376" elapsed="0.000206"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:04.719413" elapsed="0.005191">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:04.724967" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:04.725086" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:04.725054" elapsed="0.000069"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:04.725038" elapsed="0.000105"/>
</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-10-16T01:23:04.725275" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:04.725336" elapsed="0.000013"/>
</return>
<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="FAIL" start="2026-10-16T01:23:04.717933" elapsed="0.007504">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:04.725535" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:23:04.674157" elapsed="0.051508">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:04.726253" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:04.726030" elapsed="0.000305"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:04.725981" elapsed="0.000395"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:04.726459" elapsed="0.000037"/>
</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="FAIL" start="2026-10-16T01:23:04.671903" elapsed="0.054722">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:04.668642" elapsed="0.058110">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:04.668598" elapsed="0.058231">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:04.727077" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:04.727424" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:04.727808" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:04.728163" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:04.728599" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:04.728951" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:04.729304" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:04.729547" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:23:04.661032" elapsed="0.068616">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:04.729734" elapsed="0.000032"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:04.659208" elapsed="0.070636">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:04.730063" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:04.729923" elapsed="0.000190"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:04.730270" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:04.730135" elapsed="0.000183"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:04.730479" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:04.730340" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:04.729907" elapsed="0.000640"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:04.658876" elapsed="0.071708">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:04.658453" elapsed="0.072185">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:04.730685" elapsed="0.000157"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:04.650171" elapsed="0.080791">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:04.731141" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:04.731360" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:04.731219" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:04.731204" elapsed="0.000225"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:04.731554" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:04.731739" elapsed="0.000034"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:04.731814" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:04.648431" elapsed="0.083476">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:04.647997" elapsed="0.083971">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:04.647693" elapsed="0.084324">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:04.646923" elapsed="0.085175">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:04.732306" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:04.625355" elapsed="0.107053">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:05.752149" elapsed="0.000427"/>
</kw>
<msg time="2026-10-16T01:23:05.752693" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:05.750804" elapsed="0.002066"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:05.749523" elapsed="0.003512"/>
</kw>
<msg time="2026-10-16T01:23:05.753128" 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-10-16T01:23:05.742569" elapsed="0.010655"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:05.741731" elapsed="0.011648"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:05.754487" 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-10-16T01:23:05.753939" elapsed="0.000646"/>
</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-10-16T01:23:05.761655" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:05.760870" elapsed="0.000877"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:05.762818" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:05.762122" elapsed="0.000757"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:05.763076" elapsed="0.000069"/>
</return>
<msg time="2026-10-16T01:23:05.763393" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:05.759978" elapsed="0.003471"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:05.763854" elapsed="0.000310"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:05.765329" 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-10-16T01:23:05.764557" elapsed="0.000831"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:05.766337" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:05.765792" elapsed="0.000601"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:05.767333" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:05.766786" elapsed="0.000604"/>
</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-10-16T01:23:05.776802" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:05.775241" elapsed="0.001683"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:05.777060" elapsed="0.000147"/>
</return>
<msg time="2026-10-16T01:23:05.777664" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:05.771623" elapsed="0.006243"/>
</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-10-16T01:23:05.802784" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:05.802326" elapsed="0.000496"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:05.803817" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:05.803478" elapsed="0.000439">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:05.804034" 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-10-16T01:23:05.803037" elapsed="0.001029"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:05.804768" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:05.804300" elapsed="0.000505"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:05.805191" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:05.805395" 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-10-16T01:23:05.805032" elapsed="0.000396"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:05.806042" 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-10-16T01:23:05.805694" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:05.807527" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:05.807206" elapsed="0.000378"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:05.808219" 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-10-16T01:23:05.807861" elapsed="0.000391"/>
</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-10-16T01:23:05.808641" elapsed="0.000029"/>
</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-10-16T01:23:05.808932" elapsed="0.000033"/>
</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-10-16T01:23:05.809186" elapsed="0.000023"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:05.808465" elapsed="0.000775"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:05.808311" elapsed="0.000956"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:05.809306" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:05.809474" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:05.806695" elapsed="0.002803"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:05.806343" elapsed="0.003183"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:05.809693" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:05.809550" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:05.806163" elapsed="0.003630"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:05.810350" 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-10-16T01:23:05.809950" elapsed="0.000425"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:05.810419" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:05.801596" elapsed="0.008921"/>
</kw>
<msg time="2026-10-16T01:23:05.810565" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:05.795960" elapsed="0.014650"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:05.814405" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:05.818195" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:05.822046" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:05.822222" elapsed="0.000019"/>
</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-10-16T01:23:05.822397" elapsed="0.000019"/>
</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-10-16T01:23:05.822747" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:05.822592" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:05.822579" 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-10-16T01:23:05.822984" elapsed="0.000019"/>
</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-10-16T01:23:05.823156" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:05.823316" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:05.822553" elapsed="0.000812"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:05.822465" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:05.823537" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:05.823603" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:05.823722" 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-10-16T01:23:05.795103" elapsed="0.028644"/>
</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-10-16T01:23:05.824897" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:05.824678" elapsed="0.000278">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:05.825038" 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-10-16T01:23:05.824356" elapsed="0.000704"/>
</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-10-16T01:23:05.825346" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:05.825123" elapsed="0.000274"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:05.825867" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:05.825576" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:05.825420" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:05.825106" elapsed="0.000838"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:05.826434" 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-10-16T01:23:05.826100" elapsed="0.000358"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:05.826503" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:05.826626" 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-manganese/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-10-16T01:23:05.824058" elapsed="0.002590"/>
</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-10-16T01:23:05.829926" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:05.827537" elapsed="0.002450">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:05.830072" 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-10-16T01:23:05.827223" elapsed="0.002871"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:05.830259" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:23:05.830159" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:05.830142" elapsed="0.000192"/>
</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-10-16T01:23:05.830485" elapsed="0.000020"/>
</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-10-16T01:23:05.830656" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:05.830731" elapsed="0.000016"/>
</return>
<msg time="2026-10-16T01:23:05.830872" 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-manganese/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-10-16T01:23:05.826924" elapsed="0.003971"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:05.832123" 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-10-16T01:23:05.831886" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:05.832588" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:05.832369" elapsed="0.000259"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:23:05.836873" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:05.836928" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:05.837075" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:05.832948" elapsed="0.004521">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:05.832687" elapsed="0.004861">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:05.837745" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:05.837579" elapsed="0.000237"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:05.832670" elapsed="0.005168">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:05.838174" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:05.838299" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:05.838261" elapsed="0.000075"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:05.838244" elapsed="0.000112"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:05.838492" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:05.838555" elapsed="0.000013"/>
</return>
<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="FAIL" start="2026-10-16T01:23:05.831169" elapsed="0.007488">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:05.838742" elapsed="0.000027"/>
</return>
<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="FAIL" start="2026-10-16T01:23:05.785503" elapsed="0.053379">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:05.839273" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:05.839054" elapsed="0.000301"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:05.839005" elapsed="0.000391"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:05.839480" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:23:05.782808" elapsed="0.056836">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:05.778372" elapsed="0.061409">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:05.778327" elapsed="0.061530">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:05.840104" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:05.840450" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:05.840792" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:05.841151" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:05.841585" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:05.841942" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:05.842295" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:05.842599" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:23:05.770224" elapsed="0.072514">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:05.842814" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:05.768289" elapsed="0.074614">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:05.843121" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:05.842983" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:05.843329" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:05.843194" elapsed="0.000185"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:05.843541" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:05.843400" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:05.842967" elapsed="0.000642"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:05.767937" elapsed="0.075710">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:05.767489" elapsed="0.076236">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:05.843788" elapsed="0.000016"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:05.758475" elapsed="0.085407">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:05.844055" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:05.844271" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:05.844133" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:05.844117" elapsed="0.000222"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:05.844461" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:05.844625" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:05.844683" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:05.756670" elapsed="0.088229">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:05.756201" elapsed="0.088760">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:05.755945" elapsed="0.089064">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:05.755106" elapsed="0.089982">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:05.845321" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:05.733100" elapsed="0.112326">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:06.865163" elapsed="0.000414"/>
</kw>
<msg time="2026-10-16T01:23:06.865687" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:06.863903" elapsed="0.001951"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:06.862618" elapsed="0.003399"/>
</kw>
<msg time="2026-10-16T01:23:06.866111" 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-10-16T01:23:06.855667" elapsed="0.010535"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:06.854795" elapsed="0.011562"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:06.867404" 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-10-16T01:23:06.866883" elapsed="0.000613"/>
</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-10-16T01:23:06.874165" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:06.873368" elapsed="0.000856"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:06.875238" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:06.874564" elapsed="0.000730"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:06.875390" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:23:06.875681" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:06.872517" elapsed="0.003274"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:06.876130" elapsed="0.000295"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:06.877585" 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-10-16T01:23:06.876867" elapsed="0.000808"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:06.878663" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:06.878144" elapsed="0.000606"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:06.879589" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:06.879089" elapsed="0.000553"/>
</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-10-16T01:23:06.888495" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:06.887115" elapsed="0.001487"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:06.888800" elapsed="0.000140"/>
</return>
<msg time="2026-10-16T01:23:06.889367" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:06.883843" elapsed="0.005651"/>
</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-10-16T01:23:06.913726" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:06.913278" elapsed="0.000502"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:06.914797" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:06.914439" elapsed="0.000461">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:06.915019" 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-10-16T01:23:06.913998" elapsed="0.001053"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:06.915850" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:06.915370" elapsed="0.000517"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:06.916277" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:06.916490" 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-10-16T01:23:06.916116" elapsed="0.000408"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:06.917138" 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-10-16T01:23:06.916825" elapsed="0.000374"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:06.918537" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:06.918159" elapsed="0.000449"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:06.919229" 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-10-16T01:23:06.918829" elapsed="0.000425"/>
</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-10-16T01:23:06.919541" 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-10-16T01:23:06.919742" elapsed="0.000037"/>
</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-10-16T01:23:06.919941" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:06.919412" elapsed="0.000581"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:06.919299" elapsed="0.000722"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:06.920061" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:06.920190" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:06.917637" elapsed="0.002576"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:06.917286" elapsed="0.002955"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:06.920415" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:06.920266" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:06.917262" elapsed="0.003223"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:06.921074" 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-10-16T01:23:06.920639" elapsed="0.000461"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:06.921144" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:06.912551" elapsed="0.008694"/>
</kw>
<msg time="2026-10-16T01:23:06.921293" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:06.906881" elapsed="0.014458"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:06.925160" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:06.929089" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:06.932896" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:06.933108" 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-10-16T01:23:06.933288" elapsed="0.000019"/>
</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-10-16T01:23:06.933632" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:06.933489" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:06.933475" elapsed="0.000245"/>
</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-10-16T01:23:06.933890" elapsed="0.000019"/>
</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-10-16T01:23:06.934066" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:06.934225" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:06.933449" elapsed="0.000824"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:06.933358" elapsed="0.000939"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:06.934454" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:06.934523" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:23:06.934628" 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-10-16T01:23:06.906015" elapsed="0.028637"/>
</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-10-16T01:23:06.935793" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:06.935570" elapsed="0.000284">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:06.935938" 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-10-16T01:23:06.935245" elapsed="0.000716"/>
</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-10-16T01:23:06.936239" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:06.936024" elapsed="0.000270"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:06.936757" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:06.936478" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:06.936320" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:06.936007" elapsed="0.000840"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:06.937340" 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-10-16T01:23:06.937007" elapsed="0.000357"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:06.937408" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:06.937531" 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-manganese/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-10-16T01:23:06.934949" elapsed="0.002605"/>
</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-10-16T01:23:06.938635" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:06.938445" elapsed="0.000249">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:06.938810" 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-10-16T01:23:06.938129" elapsed="0.000704"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:06.939042" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:23:06.938940" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:06.938921" elapsed="0.000199"/>
</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-10-16T01:23:06.939272" elapsed="0.000020"/>
</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-10-16T01:23:06.939445" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:06.939506" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:06.939631" 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-manganese/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-10-16T01:23:06.937831" elapsed="0.001823"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:06.941085" 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-10-16T01:23:06.940857" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:06.941536" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:06.941315" elapsed="0.000262"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:23:06.945896" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:06.945952" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:06.946056" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:06.941893" elapsed="0.004573">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:06.941637" elapsed="0.004913">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:06.946747" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:06.946580" elapsed="0.000239"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:06.941620" elapsed="0.005220">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:06.947182" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:06.947300" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:06.947267" elapsed="0.000073"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:06.947251" elapsed="0.000112"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:06.947497" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:06.947559" elapsed="0.000013"/>
</return>
<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="FAIL" start="2026-10-16T01:23:06.940133" elapsed="0.007528">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:06.947745" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:23:06.896065" elapsed="0.051823">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:06.948278" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:06.948059" elapsed="0.000338"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:06.948011" elapsed="0.000428"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:06.948524" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:23:06.893919" elapsed="0.054770">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:06.890215" elapsed="0.058617">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:06.890171" elapsed="0.058737">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:06.949160" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:06.949513" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:06.949861" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:06.950223" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:06.950662" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:06.951024" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:06.951380" elapsed="0.000019"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:06.951623" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:23:06.882452" elapsed="0.069308">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:06.951838" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:06.880524" elapsed="0.071403">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:06.952148" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:06.952007" elapsed="0.000190"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:06.952380" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:06.952219" elapsed="0.000211"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:06.952593" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:06.952451" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:06.951991" elapsed="0.000670"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:06.880163" elapsed="0.072560">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:06.879790" elapsed="0.073004">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:06.952844" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:06.871113" elapsed="0.081858">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:06.953148" elapsed="0.000087"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:06.953446" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:06.953301" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:06.953285" elapsed="0.000230"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:06.953641" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:06.953941" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:06.954003" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:06.869482" elapsed="0.084616">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:06.869032" elapsed="0.085129">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:06.868761" elapsed="0.085449">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:06.867993" elapsed="0.086300">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:06.954501" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:06.846067" elapsed="0.108537">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:07.973738" elapsed="0.000422"/>
</kw>
<msg time="2026-10-16T01:23:07.974266" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:07.972465" elapsed="0.001908"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:07.971529" elapsed="0.002996"/>
</kw>
<msg time="2026-10-16T01:23:07.974614" 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-10-16T01:23:07.964644" elapsed="0.010088"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:07.963826" elapsed="0.011082"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:07.975936" 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-10-16T01:23:07.975374" elapsed="0.000653"/>
</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-10-16T01:23:07.982985" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:07.982186" elapsed="0.000856"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:07.984029" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:07.983373" elapsed="0.000709"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:07.984175" elapsed="0.000060"/>
</return>
<msg time="2026-10-16T01:23:07.984458" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:07.981123" elapsed="0.003385"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:07.984885" elapsed="0.000292"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:07.986386" 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-10-16T01:23:07.985542" elapsed="0.000900"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:07.987372" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:07.986828" elapsed="0.000598"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:07.988302" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:07.987769" elapsed="0.000587"/>
</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-10-16T01:23:07.997309" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:07.995895" elapsed="0.001524"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:07.997547" elapsed="0.000136"/>
</return>
<msg time="2026-10-16T01:23:07.998198" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:07.992491" elapsed="0.005834"/>
</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-10-16T01:23:08.022587" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:08.022166" elapsed="0.000456"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:08.023579" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:08.023306" elapsed="0.000362">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:08.023823" 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-10-16T01:23:08.022868" elapsed="0.000988"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:08.024522" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:08.024091" elapsed="0.000466"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:08.024973" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:08.025160" 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-10-16T01:23:08.024816" elapsed="0.000377"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:08.025808" 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-10-16T01:23:08.025464" elapsed="0.000403"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:08.027297" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:08.026795" elapsed="0.000559"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:08.028006" 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-10-16T01:23:08.027597" elapsed="0.000443"/>
</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-10-16T01:23:08.028451" elapsed="0.000031"/>
</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-10-16T01:23:08.028742" 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-10-16T01:23:08.028935" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:08.028258" elapsed="0.000729"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:08.028100" elapsed="0.000915"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:08.029056" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:23:08.029183" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:08.026294" elapsed="0.002912"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:08.025952" elapsed="0.003283"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:08.029401" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:08.029259" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:08.025928" elapsed="0.003543"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:08.030043" 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-10-16T01:23:08.029622" elapsed="0.000492"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:08.030161" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:08.021440" elapsed="0.008824"/>
</kw>
<msg time="2026-10-16T01:23:08.030311" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:08.015850" elapsed="0.014507"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:08.034163" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:08.038034" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:08.041812" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:08.041988" elapsed="0.000020"/>
</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-10-16T01:23:08.042166" elapsed="0.000019"/>
</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-10-16T01:23:08.042502" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:08.042362" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:08.042349" elapsed="0.000226"/>
</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-10-16T01:23:08.042741" 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-10-16T01:23:08.042931" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:08.043092" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:08.042323" elapsed="0.000817"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:08.042235" elapsed="0.000928"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:08.043311" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:08.043378" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:08.043481" 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-10-16T01:23:08.014997" elapsed="0.028507"/>
</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-10-16T01:23:08.044648" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:08.044455" elapsed="0.000268">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:08.044820" 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-10-16T01:23:08.044133" elapsed="0.000710"/>
</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-10-16T01:23:08.045126" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:08.044907" elapsed="0.000270"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:08.045619" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:08.045356" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:08.045200" elapsed="0.000475"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:08.044890" elapsed="0.000819"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:08.046215" 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-10-16T01:23:08.045881" elapsed="0.000358"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:08.046284" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:08.046407" 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-manganese/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-10-16T01:23:08.043797" elapsed="0.002633"/>
</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-10-16T01:23:08.047508" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:08.047319" elapsed="0.000248">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:08.047650" 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-10-16T01:23:08.047004" elapsed="0.000668"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:08.047867" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:23:08.047753" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:08.047736" elapsed="0.000208"/>
</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-10-16T01:23:08.048094" elapsed="0.000020"/>
</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-10-16T01:23:08.048264" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:08.048323" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:23:08.048446" 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-manganese/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-10-16T01:23:08.046676" elapsed="0.001793"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:08.049894" 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-10-16T01:23:08.049638" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:08.050337" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:08.050120" elapsed="0.000257"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:23:08.054629" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:08.054683" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:08.054814" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:08.050657" elapsed="0.004506">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:08.050437" elapsed="0.004833">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:08.055450" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:08.055302" elapsed="0.000206"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:08.050420" elapsed="0.005110">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:08.055893" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:08.056015" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:08.055982" elapsed="0.000074"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:08.055965" 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-10-16T01:23:08.056233" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:08.056298" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:23:08.048942" elapsed="0.007463">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:08.056473" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:23:08.005318" elapsed="0.051280">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:08.057028" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:08.056809" elapsed="0.000301"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:08.056746" elapsed="0.000405"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:08.057233" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:23:08.002920" elapsed="0.054474">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:07.998895" elapsed="0.058598">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:07.998851" elapsed="0.058714">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:08.057838" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:08.058183" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:08.058497" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:08.058880" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:08.059303" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:08.059614" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:08.059994" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:08.060247" elapsed="0.000019"/>
</return>
<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="FAIL" start="2026-10-16T01:23:07.991170" elapsed="0.069180">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:08.060450" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:07.989218" elapsed="0.071324">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:08.060799" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:08.060621" elapsed="0.000231"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:08.061013" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:08.060875" elapsed="0.000187"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:08.061225" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:08.061084" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:08.060605" elapsed="0.000688"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:07.988888" elapsed="0.072442">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:07.988451" elapsed="0.072933">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:08.061433" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:07.979750" elapsed="0.081774">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:08.061698" elapsed="0.000117"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:08.062021" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:08.061876" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:08.061861" elapsed="0.000228"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:08.062214" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:08.062381" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:08.062439" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:07.978165" elapsed="0.084366">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:07.977674" elapsed="0.084919">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:07.977439" elapsed="0.085202">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:07.976515" elapsed="0.086296">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:08.063024" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:07.955273" elapsed="0.107855">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:09.083993" elapsed="0.000461"/>
</kw>
<msg time="2026-10-16T01:23:09.084602" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:09.082636" elapsed="0.002385"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:09.081695" elapsed="0.003510"/>
</kw>
<msg time="2026-10-16T01:23:09.085302" 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-10-16T01:23:09.074519" elapsed="0.010875"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:09.073557" elapsed="0.011988"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:09.086738" 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-10-16T01:23:09.086176" elapsed="0.000677"/>
</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-10-16T01:23:09.093575" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:09.092799" elapsed="0.000834"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:09.094630" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:09.094029" elapsed="0.000654"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:09.094863" elapsed="0.000070"/>
</return>
<msg time="2026-10-16T01:23:09.095171" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:09.091966" elapsed="0.003255"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:09.095551" elapsed="0.000346"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:09.096978" 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-10-16T01:23:09.096264" elapsed="0.000769"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:09.097917" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:09.097358" elapsed="0.000612"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:09.098833" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:09.098280" elapsed="0.000609"/>
</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-10-16T01:23:09.107802" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:09.106323" elapsed="0.001595"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:09.108046" elapsed="0.000133"/>
</return>
<msg time="2026-10-16T01:23:09.108611" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:09.103026" elapsed="0.005828"/>
</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-10-16T01:23:09.131975" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:09.131510" elapsed="0.000503"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:09.133039" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:09.132673" elapsed="0.000483">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:09.133276" 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-10-16T01:23:09.132230" elapsed="0.001078"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:09.134011" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:09.133543" elapsed="0.000504"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:09.134434" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:09.134739" 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-10-16T01:23:09.134274" elapsed="0.000499"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:09.135373" 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-10-16T01:23:09.135059" elapsed="0.000371"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:09.136607" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:09.136376" elapsed="0.000272"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:09.137116" 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-10-16T01:23:09.136850" 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-10-16T01:23:09.137456" elapsed="0.000020"/>
</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-10-16T01:23:09.137644" elapsed="0.000022"/>
</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-10-16T01:23:09.137860" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:09.137322" elapsed="0.000592"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:09.137187" elapsed="0.000760"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:09.137993" elapsed="0.000029"/>
</return>
<msg time="2026-10-16T01:23:09.138127" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:09.136043" elapsed="0.002107"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:09.135733" elapsed="0.002446"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:09.138351" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:09.138208" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:09.135500" elapsed="0.002920"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:09.139015" 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-10-16T01:23:09.138578" elapsed="0.000463"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:09.139083" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:09.130813" elapsed="0.008368"/>
</kw>
<msg time="2026-10-16T01:23:09.139230" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:09.125107" elapsed="0.014170"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:09.143306" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:09.147094" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:09.150862" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:09.151076" elapsed="0.000020"/>
</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-10-16T01:23:09.151253" elapsed="0.000019"/>
</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-10-16T01:23:09.151597" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:09.151454" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:09.151440" elapsed="0.000229"/>
</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-10-16T01:23:09.151860" 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-10-16T01:23:09.152037" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:09.152196" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:09.151413" elapsed="0.000831"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:09.151323" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:09.152419" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:09.152486" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:09.152589" 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-10-16T01:23:09.124243" elapsed="0.028369"/>
</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-10-16T01:23:09.153733" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:09.153525" elapsed="0.000280">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:09.153889" 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-10-16T01:23:09.153206" elapsed="0.000705"/>
</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-10-16T01:23:09.154190" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:09.153974" elapsed="0.000268"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:09.154720" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:09.154441" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:09.154264" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:09.153957" elapsed="0.000849"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:09.155296" 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-10-16T01:23:09.154962" elapsed="0.000358"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:09.155364" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:23:09.155485" 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-manganese/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-10-16T01:23:09.152908" elapsed="0.002599"/>
</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-10-16T01:23:09.159052" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:09.156394" elapsed="0.002718">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:09.159196" 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-10-16T01:23:09.156080" elapsed="0.003139"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:09.159385" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:23:09.159283" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:09.159265" elapsed="0.000197"/>
</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-10-16T01:23:09.159615" elapsed="0.000020"/>
</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-10-16T01:23:09.159859" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:09.159922" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:09.160047" 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-manganese/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-10-16T01:23:09.155775" elapsed="0.004294"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:09.161318" 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-10-16T01:23:09.161092" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:09.161782" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:09.161545" 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-10-16T01:23:09.166348" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:09.166409" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:09.166529" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:09.162118" elapsed="0.004885">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:09.161893" elapsed="0.005199">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:09.167280" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:09.167122" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:09.161876" elapsed="0.005483">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:09.167723" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:09.167859" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:09.167826" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:09.167808" elapsed="0.000109"/>
</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-10-16T01:23:09.168055" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:09.168118" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:23:09.160345" elapsed="0.007879">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:09.168290" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:23:09.114519" elapsed="0.053899">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:09.168848" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:09.168585" elapsed="0.000347"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:09.168537" elapsed="0.000440"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:09.169063" elapsed="0.000037"/>
</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="FAIL" start="2026-10-16T01:23:09.112239" elapsed="0.057028">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:09.109352" elapsed="0.060015">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:09.109302" elapsed="0.060139">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:09.169696" elapsed="0.000040"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:09.170091" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:09.170417" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:09.170811" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:09.171256" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:09.171634" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:09.172054" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:09.172303" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:23:09.101633" elapsed="0.070773">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:09.172467" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:09.099688" elapsed="0.072868">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:09.172837" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:09.172635" elapsed="0.000255"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:09.173048" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:09.172912" elapsed="0.000185"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:09.173262" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:09.173118" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:09.172619" elapsed="0.000710"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:09.099356" elapsed="0.074012">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:09.098985" elapsed="0.074437">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:09.173470" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:09.090552" elapsed="0.083008">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:09.173765" elapsed="0.000031"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:09.173997" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:09.173857" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:09.173841" elapsed="0.000224"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:09.174238" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:09.174411" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:09.174469" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:09.088949" elapsed="0.085613">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:09.088415" elapsed="0.086207">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:09.088140" elapsed="0.086530">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:09.087315" elapsed="0.087460">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:09.175000" elapsed="0.000021"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:09.064156" elapsed="0.110947">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:10.195272" elapsed="0.000485"/>
</kw>
<msg time="2026-10-16T01:23:10.195912" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:10.193996" elapsed="0.002052"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:10.192866" elapsed="0.003346"/>
</kw>
<msg time="2026-10-16T01:23:10.196306" 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-10-16T01:23:10.186077" elapsed="0.010319"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:10.185153" elapsed="0.011390"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:10.197614" 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-10-16T01:23:10.197094" elapsed="0.000642"/>
</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-10-16T01:23:10.204580" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:10.203823" elapsed="0.000814"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:10.205634" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:10.205028" elapsed="0.000659"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:10.205840" elapsed="0.000070"/>
</return>
<msg time="2026-10-16T01:23:10.206146" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:10.202979" elapsed="0.003218"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:10.206524" elapsed="0.000341"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:10.208123" 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-10-16T01:23:10.207236" elapsed="0.000944"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:10.209080" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:10.208511" elapsed="0.000622"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:10.210148" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:10.209442" elapsed="0.000759"/>
</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-10-16T01:23:10.219154" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:10.217755" elapsed="0.001512"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:10.219395" elapsed="0.000136"/>
</return>
<msg time="2026-10-16T01:23:10.220052" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:10.214344" elapsed="0.005837"/>
</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-10-16T01:23:10.243519" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:10.243092" elapsed="0.000464"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:10.244574" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:10.244260" elapsed="0.000424">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:10.244848" 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-10-16T01:23:10.243810" elapsed="0.001072"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:10.245550" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:10.245118" elapsed="0.000467"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:10.246047" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:10.246330" 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-10-16T01:23:10.245882" elapsed="0.000483"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:10.247069" 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-10-16T01:23:10.246638" elapsed="0.000482"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:10.248052" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:10.247821" elapsed="0.000280"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:10.248692" 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-10-16T01:23:10.248276" elapsed="0.000457"/>
</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-10-16T01:23:10.249045" 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-10-16T01:23:10.249232" 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-10-16T01:23:10.249416" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:10.248912" elapsed="0.000555"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:10.248778" elapsed="0.000721"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:10.249542" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:10.249670" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:10.247450" elapsed="0.002244"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:10.247191" elapsed="0.002547"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:10.249929" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:10.249766" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:10.247168" elapsed="0.002833"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:10.250561" 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-10-16T01:23:10.250157" elapsed="0.000429"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:10.250630" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:10.242355" elapsed="0.008392"/>
</kw>
<msg time="2026-10-16T01:23:10.250855" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:10.236559" elapsed="0.014346"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:10.254760" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:10.258787" elapsed="0.000042"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:10.262682" elapsed="0.000037"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:10.262888" 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-10-16T01:23:10.263068" elapsed="0.000019"/>
</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-10-16T01:23:10.263417" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:10.263267" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:10.263254" 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-10-16T01:23:10.263643" 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-10-16T01:23:10.263856" 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-10-16T01:23:10.264020" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:10.263228" elapsed="0.000841"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:10.263139" elapsed="0.000954"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:10.264243" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:10.264312" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:23:10.264417" 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-10-16T01:23:10.235676" elapsed="0.028764"/>
</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-10-16T01:23:10.265606" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:10.265413" elapsed="0.000253">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:10.265829" 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-10-16T01:23:10.265091" 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-10-16T01:23:10.266144" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:10.265922" elapsed="0.000275"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:10.266656" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:10.266390" elapsed="0.000290"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:10.266220" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:10.265905" elapsed="0.000858"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:10.267277" 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-10-16T01:23:10.266937" elapsed="0.000364"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:10.267347" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:10.267477" 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-manganese/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-10-16T01:23:10.264731" elapsed="0.002769"/>
</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-10-16T01:23:10.268670" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:10.268481" elapsed="0.000273">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:10.268858" 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-10-16T01:23:10.268164" elapsed="0.000717"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:10.269044" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:23:10.268945" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:10.268928" elapsed="0.000194"/>
</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-10-16T01:23:10.269274" elapsed="0.000020"/>
</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-10-16T01:23:10.269448" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:10.269508" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:23:10.269633" 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-manganese/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-10-16T01:23:10.267860" elapsed="0.001796"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:10.271105" 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-10-16T01:23:10.270878" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:10.271554" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:10.271334" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:23:10.276115" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:10.276172" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:10.276278" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:10.271917" elapsed="0.004778">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:10.271655" elapsed="0.005166">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:10.277006" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:10.276854" elapsed="0.000246"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:10.271638" elapsed="0.005487">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:10.277478" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:10.277598" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:10.277564" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:10.277548" elapsed="0.000108"/>
</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-10-16T01:23:10.277831" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:10.277897" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:23:10.270147" elapsed="0.007854">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:10.278069" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:23:10.225635" elapsed="0.052558">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:10.278587" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:10.278361" elapsed="0.000320"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:10.278313" elapsed="0.000436"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:10.278854" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:23:10.223433" elapsed="0.055595">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:10.220655" elapsed="0.058472">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:10.220608" elapsed="0.058595">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:10.279455" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:10.279852" elapsed="0.000023"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:10.280172" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:10.280521" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:10.280997" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:10.281314" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:10.281662" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:10.281948" elapsed="0.000020"/>
</return>
<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="FAIL" start="2026-10-16T01:23:10.212972" elapsed="0.069081">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:10.282115" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:10.211056" elapsed="0.071147">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:10.282458" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:10.282317" elapsed="0.000191"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:10.282666" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:10.282530" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:10.282926" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:10.282768" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:10.282300" elapsed="0.000696"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:10.210669" elapsed="0.072366">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:10.210297" elapsed="0.072792">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:10.283138" elapsed="0.000022"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:10.201450" elapsed="0.081787">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:10.283415" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:10.283634" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:10.283494" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:10.283478" elapsed="0.000309"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:10.283944" elapsed="0.000026"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:10.284151" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:10.284213" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:10.199822" elapsed="0.084485">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:10.199298" elapsed="0.085080">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:10.199032" elapsed="0.085394">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:10.198210" elapsed="0.086297">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:10.284826" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:10.176027" elapsed="0.108912">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:11.304629" elapsed="0.000484"/>
</kw>
<msg time="2026-10-16T01:23:11.305243" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:11.303358" elapsed="0.002015"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:11.302404" elapsed="0.003131"/>
</kw>
<msg time="2026-10-16T01:23:11.305794" 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-10-16T01:23:11.295645" elapsed="0.010268"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:11.294737" elapsed="0.011330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:11.307149" 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-10-16T01:23:11.306568" elapsed="0.000674"/>
</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-10-16T01:23:11.314028" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:11.313211" elapsed="0.000876"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:11.315093" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:11.314424" elapsed="0.000723"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:11.315246" elapsed="0.000065"/>
</return>
<msg time="2026-10-16T01:23:11.315540" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:11.312363" elapsed="0.003227"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:11.316069" elapsed="0.000299"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:11.317476" 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-10-16T01:23:11.316770" elapsed="0.000762"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:11.318481" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:11.317972" elapsed="0.000561"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:11.319520" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:11.319012" elapsed="0.000560"/>
</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-10-16T01:23:11.328382" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:11.326982" elapsed="0.001509"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:11.328618" elapsed="0.000214"/>
</return>
<msg time="2026-10-16T01:23:11.329266" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:11.323647" elapsed="0.005747"/>
</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-10-16T01:23:11.352389" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:11.351962" elapsed="0.000463"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:11.353458" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:11.353132" elapsed="0.000438">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:11.353687" 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-10-16T01:23:11.352641" elapsed="0.001101"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:11.354427" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:11.353995" elapsed="0.000467"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:11.354890" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:11.355124" 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-10-16T01:23:11.354690" elapsed="0.000467"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:11.355848" 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-10-16T01:23:11.355427" elapsed="0.000484"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:11.357371" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:11.356892" elapsed="0.000521"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:11.357892" 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-10-16T01:23:11.357599" elapsed="0.000318"/>
</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-10-16T01:23:11.358209" 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-10-16T01:23:11.358396" elapsed="0.000022"/>
</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-10-16T01:23:11.358577" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:11.358076" elapsed="0.000552"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:11.357961" elapsed="0.000699"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:11.358717" elapsed="0.000028"/>
</return>
<msg time="2026-10-16T01:23:11.358864" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:11.356356" elapsed="0.002532"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:11.356000" elapsed="0.002917"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:11.359090" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:11.358944" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:11.355975" elapsed="0.003184"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:11.359741" 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-10-16T01:23:11.359317" elapsed="0.000450"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:11.359822" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:11.351221" elapsed="0.008703"/>
</kw>
<msg time="2026-10-16T01:23:11.359972" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:11.345507" elapsed="0.014513"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:11.363997" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:11.367778" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:11.371537" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:11.371725" 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-10-16T01:23:11.371925" 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-10-16T01:23:11.372306" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:11.372123" elapsed="0.000236"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:11.372109" elapsed="0.000273"/>
</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-10-16T01:23:11.372537" elapsed="0.000019"/>
</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-10-16T01:23:11.372728" 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-10-16T01:23:11.372910" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:11.372084" elapsed="0.000877"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:11.371995" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:11.373137" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:11.373204" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:23:11.373309" 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-10-16T01:23:11.344655" elapsed="0.028677"/>
</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-10-16T01:23:11.374437" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:11.374244" elapsed="0.000253">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:11.374580" 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-10-16T01:23:11.373923" elapsed="0.000679"/>
</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-10-16T01:23:11.375025" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:11.374665" elapsed="0.000413"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:11.375525" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:11.375262" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:11.375101" elapsed="0.000480"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:11.374648" elapsed="0.000952"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:11.376123" 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-10-16T01:23:11.375772" elapsed="0.000375"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:11.376192" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:23:11.376313" 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-manganese/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-10-16T01:23:11.373596" elapsed="0.002740"/>
</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-10-16T01:23:11.377417" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:11.377229" elapsed="0.000246">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:11.377558" 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-10-16T01:23:11.376912" elapsed="0.000669"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:11.377762" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:23:11.377643" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:11.377626" elapsed="0.000229"/>
</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-10-16T01:23:11.378006" elapsed="0.000020"/>
</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-10-16T01:23:11.378179" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:11.378238" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:11.378360" 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-manganese/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-10-16T01:23:11.376584" elapsed="0.001833"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:11.379848" 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-10-16T01:23:11.379590" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:11.380294" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:11.380078" elapsed="0.000255"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:23:11.384678" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:11.384758" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:11.384879" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:11.380616" elapsed="0.004656">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:11.380393" elapsed="0.004963">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:11.385535" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:11.385386" elapsed="0.000207"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:11.380376" elapsed="0.005238">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:11.385989" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:11.386109" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:11.386077" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:11.386061" elapsed="0.000105"/>
</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-10-16T01:23:11.386302" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:11.386365" elapsed="0.000013"/>
</return>
<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="FAIL" start="2026-10-16T01:23:11.378897" elapsed="0.007570">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:11.386533" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:23:11.335030" elapsed="0.051626">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:11.387084" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:11.386866" elapsed="0.000300"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:11.386803" elapsed="0.000404"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:11.387292" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:23:11.332876" elapsed="0.054578">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:11.330144" elapsed="0.057441">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:11.330094" elapsed="0.057565">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:11.387937" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:11.388284" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:11.388595" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:11.388988" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:11.389416" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:11.389752" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:11.390112" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:11.390349" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:23:11.322304" elapsed="0.068144">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:11.390509" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:11.320426" elapsed="0.070170">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:11.390853" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:11.390676" elapsed="0.000228"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:11.391062" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:11.390926" elapsed="0.000184"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:11.391273" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:11.391131" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:11.390660" elapsed="0.000680"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:11.320096" elapsed="0.071282">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:11.319666" elapsed="0.071766">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:11.391480" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:11.311001" elapsed="0.080567">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:11.391839" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:11.392061" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:11.391919" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:11.391904" elapsed="0.000224"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:11.392253" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:11.392419" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:11.392476" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:11.309296" elapsed="0.083306">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:11.308826" elapsed="0.083839">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:11.308514" elapsed="0.084311">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:11.307696" elapsed="0.085217">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:11.393123" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:11.285763" elapsed="0.107464">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:12.413813" elapsed="0.000466"/>
</kw>
<msg time="2026-10-16T01:23:12.414421" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:12.412502" elapsed="0.002055"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:12.411523" elapsed="0.003232"/>
</kw>
<msg time="2026-10-16T01:23:12.414874" 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-10-16T01:23:12.404459" elapsed="0.010510"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:12.403509" elapsed="0.011614"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:12.416197" 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-10-16T01:23:12.415621" elapsed="0.000667"/>
</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-10-16T01:23:12.423084" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:12.422274" elapsed="0.000867"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:12.424288" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:12.423475" elapsed="0.000882"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:12.424461" elapsed="0.000068"/>
</return>
<msg time="2026-10-16T01:23:12.424802" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:12.421443" elapsed="0.003440"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:12.425217" elapsed="0.000288"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:12.426676" 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-10-16T01:23:12.425990" elapsed="0.000776"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:12.427625" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:12.427124" elapsed="0.000554"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:12.428539" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:12.428043" elapsed="0.000548"/>
</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-10-16T01:23:12.437418" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:12.436030" elapsed="0.001610"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:12.437850" elapsed="0.000140"/>
</return>
<msg time="2026-10-16T01:23:12.438419" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:12.432735" elapsed="0.005808"/>
</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-10-16T01:23:12.461566" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:12.461136" elapsed="0.000469"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:12.462630" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:12.462311" elapsed="0.000453">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:12.462907" 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-10-16T01:23:12.461869" elapsed="0.001071"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:12.463606" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:12.463174" elapsed="0.000467"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:12.464087" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:12.464326" 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-10-16T01:23:12.463917" elapsed="0.000453"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:12.465049" 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-10-16T01:23:12.464671" elapsed="0.000440"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:12.466193" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:12.465960" elapsed="0.000273"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:12.466681" 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-10-16T01:23:12.466416" 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-10-16T01:23:12.467035" 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-10-16T01:23:12.467221" elapsed="0.000022"/>
</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-10-16T01:23:12.467402" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:12.466903" elapsed="0.000551"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:12.466769" elapsed="0.000716"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:12.467528" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:23:12.467661" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:12.465592" elapsed="0.002092"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:12.465328" elapsed="0.002400"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:12.467919" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:12.467755" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:12.465181" elapsed="0.002810"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:12.468564" 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-10-16T01:23:12.468147" elapsed="0.000443"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:12.468634" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:12.460406" elapsed="0.008358"/>
</kw>
<msg time="2026-10-16T01:23:12.468896" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:12.454756" elapsed="0.014189"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:12.472780" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:12.476772" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:12.480557" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:12.480747" elapsed="0.000020"/>
</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-10-16T01:23:12.480943" elapsed="0.000019"/>
</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-10-16T01:23:12.481292" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:12.481148" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:12.481135" elapsed="0.000229"/>
</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-10-16T01:23:12.481516" elapsed="0.000019"/>
</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-10-16T01:23:12.481709" 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-10-16T01:23:12.481895" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:12.481102" elapsed="0.000843"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:12.481013" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:12.482117" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:12.482184" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:12.482287" 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-10-16T01:23:12.453908" elapsed="0.028402"/>
</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-10-16T01:23:12.483425" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:12.483231" elapsed="0.000253">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:12.483567" 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-10-16T01:23:12.482908" elapsed="0.000682"/>
</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-10-16T01:23:12.483903" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:12.483652" elapsed="0.000337"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:12.484451" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:12.484188" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:12.484014" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:12.483636" elapsed="0.000930"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:12.485093" 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-10-16T01:23:12.484737" elapsed="0.000380"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:12.485163" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:12.485285" 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-manganese/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-10-16T01:23:12.482576" elapsed="0.002731"/>
</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-10-16T01:23:12.488522" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:12.486237" elapsed="0.002346">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:12.488675" 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-10-16T01:23:12.485896" elapsed="0.002817"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:12.488893" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:23:12.488780" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:12.488763" elapsed="0.000208"/>
</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-10-16T01:23:12.489121" 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-10-16T01:23:12.489294" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:12.489354" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:12.489477" 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-manganese/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-10-16T01:23:12.485554" elapsed="0.003946"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:12.490790" 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-10-16T01:23:12.490526" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:12.491268" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:12.491046" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:23:12.496003" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:12.496061" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:12.496174" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:12.491589" elapsed="0.004986">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:12.491367" elapsed="0.005293">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:12.496883" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:12.496690" elapsed="0.000253"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:12.491351" elapsed="0.005613">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:12.497313" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:12.497468" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:12.497435" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:12.497418" elapsed="0.000108"/>
</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-10-16T01:23:12.497662" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:12.497742" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:23:12.489792" elapsed="0.008175">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:12.498037" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:23:12.444037" elapsed="0.054131">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:12.498559" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:12.498334" elapsed="0.000309"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:12.498286" elapsed="0.000399"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:12.498795" elapsed="0.000051"/>
</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="FAIL" start="2026-10-16T01:23:12.441757" elapsed="0.057219">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:12.439185" elapsed="0.059890">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:12.439153" elapsed="0.059996">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:12.499395" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:12.499764" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:12.500087" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:12.500441" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:12.500918" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:12.501295" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:12.501641" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:12.501929" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:23:12.431383" elapsed="0.070648">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:12.502091" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:12.429451" elapsed="0.072728">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:12.502399" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:12.502258" elapsed="0.000190"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:12.502653" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:12.502470" elapsed="0.000258"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:12.502919" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:12.502752" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:12.502243" elapsed="0.000746"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:12.429121" elapsed="0.073906">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:12.428685" elapsed="0.074395">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:12.503128" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:12.420084" elapsed="0.083134">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:12.503393" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:12.503617" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:12.503479" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:12.503464" elapsed="0.000222"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:12.503958" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:12.504128" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:12.504187" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:12.418350" elapsed="0.085928">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:12.417885" elapsed="0.086455">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:12.417544" elapsed="0.086844">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:12.416772" elapsed="0.087695">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:12.504675" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:12.394140" elapsed="0.110660">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:13.590279" elapsed="0.000218"/>
</kw>
<msg time="2026-10-16T01:23:13.590569" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:13.589670" elapsed="0.000969"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:13.589271" elapsed="0.001461"/>
</kw>
<msg time="2026-10-16T01:23:13.590775" 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-10-16T01:23:13.586243" elapsed="0.004573"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:13.585610" elapsed="0.005290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:13.591455" 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-10-16T01:23:13.591219" elapsed="0.000277"/>
</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-10-16T01:23:13.594494" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:13.594157" elapsed="0.000363"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:13.594976" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:13.594668" elapsed="0.000332"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:13.595048" elapsed="0.000031"/>
</return>
<msg time="2026-10-16T01:23:13.595185" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:13.593782" elapsed="0.001426"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:13.595364" elapsed="0.000136"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:13.595996" 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-10-16T01:23:13.595663" elapsed="0.000359"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:13.596391" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:13.596166" elapsed="0.000248"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:13.596951" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:13.596550" elapsed="0.000426"/>
</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-10-16T01:23:13.600769" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:13.600151" elapsed="0.000669"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:13.600892" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:23:13.601153" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:13.598639" elapsed="0.002572"/>
</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-10-16T01:23:13.617505" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:13.617200" elapsed="0.000331"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:13.618422" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:13.618167" elapsed="0.000346">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:13.618603" 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-10-16T01:23:13.617687" elapsed="0.000943"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:13.619167" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:13.618824" elapsed="0.000368"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:13.619469" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:13.619635" 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-10-16T01:23:13.619355" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:13.620122" 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-10-16T01:23:13.619889" elapsed="0.000275"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:13.621076" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:13.620842" elapsed="0.000274"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:13.621594" 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-10-16T01:23:13.621290" elapsed="0.000329"/>
</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-10-16T01:23:13.621939" 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-10-16T01:23:13.622126" elapsed="0.000022"/>
</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-10-16T01:23:13.622305" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:13.621791" elapsed="0.000566"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:13.621663" elapsed="0.000724"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:13.622427" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:23:13.622557" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:13.620480" elapsed="0.002100"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:13.620224" 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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:13.622792" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:13.622635" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:13.620208" elapsed="0.002673"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:13.623458" 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-10-16T01:23:13.623049" elapsed="0.000435"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:13.623527" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:13.616656" elapsed="0.006970"/>
</kw>
<msg time="2026-10-16T01:23:13.623674" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:13.612441" elapsed="0.011312"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:13.627590" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:13.631522" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:13.635338" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:13.635516" elapsed="0.000020"/>
</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-10-16T01:23:13.635731" elapsed="0.000025"/>
</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-10-16T01:23:13.636113" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:13.635969" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:13.635956" 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-10-16T01:23:13.636339" elapsed="0.000019"/>
</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-10-16T01:23:13.636515" elapsed="0.000018"/>
</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-10-16T01:23:13.636727" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:13.635927" elapsed="0.000851"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:13.635809" elapsed="0.000993"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:13.636969" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:13.637039" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:13.637144" 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-10-16T01:23:13.611848" elapsed="0.025319"/>
</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-10-16T01:23:13.638291" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:13.638100" elapsed="0.000251">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:13.638432" 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-10-16T01:23:13.637755" elapsed="0.000699"/>
</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-10-16T01:23:13.638745" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:13.638516" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:13.639261" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:13.638996" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:13.638822" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:13.638500" elapsed="0.000837"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:13.639926" 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-10-16T01:23:13.639532" elapsed="0.000419"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:13.640001" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:13.640125" 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-manganese/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-10-16T01:23:13.637436" elapsed="0.002712"/>
</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-10-16T01:23:13.641230" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:13.641041" elapsed="0.000247">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:13.641370" 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-10-16T01:23:13.640687" elapsed="0.000705"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:13.641561" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:23:13.641463" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:13.641437" elapsed="0.000201"/>
</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-10-16T01:23:13.641804" 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-10-16T01:23:13.641999" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:13.642059" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:13.642183" 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-manganese/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-10-16T01:23:13.640391" elapsed="0.001815"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:13.643424" 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-10-16T01:23:13.643199" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:13.643941" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:13.643683" 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-10-16T01:23:13.648466" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:13.648521" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:13.648633" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:13.644279" elapsed="0.004778">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:13.644049" elapsed="0.005092">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:13.649323" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:13.649172" elapsed="0.000210"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:13.644032" elapsed="0.005372">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:13.649758" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:13.649894" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:13.649860" elapsed="0.000076"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:13.649843" 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-10-16T01:23:13.650097" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:13.650159" elapsed="0.000013"/>
</return>
<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="FAIL" start="2026-10-16T01:23:13.642480" elapsed="0.007782">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:13.650328" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:23:13.604898" elapsed="0.045555">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:13.650878" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:13.650619" elapsed="0.000346"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:13.650572" elapsed="0.000434"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:13.651090" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:23:13.603163" elapsed="0.048093">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:13.601433" elapsed="0.049922">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:13.601411" elapsed="0.050015">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:13.651673" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:13.652085" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:13.652398" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:13.652779" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:13.653221" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:13.653532" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:13.653923" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:13.654160" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:23:13.598079" elapsed="0.056182">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:13.654322" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:13.597367" elapsed="0.057045">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:13.654631" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:13.654491" elapsed="0.000190"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:13.654883" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:13.654730" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:13.655100" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:13.654958" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:13.654475" elapsed="0.000692"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:13.597185" elapsed="0.058020">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:13.597019" elapsed="0.058239">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:13.655306" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:13.593148" elapsed="0.062249">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:13.655571" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:13.655932" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:13.655649" elapsed="0.000334"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:13.655634" elapsed="0.000371"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:13.656133" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:13.656309" elapsed="0.000023"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:13.656385" elapsed="0.000020"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:13.592427" elapsed="0.064070">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:13.592210" elapsed="0.064354">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:13.592087" elapsed="0.064564">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:13.591716" elapsed="0.065041">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:13.656995" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:13.505639" elapsed="0.151466">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:14.676015" elapsed="0.000438"/>
</kw>
<msg time="2026-10-16T01:23:14.676576" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:14.674691" elapsed="0.002050"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:14.673789" elapsed="0.003145"/>
</kw>
<msg time="2026-10-16T01:23:14.677029" 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-10-16T01:23:14.667258" elapsed="0.009865"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:14.666346" elapsed="0.010924"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:14.678337" 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-10-16T01:23:14.677796" elapsed="0.000631"/>
</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-10-16T01:23:14.686345" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:14.685139" elapsed="0.001273"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:14.687454" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:14.686800" elapsed="0.000708"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:14.687607" elapsed="0.000064"/>
</return>
<msg time="2026-10-16T01:23:14.687963" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:14.684302" elapsed="0.003713"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:14.688353" elapsed="0.000286"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:14.689835" 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-10-16T01:23:14.689125" elapsed="0.000787"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:14.690780" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:14.690236" elapsed="0.000600"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:14.691683" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:14.691162" elapsed="0.000610"/>
</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-10-16T01:23:14.700322" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:14.698906" elapsed="0.001525"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:14.700557" elapsed="0.000136"/>
</return>
<msg time="2026-10-16T01:23:14.701200" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:14.695474" elapsed="0.005855"/>
</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-10-16T01:23:14.728025" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:14.727549" elapsed="0.000513"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:14.729090" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:14.728759" elapsed="0.000435">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:14.729312" 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-10-16T01:23:14.728280" elapsed="0.001064"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:14.730145" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:14.729628" elapsed="0.000555"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:14.730589" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:14.730824" 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-10-16T01:23:14.730423" elapsed="0.000456"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:14.731462" 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-10-16T01:23:14.731149" elapsed="0.000370"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:14.732870" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:14.732504" elapsed="0.000424"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:14.733527" 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-10-16T01:23:14.733170" elapsed="0.000391"/>
</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-10-16T01:23:14.734082" elapsed="0.000036"/>
</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-10-16T01:23:14.734362" elapsed="0.000022"/>
</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-10-16T01:23:14.734546" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:14.733801" elapsed="0.000797"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:14.733622" elapsed="0.001005"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:14.734670" elapsed="0.000046"/>
</return>
<msg time="2026-10-16T01:23:14.734822" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:14.732024" elapsed="0.002837"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:14.731612" elapsed="0.003279"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:14.735076" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:14.734917" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:14.731585" elapsed="0.003562"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:14.735722" 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-10-16T01:23:14.735300" elapsed="0.000448"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:14.735792" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:14.726827" elapsed="0.009080"/>
</kw>
<msg time="2026-10-16T01:23:14.735956" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:14.721111" elapsed="0.014897"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:14.740058" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:14.744084" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:14.747897" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:14.748078" elapsed="0.000019"/>
</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-10-16T01:23:14.748255" elapsed="0.000019"/>
</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-10-16T01:23:14.748593" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:14.748452" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:14.748439" elapsed="0.000227"/>
</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-10-16T01:23:14.748831" elapsed="0.000033"/>
</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-10-16T01:23:14.749021" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:14.749179" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:14.748413" elapsed="0.000814"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:14.748325" elapsed="0.000925"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:14.749400" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:14.749468" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:14.749575" 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-10-16T01:23:14.720241" elapsed="0.029358"/>
</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-10-16T01:23:14.750766" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:14.750537" elapsed="0.000315">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:14.750937" 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-10-16T01:23:14.750203" elapsed="0.000757"/>
</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-10-16T01:23:14.751244" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:14.751026" elapsed="0.000270"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:14.751785" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:14.751494" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:14.751320" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:14.751007" elapsed="0.000876"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:14.752383" 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-10-16T01:23:14.752044" elapsed="0.000396"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:14.752488" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:14.752612" 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-manganese/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-10-16T01:23:14.749903" elapsed="0.002732"/>
</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-10-16T01:23:14.753744" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:14.753535" elapsed="0.000270">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:14.753906" 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-10-16T01:23:14.753216" elapsed="0.000714"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:14.754095" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:23:14.753995" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:14.753978" elapsed="0.000194"/>
</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-10-16T01:23:14.754322" elapsed="0.000020"/>
</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-10-16T01:23:14.754493" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:14.754554" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:14.754678" 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-manganese/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-10-16T01:23:14.752920" elapsed="0.001797"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:14.756037" 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-10-16T01:23:14.755795" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:14.756482" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:14.756264" elapsed="0.000257"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:23:14.761122" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:14.761178" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:14.761282" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:14.756830" elapsed="0.004831">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:14.756589" elapsed="0.005177">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:14.761965" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:14.761798" elapsed="0.000227"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:14.756572" elapsed="0.005475">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:14.762400" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:14.762521" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:14.762487" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:14.762471" elapsed="0.000108"/>
</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-10-16T01:23:14.762744" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:14.762854" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:23:14.755067" elapsed="0.007893">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:14.763030" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:23:14.710118" elapsed="0.053053">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:14.763566" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:14.763344" elapsed="0.000304"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:14.763296" elapsed="0.000397"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:14.763808" elapsed="0.000056"/>
</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="FAIL" start="2026-10-16T01:23:14.706448" elapsed="0.057550">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:14.702021" elapsed="0.062078">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:14.701969" elapsed="0.062205">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:14.764427" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:14.764794" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:14.765124" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:14.765479" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:14.765981" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:14.766299" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:14.766645" elapsed="0.000019"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:14.766933" elapsed="0.000020"/>
</return>
<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="FAIL" start="2026-10-16T01:23:14.694165" elapsed="0.072878">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:14.767105" elapsed="0.000017"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:14.692621" elapsed="0.074575">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:14.767421" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:14.767281" elapsed="0.000190"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:14.767630" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:14.767495" elapsed="0.000184"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:14.767889" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:14.767728" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:14.767261" elapsed="0.000730"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:14.692287" elapsed="0.075746">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:14.691900" elapsed="0.076187">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:14.768139" elapsed="0.000024"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:14.682906" elapsed="0.085335">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:14.768430" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:14.768660" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:14.768510" elapsed="0.000322"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:14.768494" elapsed="0.000378"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:14.769004" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:14.769173" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:14.769231" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:14.681162" elapsed="0.088162">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:14.680619" elapsed="0.088768">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:14.679693" elapsed="0.089745">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:14.678945" elapsed="0.090578">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:14.769755" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:14.657976" elapsed="0.111904">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:15.790671" elapsed="0.000513"/>
</kw>
<msg time="2026-10-16T01:23:15.791318" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:15.789254" elapsed="0.002198"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:15.788193" elapsed="0.003430"/>
</kw>
<msg time="2026-10-16T01:23:15.791755" 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-10-16T01:23:15.780491" elapsed="0.011386"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:15.779546" elapsed="0.012494"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:15.793184" 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-10-16T01:23:15.792567" elapsed="0.000716"/>
</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-10-16T01:23:15.801575" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:15.800732" elapsed="0.000906"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:15.802739" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:15.802056" elapsed="0.000744"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:15.802926" elapsed="0.000068"/>
</return>
<msg time="2026-10-16T01:23:15.803245" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:15.799836" elapsed="0.003464"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:15.803655" elapsed="0.000362"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:15.805196" 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-10-16T01:23:15.804421" elapsed="0.000835"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:15.806210" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:15.805608" elapsed="0.000660"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:15.807195" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:15.806602" elapsed="0.000649"/>
</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-10-16T01:23:15.816905" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:15.815252" elapsed="0.001776"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:15.817166" elapsed="0.000143"/>
</return>
<msg time="2026-10-16T01:23:15.817992" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:15.811619" elapsed="0.006516"/>
</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-10-16T01:23:15.843911" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:15.843451" elapsed="0.000498"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:15.845040" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:15.844688" elapsed="0.000459">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:15.845267" 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-10-16T01:23:15.844214" elapsed="0.001084"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:15.846030" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:15.845537" elapsed="0.000537"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:15.846497" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:15.846731" 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-10-16T01:23:15.846338" elapsed="0.000428"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:15.847366" 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-10-16T01:23:15.847055" elapsed="0.000369"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:15.848688" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:15.848370" elapsed="0.000397"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:15.849576" 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-10-16T01:23:15.849029" elapsed="0.000582"/>
</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-10-16T01:23:15.850099" elapsed="0.000030"/>
</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-10-16T01:23:15.850360" 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-10-16T01:23:15.850670" elapsed="0.000048"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:15.849913" elapsed="0.000854"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:15.849672" elapsed="0.001138"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:15.850884" elapsed="0.000038"/>
</return>
<msg time="2026-10-16T01:23:15.851099" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:15.847899" elapsed="0.003239"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:15.847509" elapsed="0.003681"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:15.851430" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:15.851233" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:15.847485" elapsed="0.004016"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:15.852088" 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-10-16T01:23:15.851656" elapsed="0.000458"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:15.852157" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:15.842742" elapsed="0.009515"/>
</kw>
<msg time="2026-10-16T01:23:15.852305" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:15.837050" elapsed="0.015301"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:15.856179" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:15.859982" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:15.863776" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:15.863968" elapsed="0.000020"/>
</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-10-16T01:23:15.864151" elapsed="0.000019"/>
</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-10-16T01:23:15.864492" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:15.864350" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:15.864337" elapsed="0.000228"/>
</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-10-16T01:23:15.864736" 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-10-16T01:23:15.864927" 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-10-16T01:23:15.865089" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:15.864310" elapsed="0.000827"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:15.864220" elapsed="0.000974"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:15.865351" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:15.865421" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:23:15.865526" 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-10-16T01:23:15.836195" elapsed="0.029354"/>
</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-10-16T01:23:15.866782" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:15.866575" elapsed="0.000268">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:15.866940" 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-10-16T01:23:15.866250" elapsed="0.000714"/>
</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-10-16T01:23:15.867248" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:15.867032" elapsed="0.000268"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:15.867762" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:15.867482" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:15.867322" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:15.867015" elapsed="0.000824"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:15.868357" 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-10-16T01:23:15.868010" elapsed="0.000371"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:15.868426" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:15.868550" 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-manganese/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-10-16T01:23:15.865836" elapsed="0.002737"/>
</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-10-16T01:23:15.869655" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:15.869467" elapsed="0.000262">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:15.869814" 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-10-16T01:23:15.869151" elapsed="0.000686"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:15.870017" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:23:15.869916" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:15.869899" elapsed="0.000196"/>
</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-10-16T01:23:15.870248" elapsed="0.000020"/>
</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-10-16T01:23:15.870421" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:15.870482" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:23:15.870607" 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-manganese/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-10-16T01:23:15.868837" elapsed="0.001794"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:15.873506" 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-10-16T01:23:15.873275" elapsed="0.000275"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:15.874022" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:15.873757" 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-10-16T01:23:15.878932" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:15.879026" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:15.879139" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:15.874359" elapsed="0.005158">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:15.874132" elapsed="0.005468">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:15.879800" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:15.879630" elapsed="0.000243"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:15.874114" elapsed="0.005782">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:15.880245" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:15.880367" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:15.880333" elapsed="0.000073"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:15.880316" elapsed="0.000110"/>
</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-10-16T01:23:15.880562" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:15.880625" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:23:15.872531" elapsed="0.008214">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:15.880814" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:23:15.826501" elapsed="0.054456">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:15.881345" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:15.881125" elapsed="0.000303"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:15.881078" elapsed="0.000392"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:15.881552" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:23:15.822943" elapsed="0.058797">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:15.818633" elapsed="0.063209">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:15.818585" elapsed="0.063343">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:15.882181" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:15.882524" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:15.882868" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:15.883220" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:15.883683" elapsed="0.000050"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:15.884045" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:15.884393" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:15.884635" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:23:15.809889" elapsed="0.074891">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:15.884845" elapsed="0.000050"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:15.808166" elapsed="0.076807">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:15.885194" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:15.885053" elapsed="0.000191"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:15.885402" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:15.885266" elapsed="0.000185"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:15.885615" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:15.885473" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:15.885037" elapsed="0.000646"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:15.807785" elapsed="0.077963">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:15.807353" elapsed="0.078452">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:15.885868" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:15.797481" elapsed="0.088481">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:15.886137" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:15.886356" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:15.886215" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:15.886200" elapsed="0.000225"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:15.886555" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:15.886813" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:15.886890" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:15.795761" elapsed="0.091222">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:15.795230" elapsed="0.091816">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:15.794956" elapsed="0.092138">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:15.793794" elapsed="0.093379">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:15.887421" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:15.770754" elapsed="0.116772">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:16.907395" elapsed="0.000462"/>
</kw>
<msg time="2026-10-16T01:23:16.908079" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:16.906110" elapsed="0.002101"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:16.905158" elapsed="0.003215"/>
</kw>
<msg time="2026-10-16T01:23:16.908466" 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-10-16T01:23:16.898165" elapsed="0.010390"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:16.897244" elapsed="0.011490"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:16.909807" 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-10-16T01:23:16.909255" elapsed="0.000680"/>
</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-10-16T01:23:16.916578" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:16.915805" elapsed="0.000829"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:16.917636" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:16.917030" elapsed="0.000660"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:16.917825" elapsed="0.000090"/>
</return>
<msg time="2026-10-16T01:23:16.918153" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:16.914978" elapsed="0.003227"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:16.918538" elapsed="0.000355"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:16.920042" 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-10-16T01:23:16.919270" elapsed="0.000829"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:16.921009" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:16.920429" elapsed="0.000634"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:16.921961" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:16.921374" elapsed="0.000643"/>
</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-10-16T01:23:16.931131" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:16.929525" elapsed="0.001717"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:16.931371" elapsed="0.000133"/>
</return>
<msg time="2026-10-16T01:23:16.932160" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:16.926118" elapsed="0.006171"/>
</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-10-16T01:23:16.955256" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:16.954811" elapsed="0.000482"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:16.956417" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:16.956100" elapsed="0.000426">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:16.956646" 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-10-16T01:23:16.955599" elapsed="0.001079"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:16.957386" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:16.956951" elapsed="0.000470"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:16.957837" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:16.958075" 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-10-16T01:23:16.957651" elapsed="0.000465"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:16.958677" 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-10-16T01:23:16.958446" 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-10-16T01:23:16.959781" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:16.959405" elapsed="0.000419"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:16.960283" 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-10-16T01:23:16.960017" 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-10-16T01:23:16.960595" 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-10-16T01:23:16.960796" 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-10-16T01:23:16.960996" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:16.960463" elapsed="0.000586"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:16.960351" elapsed="0.000730"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:16.961123" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:16.961253" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:16.959067" elapsed="0.002210"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:16.958797" elapsed="0.002509"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:16.961477" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:16.961333" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:16.958779" elapsed="0.002768"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:16.962138" 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-10-16T01:23:16.961718" elapsed="0.000450"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:16.962212" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:16.954089" elapsed="0.008222"/>
</kw>
<msg time="2026-10-16T01:23:16.962360" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:16.948279" elapsed="0.014127"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:16.966257" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:16.970052" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:16.973885" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:16.974064" elapsed="0.000020"/>
</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-10-16T01:23:16.974247" elapsed="0.000019"/>
</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-10-16T01:23:16.974588" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:16.974446" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:16.974433" elapsed="0.000228"/>
</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-10-16T01:23:16.974830" 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-10-16T01:23:16.975044" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:16.975204" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:16.974406" elapsed="0.000848"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:16.974317" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:16.975427" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:16.975494" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:23:16.975600" 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-10-16T01:23:16.947387" elapsed="0.028236"/>
</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-10-16T01:23:16.976751" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:16.976541" elapsed="0.000271">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:16.976910" 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-10-16T01:23:16.976218" elapsed="0.000716"/>
</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-10-16T01:23:16.977224" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:16.976998" elapsed="0.000278"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:16.977740" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:16.977459" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:16.977299" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:16.976981" elapsed="0.000837"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:16.978332" 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-10-16T01:23:16.977990" elapsed="0.000366"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:16.978402" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:23:16.978524" 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-manganese/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-10-16T01:23:16.975921" elapsed="0.002626"/>
</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-10-16T01:23:16.979675" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:16.979484" elapsed="0.000267">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:16.979836" 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-10-16T01:23:16.979164" elapsed="0.000695"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:16.980040" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:23:16.979941" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:16.979924" elapsed="0.000193"/>
</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-10-16T01:23:16.980269" 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-10-16T01:23:16.980442" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:16.980503" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:16.980626" 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-manganese/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-10-16T01:23:16.978847" elapsed="0.001802"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:16.982087" 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-10-16T01:23:16.981847" elapsed="0.000281"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:16.982531" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:16.982314" elapsed="0.000257"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:23:16.986952" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:16.987007" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:16.987108" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:16.982888" elapsed="0.004602">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:16.982631" elapsed="0.004938">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:16.987767" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:16.987599" elapsed="0.000228"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:16.982614" elapsed="0.005235">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:16.988210" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:16.988329" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:16.988296" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:16.988280" elapsed="0.000107"/>
</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-10-16T01:23:16.988523" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:16.988586" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:23:16.981130" elapsed="0.007558">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:16.988810" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:23:16.937619" elapsed="0.051332">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:16.989340" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:16.989121" elapsed="0.000302"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:16.989073" elapsed="0.000392"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:16.989548" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:23:16.935412" elapsed="0.054326">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:16.932792" elapsed="0.057049">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:16.932746" elapsed="0.057179">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:16.990179" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:16.990526" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:16.990853" elapsed="0.000033"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:16.991214" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:16.991638" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:16.991993" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:16.992339" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:16.992573" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:23:16.924759" elapsed="0.067915">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:16.992775" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:16.922848" elapsed="0.070145">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:16.993226" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:16.993078" elapsed="0.000199"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:16.993437" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:16.993299" elapsed="0.000187"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:16.993650" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:16.993507" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:16.993062" elapsed="0.000684"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:16.922482" elapsed="0.071302">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:16.922113" elapsed="0.071725">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:16.993904" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:16.913574" elapsed="0.080455">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:16.994208" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:16.994432" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:16.994289" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:16.994273" elapsed="0.000228"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:16.994627" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:16.994891" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:16.994954" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:16.911992" elapsed="0.083055">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:16.911470" elapsed="0.083641">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:16.911211" elapsed="0.083948">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:16.910396" elapsed="0.084846">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:16.995450" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:16.888387" elapsed="0.107167">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:18.015554" elapsed="0.000495"/>
</kw>
<msg time="2026-10-16T01:23:18.016174" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:18.014133" elapsed="0.002169"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:18.013180" elapsed="0.003282"/>
</kw>
<msg time="2026-10-16T01:23:18.016553" 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-10-16T01:23:18.006317" elapsed="0.010326"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:18.005392" elapsed="0.011449"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:18.017920" 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-10-16T01:23:18.017353" elapsed="0.000663"/>
</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-10-16T01:23:18.024625" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:18.023823" elapsed="0.000860"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:18.025671" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:18.025071" elapsed="0.000685"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:18.026007" elapsed="0.000068"/>
</return>
<msg time="2026-10-16T01:23:18.026343" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:18.023008" elapsed="0.003386"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:18.026759" elapsed="0.000315"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:18.028177" 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-10-16T01:23:18.027445" elapsed="0.000788"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:18.029132" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:18.028562" elapsed="0.000623"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:18.030070" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:18.029496" elapsed="0.000626"/>
</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-10-16T01:23:18.039361" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:18.037982" elapsed="0.001488"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:18.039595" elapsed="0.000324"/>
</return>
<msg time="2026-10-16T01:23:18.040362" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:18.034191" elapsed="0.006295"/>
</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-10-16T01:23:18.064104" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:18.063628" elapsed="0.000514"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:18.065153" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:18.064822" elapsed="0.000437">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:18.065377" 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-10-16T01:23:18.064361" elapsed="0.001047"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:18.066112" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:18.065643" elapsed="0.000505"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:18.066534" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:18.066759" 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-10-16T01:23:18.066374" elapsed="0.000418"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:18.067387" 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-10-16T01:23:18.067079" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:18.068971" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:18.068607" elapsed="0.000421"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:18.069648" 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-10-16T01:23:18.069319" elapsed="0.000352"/>
</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-10-16T01:23:18.069997" elapsed="0.000020"/>
</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-10-16T01:23:18.070182" 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-10-16T01:23:18.070365" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:18.069851" elapsed="0.000565"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:18.069732" elapsed="0.000715"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:18.070489" elapsed="0.000028"/>
</return>
<msg time="2026-10-16T01:23:18.070680" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:18.068131" elapsed="0.002588"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:18.067537" elapsed="0.003212"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:18.070935" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:18.070776" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:18.067510" elapsed="0.003497"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:18.071561" 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-10-16T01:23:18.071164" elapsed="0.000422"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:18.071630" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:18.062934" elapsed="0.008815"/>
</kw>
<msg time="2026-10-16T01:23:18.071799" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:18.057220" elapsed="0.014625"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:18.075660" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:18.079452" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:18.083228" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:18.083416" elapsed="0.000020"/>
</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-10-16T01:23:18.083590" elapsed="0.000019"/>
</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-10-16T01:23:18.083962" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:18.083805" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:18.083791" 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-10-16T01:23:18.084188" elapsed="0.000018"/>
</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-10-16T01:23:18.084361" elapsed="0.000018"/>
</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-10-16T01:23:18.084517" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:18.083764" elapsed="0.000801"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:18.083658" elapsed="0.000930"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:18.084752" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:18.084821" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:18.084940" 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-10-16T01:23:18.056280" elapsed="0.028684"/>
</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-10-16T01:23:18.086116" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:18.085920" elapsed="0.000255">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:18.086258" 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-10-16T01:23:18.085566" elapsed="0.000714"/>
</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-10-16T01:23:18.086560" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:18.086343" elapsed="0.000269"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:18.087104" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:18.086823" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:18.086634" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:18.086326" elapsed="0.000857"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:18.087674" 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-10-16T01:23:18.087340" elapsed="0.000373"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:18.087760" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:18.087899" 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-manganese/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-10-16T01:23:18.085270" elapsed="0.002653"/>
</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-10-16T01:23:18.089005" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:18.088799" elapsed="0.000264">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:18.089150" 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-10-16T01:23:18.088466" elapsed="0.000710"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:18.089501" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:23:18.089397" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:18.089223" elapsed="0.000362"/>
</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-10-16T01:23:18.089760" 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-10-16T01:23:18.089961" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:18.090026" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:18.090150" 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-manganese/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-10-16T01:23:18.088171" elapsed="0.002002"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:18.091406" 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-10-16T01:23:18.091183" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:18.091869" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:18.091634" 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-10-16T01:23:18.096248" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:18.096303" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:18.096438" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:18.092213" elapsed="0.004642">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:18.091986" elapsed="0.004967">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:18.097134" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:18.096983" elapsed="0.000210"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:18.091969" elapsed="0.005249">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:18.097564" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:18.097683" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:18.097650" elapsed="0.000090"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:18.097634" elapsed="0.000127"/>
</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-10-16T01:23:18.097912" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:18.097975" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:23:18.090452" elapsed="0.007628">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:18.098147" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:23:18.046611" elapsed="0.051675">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:18.098683" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:18.098457" elapsed="0.000339"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:18.098409" elapsed="0.000427"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:18.098935" elapsed="0.000037"/>
</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="FAIL" start="2026-10-16T01:23:18.044369" elapsed="0.054734">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:18.041098" elapsed="0.058109">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:18.041052" elapsed="0.058227">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:18.099531" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:18.099918" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:18.100237" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:18.100610" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:18.101088" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:18.101408" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:18.101785" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:18.102074" elapsed="0.000019"/>
</return>
<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="FAIL" start="2026-10-16T01:23:18.032850" elapsed="0.069329">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:18.102241" elapsed="0.000014"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:18.030977" elapsed="0.071353">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:18.102554" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:18.102412" elapsed="0.000192"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:18.102788" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:18.102626" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:18.103028" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:18.102861" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:18.102396" elapsed="0.000700"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:18.030590" elapsed="0.072545">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:18.030219" elapsed="0.072970">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:18.103238" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:18.021605" elapsed="0.081733">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:18.103513" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:18.103828" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:18.103600" elapsed="0.000291"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:18.103585" elapsed="0.000329"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:18.104044" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:18.104215" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:18.104273" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:18.020034" elapsed="0.084333">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:18.019513" elapsed="0.084916">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:18.019259" elapsed="0.085220">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:18.018465" elapsed="0.086098">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:18.104847" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:17.996482" elapsed="0.108486">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:19.124754" elapsed="0.000468"/>
</kw>
<msg time="2026-10-16T01:23:19.125367" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:19.123460" elapsed="0.002031"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:19.122234" elapsed="0.003414"/>
</kw>
<msg time="2026-10-16T01:23:19.125773" 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-10-16T01:23:19.115479" elapsed="0.010386"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:19.114583" elapsed="0.011477"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:19.127123" 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-10-16T01:23:19.126544" elapsed="0.000671"/>
</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-10-16T01:23:19.134157" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:19.133258" elapsed="0.000958"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:19.135227" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:19.134552" elapsed="0.000731"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:19.135379" elapsed="0.000064"/>
</return>
<msg time="2026-10-16T01:23:19.135672" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:19.132415" elapsed="0.003339"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:19.136113" elapsed="0.000297"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:19.137512" 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-10-16T01:23:19.136815" elapsed="0.000752"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:19.138464" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:19.137953" elapsed="0.000565"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:19.139398" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:19.138866" elapsed="0.000584"/>
</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-10-16T01:23:19.148239" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:19.146806" elapsed="0.001541"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:19.148475" elapsed="0.000131"/>
</return>
<msg time="2026-10-16T01:23:19.149107" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:19.143485" elapsed="0.005748"/>
</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-10-16T01:23:19.173268" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:19.172826" elapsed="0.000479"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:19.174315" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:19.174002" elapsed="0.000418">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:19.174538" 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-10-16T01:23:19.173524" elapsed="0.001045"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:19.175366" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:19.174929" elapsed="0.000473"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:19.175811" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:19.176039" 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-10-16T01:23:19.175628" elapsed="0.000445"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:19.176652" 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-10-16T01:23:19.176342" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:19.178221" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:19.177880" elapsed="0.000398"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:19.178919" 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-10-16T01:23:19.178520" elapsed="0.000435"/>
</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-10-16T01:23:19.179399" elapsed="0.000034"/>
</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-10-16T01:23:19.179637" elapsed="0.000022"/>
</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-10-16T01:23:19.179833" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:19.179178" elapsed="0.000723"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:19.179014" elapsed="0.000919"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:19.179974" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:19.180103" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:19.177369" elapsed="0.002757"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:19.176819" elapsed="0.003341"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:19.180332" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:19.180188" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:19.176795" elapsed="0.003606"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:19.180993" 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-10-16T01:23:19.180563" elapsed="0.000456"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:19.181063" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:19.172111" elapsed="0.009051"/>
</kw>
<msg time="2026-10-16T01:23:19.181210" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:19.166417" elapsed="0.014839"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:19.185095" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:19.188877" elapsed="0.000036"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:19.192663" elapsed="0.000047"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:19.192918" 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-10-16T01:23:19.193099" 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-10-16T01:23:19.193441" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:19.193301" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:19.193287" elapsed="0.000228"/>
</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-10-16T01:23:19.193666" elapsed="0.000019"/>
</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-10-16T01:23:19.193860" 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-10-16T01:23:19.194038" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:19.193260" elapsed="0.000827"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:19.193169" elapsed="0.000942"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:19.194262" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:19.194330" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:19.194434" 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-10-16T01:23:19.165560" elapsed="0.028898"/>
</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-10-16T01:23:19.195565" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:19.195371" elapsed="0.000257">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:19.195726" 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-10-16T01:23:19.195052" elapsed="0.000699"/>
</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-10-16T01:23:19.196048" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:19.195814" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:19.196547" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:19.196284" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:19.196124" elapsed="0.000478"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:19.195797" elapsed="0.000825"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:19.197155" 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-10-16T01:23:19.196797" elapsed="0.000382"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:19.197224" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:19.197347" 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-manganese/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-10-16T01:23:19.194738" elapsed="0.002632"/>
</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-10-16T01:23:19.198472" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:19.198274" elapsed="0.000257">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:19.198614" 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-10-16T01:23:19.197950" elapsed="0.000686"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:19.200693" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-10-16T01:23:19.200575" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:19.198737" elapsed="0.002057"/>
</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-10-16T01:23:19.200966" 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-10-16T01:23:19.201140" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:19.201201" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:19.201334" 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-manganese/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-10-16T01:23:19.197617" elapsed="0.003740"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:19.202583" 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-10-16T01:23:19.202356" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:19.203063" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:19.202827" elapsed="0.000276"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:23:19.208008" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:19.208064" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:19.208177" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:19.203387" elapsed="0.005180">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:19.203162" elapsed="0.005485">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:19.208850" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:19.208678" elapsed="0.000246"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:19.203146" elapsed="0.005801">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:19.209288" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:19.209409" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:19.209375" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:19.209359" elapsed="0.000108"/>
</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-10-16T01:23:19.209602" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:19.209665" elapsed="0.000013"/>
</return>
<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="FAIL" start="2026-10-16T01:23:19.201630" elapsed="0.008154">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:19.209853" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:23:19.155837" elapsed="0.054160">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:19.210389" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:19.210165" elapsed="0.000341"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:19.210118" elapsed="0.000431"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:19.210632" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:23:19.153648" elapsed="0.057178">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:19.149691" elapsed="0.061252">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:19.149645" elapsed="0.061371">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:19.211266" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:19.211615" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:19.211968" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:19.212317" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:19.212768" elapsed="0.000028"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:19.213114" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:19.213466" elapsed="0.000019"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:19.213737" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:23:19.142163" elapsed="0.071677">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:19.213917" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:19.140302" elapsed="0.073704">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:19.214226" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:19.214087" elapsed="0.000188"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:19.214432" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:19.214298" elapsed="0.000182"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:19.214641" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:19.214501" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:19.214071" elapsed="0.000664"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:19.139967" elapsed="0.074808">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:19.139543" elapsed="0.075285">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:19.214875" elapsed="0.000029"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:19.131047" elapsed="0.083935">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:19.215156" elapsed="0.000050"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:19.215409" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:19.215269" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:19.215253" elapsed="0.000225"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:19.215601" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:19.215902" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:19.215965" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:19.129329" elapsed="0.086728">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:19.128841" elapsed="0.087278">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:19.128535" elapsed="0.087633">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:19.127730" elapsed="0.088524">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:19.216461" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:19.105836" elapsed="0.110730">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:20.236794" elapsed="0.000464"/>
</kw>
<msg time="2026-10-16T01:23:20.237402" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:20.235448" elapsed="0.002085"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:20.234504" elapsed="0.003188"/>
</kw>
<msg time="2026-10-16T01:23:20.237825" 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-10-16T01:23:20.227632" elapsed="0.010313"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:20.226748" elapsed="0.011352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:20.239265" 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-10-16T01:23:20.238649" elapsed="0.000724"/>
</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-10-16T01:23:20.246394" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:20.245560" elapsed="0.000894"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:20.247478" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:20.246840" elapsed="0.000693"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:20.247632" elapsed="0.000066"/>
</return>
<msg time="2026-10-16T01:23:20.247990" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:20.244643" elapsed="0.003401"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:20.248376" elapsed="0.000290"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:20.249966" 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-10-16T01:23:20.249102" elapsed="0.000924"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:20.250927" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:20.250358" elapsed="0.000625"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:20.251840" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:20.251297" elapsed="0.000620"/>
</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-10-16T01:23:20.260687" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:20.259283" elapsed="0.001561"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:20.261001" elapsed="0.000135"/>
</return>
<msg time="2026-10-16T01:23:20.261589" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:20.256009" elapsed="0.005745"/>
</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-10-16T01:23:20.285520" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:20.285095" elapsed="0.000461"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:20.286575" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:20.286268" elapsed="0.000420">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:20.286834" 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-10-16T01:23:20.285796" elapsed="0.001070"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:20.287563" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:20.287127" elapsed="0.000471"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:20.288027" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:20.288231" 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-10-16T01:23:20.287847" elapsed="0.000417"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:20.288870" 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-10-16T01:23:20.288536" elapsed="0.000411"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:20.290102" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:20.289853" elapsed="0.000291"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:20.290738" 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-10-16T01:23:20.290319" elapsed="0.000446"/>
</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-10-16T01:23:20.291071" 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-10-16T01:23:20.291258" elapsed="0.000022"/>
</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-10-16T01:23:20.291440" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:20.290938" elapsed="0.000554"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:20.290809" elapsed="0.000713"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:20.291564" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:20.291695" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:20.289431" elapsed="0.002303"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:20.289034" elapsed="0.002729"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:20.291952" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:20.291790" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:20.289010" elapsed="0.003015"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:20.292580" 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-10-16T01:23:20.292181" elapsed="0.000458"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:20.292686" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:20.284357" elapsed="0.008448"/>
</kw>
<msg time="2026-10-16T01:23:20.292853" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:20.278608" elapsed="0.014305"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:20.296773" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:20.300593" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:20.304432" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:20.304608" elapsed="0.000020"/>
</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-10-16T01:23:20.304800" 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-10-16T01:23:20.305159" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:20.305018" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:20.305004" elapsed="0.000229"/>
</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-10-16T01:23:20.305386" elapsed="0.000019"/>
</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-10-16T01:23:20.305562" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:20.305736" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:20.304977" elapsed="0.000810"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:20.304869" elapsed="0.000941"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:20.305976" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:20.306045" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:20.306148" 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-10-16T01:23:20.277753" elapsed="0.028419"/>
</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-10-16T01:23:20.307318" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:20.307126" elapsed="0.000251">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:20.307460" 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-10-16T01:23:20.306784" elapsed="0.000698"/>
</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-10-16T01:23:20.307779" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:20.307545" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:20.308298" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:20.308029" elapsed="0.000296"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:20.307855" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:20.307528" elapsed="0.000850"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:20.308937" 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-10-16T01:23:20.308551" elapsed="0.000413"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:20.309010" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:20.309142" 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-manganese/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-10-16T01:23:20.306436" elapsed="0.002730"/>
</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-10-16T01:23:20.310249" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:20.310059" elapsed="0.000249">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:20.310395" 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-10-16T01:23:20.309725" elapsed="0.000693"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:20.310579" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:23:20.310481" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:20.310465" elapsed="0.000192"/>
</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-10-16T01:23:20.310824" 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-10-16T01:23:20.311015" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:20.311077" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:20.311201" 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-manganese/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-10-16T01:23:20.309412" elapsed="0.001812"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:20.312641" 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-10-16T01:23:20.312415" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:20.313130" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:20.312891" 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-10-16T01:23:20.318167" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:20.318222" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:20.318324" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:20.313453" elapsed="0.005244">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:20.313231" elapsed="0.005601">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:20.319030" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:20.318864" elapsed="0.000226"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:20.313214" elapsed="0.005898">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:20.319454" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:20.319574" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:20.319541" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:20.319525" elapsed="0.000108"/>
</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-10-16T01:23:20.319787" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:20.319851" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:23:20.311682" elapsed="0.008285">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:20.320035" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:23:20.267818" elapsed="0.052344">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:20.320550" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:20.320332" elapsed="0.000300"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:20.320282" elapsed="0.000392"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:20.320786" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:23:20.265568" elapsed="0.055398">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:20.262248" elapsed="0.058818">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:20.262203" elapsed="0.058935">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:20.321386" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:20.321745" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:20.322066" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:20.322416" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:20.322876" elapsed="0.000044"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:20.323216" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:20.323560" elapsed="0.000019"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:20.323828" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:23:20.254605" elapsed="0.069343">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:20.324042" elapsed="0.000017"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:20.252751" elapsed="0.071384">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:20.324356" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:20.324215" elapsed="0.000191"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:20.324565" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:20.324428" elapsed="0.000186"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:20.324807" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:20.324636" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:20.324199" elapsed="0.000679"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:20.252390" elapsed="0.072538">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:20.252014" elapsed="0.072994">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:20.325068" elapsed="0.000016"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:20.243276" elapsed="0.081885">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:20.325336" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:20.325555" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:20.325414" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:20.325399" elapsed="0.000224"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:20.325867" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:20.326053" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:20.326112" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:20.241432" elapsed="0.084786">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:20.240962" elapsed="0.085319">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:20.240648" elapsed="0.085682">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:20.239872" elapsed="0.086551">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:20.326632" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:20.217382" elapsed="0.109372">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:21.347063" elapsed="0.000457"/>
</kw>
<msg time="2026-10-16T01:23:21.347647" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:21.345772" elapsed="0.002216"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:21.344618" elapsed="0.003544"/>
</kw>
<msg time="2026-10-16T01:23:21.348258" 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-10-16T01:23:21.338008" elapsed="0.010355"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:21.337097" elapsed="0.011430"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:21.349610" 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-10-16T01:23:21.349077" elapsed="0.000655"/>
</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-10-16T01:23:21.356557" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:21.355749" elapsed="0.000865"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:21.357606" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:21.357003" elapsed="0.000657"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:21.357791" elapsed="0.000065"/>
</return>
<msg time="2026-10-16T01:23:21.358139" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:21.354943" elapsed="0.003264"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:21.358588" elapsed="0.000356"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:21.360048" 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-10-16T01:23:21.359314" elapsed="0.000791"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:21.360998" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:21.360431" elapsed="0.000623"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:21.361946" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:21.361364" elapsed="0.000638"/>
</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-10-16T01:23:21.371176" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:21.369696" elapsed="0.001593"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:21.371422" elapsed="0.000108"/>
</return>
<msg time="2026-10-16T01:23:21.371871" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:21.366143" elapsed="0.005826"/>
</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-10-16T01:23:21.394878" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:21.394423" elapsed="0.000514"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:21.395961" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:21.395598" elapsed="0.000470">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:21.396188" 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-10-16T01:23:21.395158" elapsed="0.001061"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:21.396852" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:21.396475" elapsed="0.000402"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:21.397185" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:21.397424" 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-10-16T01:23:21.397069" elapsed="0.000379"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:21.397893" 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-10-16T01:23:21.397643" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:21.399054" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:21.398624" elapsed="0.000472"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:21.399564" 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-10-16T01:23:21.399275" elapsed="0.000321"/>
</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-10-16T01:23:21.399965" 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-10-16T01:23:21.400153" 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-10-16T01:23:21.400334" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:21.399814" elapsed="0.000572"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:21.399652" elapsed="0.000764"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:21.400459" elapsed="0.000029"/>
</return>
<msg time="2026-10-16T01:23:21.400595" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:21.398288" elapsed="0.002329"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:21.398024" elapsed="0.002622"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:21.400832" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:21.400672" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:21.398004" elapsed="0.002899"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:21.401470" 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-10-16T01:23:21.401072" elapsed="0.000424"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:21.401539" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:21.393686" elapsed="0.007952"/>
</kw>
<msg time="2026-10-16T01:23:21.401686" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:21.387931" elapsed="0.013818"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:21.405569" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:21.409444" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:21.413282" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:21.413495" 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-10-16T01:23:21.413676" elapsed="0.000019"/>
</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-10-16T01:23:21.414056" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:21.413894" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:21.413880" 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-10-16T01:23:21.414287" 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-10-16T01:23:21.414493" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:21.414652" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:21.413854" elapsed="0.000861"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:21.413762" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:21.414892" elapsed="0.000035"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:21.414977" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:23:21.415083" 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-10-16T01:23:21.387018" elapsed="0.028088"/>
</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-10-16T01:23:21.416218" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:21.416021" elapsed="0.000264">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:21.416386" 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-10-16T01:23:21.415667" elapsed="0.000748"/>
</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-10-16T01:23:21.416717" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:21.416487" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:21.417251" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:21.416984" elapsed="0.000297"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:21.416794" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:21.416471" elapsed="0.000874"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:21.417879" 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-10-16T01:23:21.417519" elapsed="0.000384"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:21.417963" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:23:21.418088" 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-manganese/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-10-16T01:23:21.415372" elapsed="0.002739"/>
</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-10-16T01:23:21.419194" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:21.419003" elapsed="0.000250">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:21.419335" 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-10-16T01:23:21.418653" elapsed="0.000712"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:21.419530" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:23:21.419429" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:21.419410" elapsed="0.000196"/>
</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-10-16T01:23:21.419775" elapsed="0.000020"/>
</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-10-16T01:23:21.420006" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:21.420069" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:23:21.420194" 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-manganese/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-10-16T01:23:21.418359" elapsed="0.001858"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:21.421662" 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-10-16T01:23:21.421428" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:21.422146" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:21.421924" elapsed="0.000262"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:23:21.426736" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:21.426791" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:21.426892" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:21.422467" elapsed="0.004820">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:21.422246" elapsed="0.005122">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:21.427546" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:21.427398" elapsed="0.000207"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:21.422230" elapsed="0.005396">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:21.428004" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:21.428124" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:21.428091" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:21.428075" elapsed="0.000108"/>
</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-10-16T01:23:21.428319" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:21.428385" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:23:21.420664" elapsed="0.007826">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:21.428557" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:23:21.377102" elapsed="0.051627">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:21.429144" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:21.428920" elapsed="0.000305"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:21.428857" elapsed="0.000412"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:21.429354" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:23:21.374925" elapsed="0.054627">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:21.372268" elapsed="0.057386">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:21.372239" elapsed="0.057513">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:21.430026" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:21.430408" elapsed="0.000025"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:21.430756" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:21.431134" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:21.431571" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:21.431928" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:21.432313" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:21.432568" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:23:21.364675" elapsed="0.067997">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:21.432765" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:21.362830" elapsed="0.070027">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:21.433093" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:21.432952" elapsed="0.000190"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:21.433316" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:21.433164" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:21.433555" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:21.433405" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:21.432936" elapsed="0.000686"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:21.362465" elapsed="0.071195">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:21.362095" elapsed="0.071704">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:21.433852" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:21.353407" elapsed="0.080553">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:21.434137" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:21.434361" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:21.434215" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:21.434200" elapsed="0.000230"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:21.434601" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:21.434858" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:21.434935" elapsed="0.000015"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:21.351764" elapsed="0.083268">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:21.351274" elapsed="0.083823">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:21.351014" elapsed="0.084132">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:21.350210" elapsed="0.085021">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:21.435485" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:21.327611" elapsed="0.107981">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:22.455119" elapsed="0.000425"/>
</kw>
<msg time="2026-10-16T01:23:22.455668" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:22.453576" elapsed="0.002251"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:22.452637" elapsed="0.003376"/>
</kw>
<msg time="2026-10-16T01:23:22.456108" 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-10-16T01:23:22.445887" elapsed="0.010313"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:22.445017" elapsed="0.011333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:22.457408" 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-10-16T01:23:22.456864" elapsed="0.000639"/>
</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-10-16T01:23:22.464323" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:22.463518" elapsed="0.000864"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:22.465388" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:22.464752" elapsed="0.000690"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:22.465539" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:23:22.465864" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:22.462677" elapsed="0.003260"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:22.466272" elapsed="0.000285"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:22.467649" 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-10-16T01:23:22.466979" elapsed="0.000757"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:22.468761" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:22.468227" elapsed="0.000588"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:22.469807" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:22.469149" elapsed="0.000714"/>
</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-10-16T01:23:22.478616" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:22.477234" elapsed="0.001549"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:22.478942" elapsed="0.000137"/>
</return>
<msg time="2026-10-16T01:23:22.479511" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:22.473965" elapsed="0.005672"/>
</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-10-16T01:23:22.503200" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:22.502755" elapsed="0.000481"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:22.504268" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:22.503959" elapsed="0.000416">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:22.504494" 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-10-16T01:23:22.503460" elapsed="0.001065"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:22.505236" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:22.504784" elapsed="0.000487"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:22.505661" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:22.505885" 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-10-16T01:23:22.505500" elapsed="0.000434"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:22.506514" 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-10-16T01:23:22.506204" elapsed="0.000367"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:22.508061" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:22.507694" elapsed="0.000424"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:22.508791" 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-10-16T01:23:22.508366" elapsed="0.000450"/>
</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-10-16T01:23:22.509112" 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-10-16T01:23:22.509298" elapsed="0.000022"/>
</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-10-16T01:23:22.509478" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:22.508981" elapsed="0.000549"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:22.508859" elapsed="0.000702"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:22.509601" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:23:22.509746" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:22.507225" elapsed="0.002545"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:22.506847" elapsed="0.002953"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:22.509994" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:22.509826" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:22.506631" elapsed="0.003435"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:22.510627" 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-10-16T01:23:22.510227" elapsed="0.000425"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:22.510695" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:22.502038" elapsed="0.008774"/>
</kw>
<msg time="2026-10-16T01:23:22.510899" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:22.496348" elapsed="0.014610"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:22.514748" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:22.518524" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:22.522304" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:22.522480" elapsed="0.000020"/>
</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-10-16T01:23:22.522656" elapsed="0.000019"/>
</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-10-16T01:23:22.523028" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:22.522872" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:22.522858" elapsed="0.000243"/>
</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-10-16T01:23:22.523255" elapsed="0.000019"/>
</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-10-16T01:23:22.523430" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:22.523588" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:22.522831" elapsed="0.000805"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:22.522741" elapsed="0.000918"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:22.523826" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:22.523895" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:23:22.524015" 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-10-16T01:23:22.495490" elapsed="0.028548"/>
</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-10-16T01:23:22.525149" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:22.524953" elapsed="0.000256">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:22.525328" 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-10-16T01:23:22.524600" elapsed="0.000751"/>
</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-10-16T01:23:22.525634" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:22.525416" elapsed="0.000270"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:22.526167" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:22.525887" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:22.525726" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:22.525399" elapsed="0.000844"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:22.526755" 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-10-16T01:23:22.526401" elapsed="0.000378"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:22.526825" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:22.526963" 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-manganese/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-10-16T01:23:22.524303" elapsed="0.002683"/>
</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-10-16T01:23:22.530015" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:22.527873" elapsed="0.002203">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:22.530160" 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-10-16T01:23:22.527530" elapsed="0.002654"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:22.530347" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:23:22.530248" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:22.530231" elapsed="0.000193"/>
</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-10-16T01:23:22.530574" 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-10-16T01:23:22.530764" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:22.530825" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:22.530968" 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-manganese/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-10-16T01:23:22.527233" elapsed="0.003759"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:22.532219" 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-10-16T01:23:22.531989" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:22.532666" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:22.532447" elapsed="0.000275"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:23:22.537173" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:22.537227" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:22.537336" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:22.533021" elapsed="0.004740">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:22.532784" elapsed="0.005059">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:22.538036" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:22.537873" elapsed="0.000254"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:22.532768" elapsed="0.005384">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:22.538496" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:22.538616" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:22.538582" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:22.538566" elapsed="0.000108"/>
</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-10-16T01:23:22.538826" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:22.538890" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:23:22.531268" elapsed="0.007736">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:22.539071" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:23:22.485756" elapsed="0.053439">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:22.539580" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:22.539362" elapsed="0.000301"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:22.539315" elapsed="0.000421"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:22.539826" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:23:22.483622" elapsed="0.056382">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:22.480164" elapsed="0.059943">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:22.480118" elapsed="0.060060">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:22.540424" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:22.540788" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:22.541112" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:22.541460" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:22.541911" elapsed="0.000034"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:22.542239" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:22.542584" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:22.542840" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:23:22.472556" elapsed="0.070397">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:22.543015" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:22.470693" elapsed="0.072411">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:22.543358" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:22.543218" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:22.543564" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:22.543429" elapsed="0.000184"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:22.543805" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:22.543634" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:22.543201" elapsed="0.000675"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:22.470363" elapsed="0.073551">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:22.469980" elapsed="0.073999">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:22.544027" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:22.461323" elapsed="0.082794">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:22.544291" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:22.544514" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:22.544368" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:22.544353" elapsed="0.000231"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:22.544741" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:22.544913" elapsed="0.000030"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:22.544984" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:22.459666" elapsed="0.085411">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:22.459063" elapsed="0.086075">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:22.458787" elapsed="0.086400">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:22.458012" elapsed="0.087253">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:22.545473" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:22.436355" elapsed="0.109222">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:23.565613" elapsed="0.000690"/>
</kw>
<msg time="2026-10-16T01:23:23.566428" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:23.564338" elapsed="0.002214"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:23.563385" elapsed="0.003364"/>
</kw>
<msg time="2026-10-16T01:23:23.567117" 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-10-16T01:23:23.556293" elapsed="0.010927"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:23.555367" elapsed="0.012018"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:23.568484" 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-10-16T01:23:23.567960" elapsed="0.000616"/>
</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-10-16T01:23:23.575318" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:23.574509" elapsed="0.000868"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:23.576390" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:23.575742" elapsed="0.000712"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:23.576566" elapsed="0.000066"/>
</return>
<msg time="2026-10-16T01:23:23.576900" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:23.573657" elapsed="0.003318"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:23.577309" elapsed="0.000319"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:23.578795" 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-10-16T01:23:23.578053" elapsed="0.000799"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:23.579760" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:23.579207" elapsed="0.000615"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:23.580668" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:23.580160" elapsed="0.000595"/>
</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-10-16T01:23:23.589687" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:23.588249" elapsed="0.001621"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:23.590168" elapsed="0.000136"/>
</return>
<msg time="2026-10-16T01:23:23.590790" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:23.584901" elapsed="0.006022"/>
</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-10-16T01:23:23.615073" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:23.614584" elapsed="0.000526"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:23.616125" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:23.615793" elapsed="0.000438">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:23.616358" 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-10-16T01:23:23.615327" elapsed="0.001062"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:23.617108" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:23.616628" elapsed="0.000516"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:23.617536" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:23.617766" 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-10-16T01:23:23.617374" elapsed="0.000427"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:23.618460" 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-10-16T01:23:23.618092" elapsed="0.000427"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:23.619862" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:23.619511" elapsed="0.000392"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:23.620496" 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-10-16T01:23:23.620094" elapsed="0.000428"/>
</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-10-16T01:23:23.620825" 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-10-16T01:23:23.621026" 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-10-16T01:23:23.621209" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:23.620676" elapsed="0.000585"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:23.620565" elapsed="0.000727"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:23.621333" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:23.621462" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:23.619009" elapsed="0.002476"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:23.618606" elapsed="0.002907"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:23.621685" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:23.621540" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:23.618581" elapsed="0.003191"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:23.622347" 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-10-16T01:23:23.621942" elapsed="0.000430"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:23.622416" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:23.613684" elapsed="0.008832"/>
</kw>
<msg time="2026-10-16T01:23:23.622565" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:23.607831" elapsed="0.014780"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:23.626453" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:23.630443" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:23.634308" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:23.634490" elapsed="0.000020"/>
</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-10-16T01:23:23.634669" elapsed="0.000019"/>
</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-10-16T01:23:23.635082" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:23.634886" elapsed="0.000249"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:23.634873" elapsed="0.000285"/>
</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-10-16T01:23:23.635312" elapsed="0.000019"/>
</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-10-16T01:23:23.635489" elapsed="0.000018"/>
</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-10-16T01:23:23.635648" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:23.634846" elapsed="0.000864"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:23.634755" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:23.635890" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:23.635975" elapsed="0.000016"/>
</return>
<msg time="2026-10-16T01:23:23.636082" 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-10-16T01:23:23.606970" elapsed="0.029136"/>
</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-10-16T01:23:23.637232" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:23.637038" elapsed="0.000254">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:23.637375" 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-10-16T01:23:23.636672" elapsed="0.000726"/>
</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-10-16T01:23:23.637679" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:23.637461" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:23.638218" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:23.637950" elapsed="0.000292"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:23.637770" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:23.637445" elapsed="0.000849"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:23.638805" 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-10-16T01:23:23.638450" elapsed="0.000379"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:23.638875" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:23.639018" 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-manganese/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-10-16T01:23:23.636372" elapsed="0.002670"/>
</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-10-16T01:23:23.640142" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:23.639951" elapsed="0.000250">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:23.640284" 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-10-16T01:23:23.639599" elapsed="0.000707"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:23.640469" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:23:23.640370" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:23.640354" elapsed="0.000192"/>
</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-10-16T01:23:23.640713" 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-10-16T01:23:23.640886" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:23.640963" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:23:23.641087" 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-manganese/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-10-16T01:23:23.639299" elapsed="0.001844"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:23.642648" 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-10-16T01:23:23.642349" elapsed="0.000370"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:23.643264" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:23.642986" 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-10-16T01:23:23.647494" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:23.647552" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:23.647651" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:23.643591" elapsed="0.004488">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:23.643367" elapsed="0.004794">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:23.648342" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:23.648191" elapsed="0.000210"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:23.643350" elapsed="0.005073">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:23.648786" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:23.648907" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:23.648873" elapsed="0.000089"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:23.648857" elapsed="0.000126"/>
</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-10-16T01:23:23.649119" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:23.649182" elapsed="0.000013"/>
</return>
<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="FAIL" start="2026-10-16T01:23:23.641594" elapsed="0.007689">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:23.649350" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:23:23.597053" elapsed="0.052421">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:23.649888" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:23.649643" elapsed="0.000346"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:23.649595" elapsed="0.000436"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:23.650113" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:23:23.594843" elapsed="0.055433">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:23.591422" elapsed="0.059006">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:23.591379" elapsed="0.059125">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:23.650772" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:23.651133" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:23.651444" elapsed="0.000023"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:23.651825" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:23.652271" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:23.652581" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:23.652971" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:23.653209" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:23:23.583505" elapsed="0.069805">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:23.653373" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:23.581586" elapsed="0.071876">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:23.653682" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:23.653542" elapsed="0.000217"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:23.653919" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:23.653781" elapsed="0.000203"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:23.654149" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:23.654006" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:23.653526" elapsed="0.000692"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:23.581251" elapsed="0.073005">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:23.580851" elapsed="0.073459">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:23.654360" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:23.572284" elapsed="0.082171">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:23.654630" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:23.654959" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:23.654788" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:23.654693" elapsed="0.000337"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:23.655160" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:23.655328" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:23.655386" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:23.570630" elapsed="0.084895">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:23.570162" elapsed="0.085427">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:23.569877" elapsed="0.085761">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:23.569088" elapsed="0.086713">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:23.656089" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:23.546381" elapsed="0.109829">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:24.676479" elapsed="0.000553"/>
</kw>
<msg time="2026-10-16T01:23:24.677163" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:24.675175" elapsed="0.002119"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:24.674222" elapsed="0.003239"/>
</kw>
<msg time="2026-10-16T01:23:24.677554" 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-10-16T01:23:24.667255" elapsed="0.010388"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:24.666328" elapsed="0.011506"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:24.679002" 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-10-16T01:23:24.678410" elapsed="0.000687"/>
</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-10-16T01:23:24.685769" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:24.684986" elapsed="0.000843"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:24.686858" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:24.686183" elapsed="0.000730"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:24.687054" elapsed="0.000086"/>
</return>
<msg time="2026-10-16T01:23:24.687410" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:24.684134" elapsed="0.003333"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:24.687838" elapsed="0.000319"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:24.689257" 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-10-16T01:23:24.688524" elapsed="0.000790"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:24.690200" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:24.689640" elapsed="0.000614"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:24.691119" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:24.690562" elapsed="0.000611"/>
</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-10-16T01:23:24.699919" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:24.698490" elapsed="0.001674"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:24.700300" elapsed="0.000138"/>
</return>
<msg time="2026-10-16T01:23:24.701137" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:24.695229" elapsed="0.006039"/>
</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-10-16T01:23:24.724614" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:24.724137" elapsed="0.000518"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:24.725697" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:24.725385" elapsed="0.000438">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:24.725959" 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-10-16T01:23:24.724906" elapsed="0.001086"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:24.726666" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:24.726229" elapsed="0.000492"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:24.727143" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:24.727354" 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-10-16T01:23:24.726976" elapsed="0.000411"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:24.727847" 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-10-16T01:23:24.727605" 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-10-16T01:23:24.728994" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:24.728578" elapsed="0.000458"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:24.729482" 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-10-16T01:23:24.729213" 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-10-16T01:23:24.729818" 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-10-16T01:23:24.730024" 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-10-16T01:23:24.730207" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:24.729670" elapsed="0.000590"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:24.729553" elapsed="0.000737"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:24.730332" elapsed="0.000030"/>
</return>
<msg time="2026-10-16T01:23:24.730468" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:24.728245" elapsed="0.002246"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:24.727976" 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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:24.730688" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:24.730546" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:24.727956" elapsed="0.002819"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:24.731345" 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-10-16T01:23:24.730932" elapsed="0.000439"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:24.731415" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:24.723401" elapsed="0.008114"/>
</kw>
<msg time="2026-10-16T01:23:24.731620" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:24.717674" elapsed="0.013995"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:24.735527" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:24.739336" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:24.743139" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:24.743321" elapsed="0.000020"/>
</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-10-16T01:23:24.743506" elapsed="0.000019"/>
</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-10-16T01:23:24.743870" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:24.743721" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:24.743691" 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-10-16T01:23:24.744122" elapsed="0.000019"/>
</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-10-16T01:23:24.744306" elapsed="0.000018"/>
</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-10-16T01:23:24.744464" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:24.743665" elapsed="0.000848"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:24.743575" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:24.744687" elapsed="0.000034"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:24.744772" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:24.744876" 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-10-16T01:23:24.716771" elapsed="0.028129"/>
</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-10-16T01:23:24.746031" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:24.745820" elapsed="0.000271">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:24.746175" 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-10-16T01:23:24.745478" elapsed="0.000719"/>
</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-10-16T01:23:24.746474" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:24.746259" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:24.747062" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:24.746777" elapsed="0.000309"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:24.746583" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:24.746243" elapsed="0.000897"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:24.747634" 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-10-16T01:23:24.747297" elapsed="0.000361"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:24.747719" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:23:24.747846" 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-manganese/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-10-16T01:23:24.745182" elapsed="0.002687"/>
</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-10-16T01:23:24.749014" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:24.748804" elapsed="0.000270">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:24.749160" 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-10-16T01:23:24.748463" elapsed="0.000720"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:24.749345" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:23:24.749246" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:24.749229" elapsed="0.000193"/>
</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-10-16T01:23:24.749572" elapsed="0.000020"/>
</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-10-16T01:23:24.749761" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:24.749822" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:23:24.749966" 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-manganese/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-10-16T01:23:24.748141" elapsed="0.001849"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:24.751392" 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-10-16T01:23:24.751166" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:24.751856" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:24.751620" elapsed="0.000277"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:23:24.756122" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:24.756177" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:24.756277" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:24.752198" elapsed="0.004458">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:24.751974" elapsed="0.004790">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:24.756961" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:24.756796" elapsed="0.000226"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:24.751956" elapsed="0.005088">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:24.757388" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:24.757547" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:24.757512" elapsed="0.000073"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:24.757495" elapsed="0.000110"/>
</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-10-16T01:23:24.757761" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:24.757825" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:23:24.750442" elapsed="0.007486">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:24.758017" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:23:24.706661" elapsed="0.051503">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:24.758600" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:24.758357" elapsed="0.000327"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:24.758306" elapsed="0.000450"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:24.758845" elapsed="0.000037"/>
</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="FAIL" start="2026-10-16T01:23:24.704507" elapsed="0.054541">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:24.701876" elapsed="0.057274">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:24.701691" elapsed="0.057532">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:24.759476" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:24.759845" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:24.760181" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:24.760531" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:24.761005" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:24.761319" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:24.761666" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:24.761931" elapsed="0.000033"/>
</return>
<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="FAIL" start="2026-10-16T01:23:24.693899" elapsed="0.068151">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:24.762112" elapsed="0.000017"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:24.692025" elapsed="0.070180">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:24.762428" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:24.762287" elapsed="0.000190"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:24.762675" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:24.762500" elapsed="0.000255"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:24.762922" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:24.762778" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:24.762270" elapsed="0.000739"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:24.691635" elapsed="0.071413">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:24.691266" elapsed="0.071835">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:24.763151" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:24.682747" elapsed="0.080499">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:24.763422" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:24.763641" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:24.763501" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:24.763486" elapsed="0.000343"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:24.763992" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:24.764163" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:24.764221" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:24.681132" elapsed="0.083184">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:24.680613" elapsed="0.083766">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:24.680354" elapsed="0.084075">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:24.679550" elapsed="0.084964">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:24.764753" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:24.657081" elapsed="0.107781">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:25.785400" elapsed="0.000473"/>
</kw>
<msg time="2026-10-16T01:23:25.786020" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:25.784033" elapsed="0.002113"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:25.783087" elapsed="0.003218"/>
</kw>
<msg time="2026-10-16T01:23:25.786398" 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-10-16T01:23:25.775553" elapsed="0.010935"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:25.774644" elapsed="0.011992"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:25.787889" 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-10-16T01:23:25.787324" elapsed="0.000680"/>
</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-10-16T01:23:25.794761" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:25.793887" elapsed="0.000938"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:25.795898" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:25.795208" elapsed="0.000766"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:25.796074" elapsed="0.000064"/>
</return>
<msg time="2026-10-16T01:23:25.796367" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:25.793064" elapsed="0.003354"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:25.796776" elapsed="0.000308"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:25.798181" 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-10-16T01:23:25.797456" elapsed="0.000784"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:25.799126" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:25.798567" elapsed="0.000612"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:25.800032" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:25.799486" elapsed="0.000599"/>
</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-10-16T01:23:25.808864" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:25.807368" elapsed="0.001636"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:25.809137" elapsed="0.000133"/>
</return>
<msg time="2026-10-16T01:23:25.809934" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:25.804149" elapsed="0.005948"/>
</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-10-16T01:23:25.832632" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:25.832205" elapsed="0.000464"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:25.833683" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:25.833371" elapsed="0.000437">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:25.833928" 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-10-16T01:23:25.832909" elapsed="0.001177"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:25.834794" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:25.834325" elapsed="0.000504"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:25.835235" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:25.835440" 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-10-16T01:23:25.835076" elapsed="0.000397"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:25.836079" 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-10-16T01:23:25.835825" elapsed="0.000295"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:25.837152" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:25.836907" elapsed="0.000286"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:25.837667" 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-10-16T01:23:25.837366" elapsed="0.000326"/>
</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-10-16T01:23:25.838025" 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-10-16T01:23:25.838211" elapsed="0.000022"/>
</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-10-16T01:23:25.838392" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:25.837864" elapsed="0.000581"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:25.837752" elapsed="0.000723"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:25.838517" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:23:25.838646" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:25.836554" elapsed="0.002115"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:25.836296" 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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:25.838888" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:25.838741" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:25.836164" elapsed="0.002808"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:25.839524" 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-10-16T01:23:25.839128" elapsed="0.000421"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:25.839598" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:25.831472" elapsed="0.008224"/>
</kw>
<msg time="2026-10-16T01:23:25.839761" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:25.825652" elapsed="0.014156"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:25.843614" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:25.847375" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:25.851122" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:25.851299" elapsed="0.000020"/>
</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-10-16T01:23:25.851478" elapsed="0.000018"/>
</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-10-16T01:23:25.851833" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:25.851674" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:25.851660" 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-10-16T01:23:25.852107" 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-10-16T01:23:25.852299" elapsed="0.000018"/>
</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-10-16T01:23:25.852498" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:25.851634" elapsed="0.000918"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:25.851546" elapsed="0.001030"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:25.852744" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:25.852815" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:23:25.852921" 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-10-16T01:23:25.824806" elapsed="0.028138"/>
</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-10-16T01:23:25.854166" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:25.853971" elapsed="0.000256">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:25.854309" 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-10-16T01:23:25.853614" elapsed="0.000718"/>
</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-10-16T01:23:25.854611" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:25.854395" elapsed="0.000268"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:25.855147" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:25.854866" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:25.854686" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:25.854379" elapsed="0.000844"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:25.855737" 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-10-16T01:23:25.855380" elapsed="0.000382"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:25.855808" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:25.855932" 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-manganese/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-10-16T01:23:25.853314" elapsed="0.002653"/>
</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-10-16T01:23:25.858895" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:25.856846" elapsed="0.002123">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:25.859055" 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-10-16T01:23:25.856515" elapsed="0.002563"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:25.859248" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:23:25.859149" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:25.859132" elapsed="0.000193"/>
</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-10-16T01:23:25.859477" 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-10-16T01:23:25.859650" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:25.859727" elapsed="0.000016"/>
</return>
<msg time="2026-10-16T01:23:25.859856" 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-manganese/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-10-16T01:23:25.856215" elapsed="0.003664"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:25.861135" 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-10-16T01:23:25.860896" elapsed="0.000281"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:25.861619" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:25.861398" elapsed="0.000262"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:23:25.865877" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:25.865933" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:25.866056" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:25.861975" elapsed="0.004457">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:25.861739" elapsed="0.004777">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:25.866748" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:25.866553" elapsed="0.000255"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:25.861722" elapsed="0.005108">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:25.867182" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:25.867302" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:25.867270" elapsed="0.000069"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:25.867254" elapsed="0.000105"/>
</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-10-16T01:23:25.867497" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:25.867560" elapsed="0.000013"/>
</return>
<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="FAIL" start="2026-10-16T01:23:25.860167" elapsed="0.007494">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:25.867748" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:23:25.815188" elapsed="0.052689">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:25.868278" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:25.868061" elapsed="0.000300"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:25.868013" elapsed="0.000390"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:25.868485" elapsed="0.000038"/>
</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="FAIL" start="2026-10-16T01:23:25.813002" elapsed="0.055679">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:25.810568" elapsed="0.058241">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:25.810517" elapsed="0.058366">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:25.869144" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:25.869535" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:25.869865" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:25.870234" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:25.870736" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:25.871077" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:25.871425" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:25.871669" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:23:25.802828" elapsed="0.068980">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:25.871870" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:25.800967" elapsed="0.071003">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:25.872190" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:25.872051" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:25.872397" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:25.872262" elapsed="0.000184"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:25.872642" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:25.872468" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:25.872035" elapsed="0.000699"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:25.800563" elapsed="0.072210">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:25.800178" elapsed="0.072648">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:25.872875" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:25.791644" elapsed="0.081335">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:25.873156" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:25.873373" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:25.873234" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:25.873219" elapsed="0.000232"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:25.873575" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:25.873833" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:25.873894" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:25.790037" elapsed="0.083962">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:25.789524" elapsed="0.084537">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:25.789268" elapsed="0.084887">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:25.788456" elapsed="0.085783">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:25.874448" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:25.765619" elapsed="0.108934">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:26.895657" elapsed="0.000494"/>
</kw>
<msg time="2026-10-16T01:23:26.896278" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:26.894162" elapsed="0.002240"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:26.893192" elapsed="0.003373"/>
</kw>
<msg time="2026-10-16T01:23:26.896671" 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-10-16T01:23:26.886285" elapsed="0.010525"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:26.885381" elapsed="0.011599"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:26.898047" 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-10-16T01:23:26.897475" elapsed="0.000664"/>
</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-10-16T01:23:26.904869" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:26.904087" elapsed="0.000840"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:26.905957" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:26.905294" elapsed="0.000738"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:26.906130" elapsed="0.000064"/>
</return>
<msg time="2026-10-16T01:23:26.906421" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:26.903249" elapsed="0.003221"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:26.906831" elapsed="0.000313"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:26.908241" 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-10-16T01:23:26.907512" elapsed="0.000948"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:26.909492" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:26.908862" elapsed="0.000686"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:26.910426" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:26.909895" elapsed="0.000584"/>
</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-10-16T01:23:26.919525" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:26.918117" elapsed="0.001528"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:26.919958" elapsed="0.000157"/>
</return>
<msg time="2026-10-16T01:23:26.920538" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:26.914628" elapsed="0.006053"/>
</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-10-16T01:23:26.945287" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:26.944837" elapsed="0.000487"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:26.946339" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:26.946027" elapsed="0.000419">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:26.946565" 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-10-16T01:23:26.945542" elapsed="0.001055"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:26.947314" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:26.946855" elapsed="0.000495"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:26.947809" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:26.948028" 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-10-16T01:23:26.947586" elapsed="0.000466"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:26.948468" 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-10-16T01:23:26.948247" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:26.949427" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:26.949197" elapsed="0.000271"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:26.950078" 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-10-16T01:23:26.949643" elapsed="0.000461"/>
</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-10-16T01:23:26.950392" elapsed="0.000020"/>
</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-10-16T01:23:26.950577" 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-10-16T01:23:26.950780" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:26.950260" elapsed="0.000573"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:26.950148" elapsed="0.000719"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:26.950909" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:23:26.951062" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:26.948844" elapsed="0.002241"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:26.948570" 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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:26.951285" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:26.951140" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:26.948552" elapsed="0.002802"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:26.951924" 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-10-16T01:23:26.951507" elapsed="0.000443"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:26.952011" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:26.944087" elapsed="0.008025"/>
</kw>
<msg time="2026-10-16T01:23:26.952159" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:26.938165" elapsed="0.014041"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:26.956090" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:26.960114" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:26.963995" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:26.964174" 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-10-16T01:23:26.964353" elapsed="0.000019"/>
</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-10-16T01:23:26.964693" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:26.964553" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:26.964539" 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-10-16T01:23:26.964939" elapsed="0.000019"/>
</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-10-16T01:23:26.965130" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:26.965291" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:26.964512" elapsed="0.000827"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:26.964421" elapsed="0.000941"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:26.965513" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:26.965581" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:26.965689" 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-10-16T01:23:26.937279" elapsed="0.028450"/>
</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-10-16T01:23:26.966882" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:26.966671" elapsed="0.000271">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:26.967042" 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-10-16T01:23:26.966350" elapsed="0.000715"/>
</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-10-16T01:23:26.967346" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:26.967129" elapsed="0.000268"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:26.967865" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:26.967581" elapsed="0.000309"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:26.967420" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:26.967112" elapsed="0.000830"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:26.968453" 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-10-16T01:23:26.968114" elapsed="0.000397"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:26.968559" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:23:26.968685" 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-manganese/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-10-16T01:23:26.966051" elapsed="0.002674"/>
</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-10-16T01:23:26.969814" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:26.969607" elapsed="0.000267">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:26.969958" 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-10-16T01:23:26.969288" elapsed="0.000706"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:26.970159" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:23:26.970059" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:26.970042" elapsed="0.000195"/>
</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-10-16T01:23:26.970387" elapsed="0.000020"/>
</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-10-16T01:23:26.970558" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:26.970619" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:26.970768" 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-manganese/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-10-16T01:23:26.968988" elapsed="0.001805"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:26.972241" 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-10-16T01:23:26.972014" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:26.972689" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:26.972470" elapsed="0.000276"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:23:26.976946" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:26.977014" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:26.977114" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:26.973046" elapsed="0.004441">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:26.972807" elapsed="0.004760">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:26.977775" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:26.977598" elapsed="0.000238"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:26.972790" elapsed="0.005068">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:26.978219" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:26.978340" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:26.978307" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:26.978291" elapsed="0.000108"/>
</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-10-16T01:23:26.978536" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:26.978633" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:23:26.971271" elapsed="0.007488">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:26.978830" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:23:26.927184" elapsed="0.051774">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:26.979364" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:26.979143" elapsed="0.000304"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:26.979095" elapsed="0.000394"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:26.979575" elapsed="0.000038"/>
</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="FAIL" start="2026-10-16T01:23:26.924855" elapsed="0.054917">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:26.921327" elapsed="0.058546">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:26.921282" elapsed="0.058665">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:26.980221" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:26.980567" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:26.980896" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:26.981259" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:26.981691" elapsed="0.000051"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:26.982050" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:26.982419" elapsed="0.000022"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:26.982674" elapsed="0.000019"/>
</return>
<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="FAIL" start="2026-10-16T01:23:26.913289" elapsed="0.069536">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:26.982921" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:26.911341" elapsed="0.071695">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:26.983260" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:26.983117" elapsed="0.000193"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:26.983471" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:26.983334" elapsed="0.000186"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:26.983683" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:26.983543" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:26.983101" elapsed="0.000716"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:26.911005" elapsed="0.072856">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:26.910575" elapsed="0.073340">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:26.983975" elapsed="0.000016"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:26.901874" elapsed="0.082195">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:26.984246" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:26.984464" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:26.984324" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:26.984309" elapsed="0.000223"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:26.984662" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:26.984921" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:26.984994" elapsed="0.000015"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:26.900177" elapsed="0.084912">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:26.899665" elapsed="0.085486">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:26.899414" elapsed="0.085786">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:26.898593" elapsed="0.086689">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:26.985490" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:26.875856" elapsed="0.109738">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:28.005323" elapsed="0.000458"/>
</kw>
<msg time="2026-10-16T01:23:28.005905" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:28.004053" elapsed="0.002046"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:28.002887" elapsed="0.003372"/>
</kw>
<msg time="2026-10-16T01:23:28.006350" 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-10-16T01:23:27.996301" elapsed="0.010141"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:27.995393" elapsed="0.011195"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:28.007650" 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-10-16T01:23:28.007134" elapsed="0.000772"/>
</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-10-16T01:23:28.014769" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:28.013965" elapsed="0.000864"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:28.015825" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:28.015185" elapsed="0.000695"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:28.016004" elapsed="0.000069"/>
</return>
<msg time="2026-10-16T01:23:28.016306" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:28.013156" elapsed="0.003201"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:28.016690" elapsed="0.000354"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:28.018145" 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-10-16T01:23:28.017411" elapsed="0.000790"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:28.019112" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:28.018526" elapsed="0.000640"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:28.020037" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:28.019475" elapsed="0.000617"/>
</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-10-16T01:23:28.028842" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:28.027421" elapsed="0.001532"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:28.029113" elapsed="0.000133"/>
</return>
<msg time="2026-10-16T01:23:28.029670" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:28.024161" elapsed="0.005833"/>
</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-10-16T01:23:28.053447" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:28.053013" elapsed="0.000472"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:28.054498" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:28.054190" elapsed="0.000408">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:28.054736" 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-10-16T01:23:28.053724" elapsed="0.001045"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:28.055455" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:28.055022" elapsed="0.000469"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:28.055905" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:28.056118" 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-10-16T01:23:28.055741" elapsed="0.000411"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:28.056806" 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-10-16T01:23:28.056417" elapsed="0.000462"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:28.058039" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:28.057620" elapsed="0.000461"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:28.058515" 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-10-16T01:23:28.058255" 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-10-16T01:23:28.058843" elapsed="0.000020"/>
</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-10-16T01:23:28.059043" elapsed="0.000022"/>
</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-10-16T01:23:28.059283" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:28.058696" elapsed="0.000640"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:28.058583" elapsed="0.000782"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:28.059407" elapsed="0.000029"/>
</return>
<msg time="2026-10-16T01:23:28.059541" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:28.057288" elapsed="0.002276"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:28.057012" elapsed="0.002581"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:28.059778" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:28.059620" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:28.056960" elapsed="0.002890"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:28.060417" 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-10-16T01:23:28.060019" elapsed="0.000423"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:28.060486" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:28.052272" elapsed="0.008314"/>
</kw>
<msg time="2026-10-16T01:23:28.060634" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:28.046217" elapsed="0.014463"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:28.064463" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:28.068226" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:28.072095" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:28.072273" elapsed="0.000020"/>
</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-10-16T01:23:28.072450" 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-10-16T01:23:28.072805" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:28.072649" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:28.072635" elapsed="0.000245"/>
</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-10-16T01:23:28.073047" 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-10-16T01:23:28.073222" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:28.073380" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:28.072609" elapsed="0.000820"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:28.072519" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:28.073642" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:28.073733" elapsed="0.000016"/>
</return>
<msg time="2026-10-16T01:23:28.073842" 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-10-16T01:23:28.045329" elapsed="0.028537"/>
</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-10-16T01:23:28.074992" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:28.074782" elapsed="0.000271">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:28.075136" 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-10-16T01:23:28.074444" elapsed="0.000715"/>
</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-10-16T01:23:28.075438" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:28.075222" elapsed="0.000268"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:28.075968" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:28.075686" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:28.075513" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:28.075205" elapsed="0.000857"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:28.076551" 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-10-16T01:23:28.076217" elapsed="0.000358"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:28.076620" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:28.076763" 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-manganese/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-10-16T01:23:28.074146" elapsed="0.002640"/>
</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-10-16T01:23:28.077926" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:28.077667" elapsed="0.000335">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:28.078086" 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-10-16T01:23:28.077349" elapsed="0.000759"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:28.078273" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:23:28.078173" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:28.078156" elapsed="0.000194"/>
</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-10-16T01:23:28.078501" elapsed="0.000020"/>
</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-10-16T01:23:28.078673" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:28.078760" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:23:28.078886" 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-manganese/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-10-16T01:23:28.077053" elapsed="0.001856"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:28.080370" 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-10-16T01:23:28.080147" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:28.080833" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:28.080596" elapsed="0.000277"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:23:28.085066" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:28.085154" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:28.085257" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:28.081172" elapsed="0.004460">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:28.080933" elapsed="0.004796">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:28.085909" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:28.085761" elapsed="0.000207"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:28.080916" elapsed="0.005087">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:28.086344" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:28.086464" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:28.086431" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:28.086415" elapsed="0.000106"/>
</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-10-16T01:23:28.086655" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:28.086737" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:23:28.079423" elapsed="0.007421">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:28.086912" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:23:28.035603" elapsed="0.051461">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:28.087454" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:28.087235" elapsed="0.000300"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:28.087187" elapsed="0.000390"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:28.087661" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:23:28.033443" elapsed="0.054416">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:28.030462" elapsed="0.057495">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:28.030416" elapsed="0.057631">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:28.088297" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:28.088645" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:28.088990" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:28.089344" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:28.089835" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:28.090226" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:28.090576" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:28.090850" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:23:28.022816" elapsed="0.068136">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:28.091032" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:28.020923" elapsed="0.070200">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:28.091343" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:28.091203" elapsed="0.000190"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:28.091550" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:28.091415" elapsed="0.000184"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:28.091792" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:28.091620" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:28.091188" elapsed="0.000674"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:28.020557" elapsed="0.071344">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:28.020185" elapsed="0.071768">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:28.092018" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:28.011611" elapsed="0.080503">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:28.092293" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:28.092513" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:28.092371" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:28.092355" elapsed="0.000231"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:28.092838" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:28.093025" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:28.093085" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:28.010036" elapsed="0.083143">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:28.009520" elapsed="0.083723">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:28.009266" elapsed="0.084026">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:28.008459" elapsed="0.084915">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:28.093635" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:27.986421" elapsed="0.107340">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:29.113439" elapsed="0.000445"/>
</kw>
<msg time="2026-10-16T01:23:29.114031" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:29.112168" elapsed="0.001985"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:29.111225" elapsed="0.003088"/>
</kw>
<msg time="2026-10-16T01:23:29.114403" 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-10-16T01:23:29.104416" elapsed="0.010075"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:29.103522" elapsed="0.011117"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:29.115680" 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-10-16T01:23:29.115170" elapsed="0.000635"/>
</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-10-16T01:23:29.122445" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:29.121657" elapsed="0.000845"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:29.123501" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:29.122867" elapsed="0.000688"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:29.123652" elapsed="0.000093"/>
</return>
<msg time="2026-10-16T01:23:29.123976" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:29.120848" elapsed="0.003204"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:29.124382" elapsed="0.000286"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:29.125792" 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-10-16T01:23:29.125090" elapsed="0.000759"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:29.126734" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:29.126202" elapsed="0.000587"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:29.127624" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:29.127126" elapsed="0.000551"/>
</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-10-16T01:23:29.136636" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:29.135260" elapsed="0.001536"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:29.136926" elapsed="0.000158"/>
</return>
<msg time="2026-10-16T01:23:29.137506" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:29.131903" elapsed="0.005729"/>
</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-10-16T01:23:29.160421" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:29.159999" elapsed="0.000458"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:29.161546" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:29.161239" elapsed="0.000409">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:29.161789" 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-10-16T01:23:29.160775" elapsed="0.001046"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:29.162530" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:29.162094" elapsed="0.000472"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:29.162980" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:29.163209" 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-10-16T01:23:29.162818" elapsed="0.000425"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:29.163872" 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-10-16T01:23:29.163510" elapsed="0.000433"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:29.165044" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:29.164800" elapsed="0.000285"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:29.165516" 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-10-16T01:23:29.165261" elapsed="0.000280"/>
</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-10-16T01:23:29.165839" 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-10-16T01:23:29.166040" elapsed="0.000022"/>
</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-10-16T01:23:29.166220" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:29.165693" elapsed="0.000577"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:29.165583" elapsed="0.000718"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:29.166341" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:29.166470" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:29.164449" elapsed="0.002044"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:29.164189" elapsed="0.002332"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:29.166689" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:29.166547" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:29.164036" elapsed="0.002739"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:29.167344" 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-10-16T01:23:29.166934" elapsed="0.000436"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:29.167412" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:29.159267" elapsed="0.008244"/>
</kw>
<msg time="2026-10-16T01:23:29.167558" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:29.153612" elapsed="0.013992"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:29.171398" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:29.175307" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:29.179107" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:29.179283" elapsed="0.000020"/>
</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-10-16T01:23:29.179459" elapsed="0.000019"/>
</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-10-16T01:23:29.179814" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:29.179655" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:29.179641" 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-10-16T01:23:29.180057" 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-10-16T01:23:29.180234" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:29.180393" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:29.179615" elapsed="0.000826"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:29.179526" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:29.180613" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:29.180680" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:29.180799" 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-10-16T01:23:29.152781" elapsed="0.028041"/>
</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-10-16T01:23:29.181930" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:29.181736" elapsed="0.000273">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:29.182093" 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-10-16T01:23:29.181399" elapsed="0.000717"/>
</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-10-16T01:23:29.182395" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:29.182178" elapsed="0.000269"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:29.182925" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:29.182641" elapsed="0.000308"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:29.182469" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:29.182162" elapsed="0.000853"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:29.183508" 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-10-16T01:23:29.183172" elapsed="0.000361"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:29.183578" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:29.183716" 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-manganese/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-10-16T01:23:29.181103" elapsed="0.002638"/>
</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-10-16T01:23:29.186721" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:29.184666" elapsed="0.002117">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:29.186869" 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-10-16T01:23:29.184354" elapsed="0.002538"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:29.187075" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:23:29.186956" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:29.186939" elapsed="0.000214"/>
</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-10-16T01:23:29.187302" 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-10-16T01:23:29.187472" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:29.187531" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:29.187655" 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-manganese/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-10-16T01:23:29.184055" elapsed="0.003623"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:29.188913" 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-10-16T01:23:29.188670" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:29.189377" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:29.189158" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:23:29.193523" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:29.193576" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:29.193682" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:29.189713" elapsed="0.004381">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:29.189478" elapsed="0.004694">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:29.194353" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:29.194203" elapsed="0.000208"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:29.189461" elapsed="0.004971">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:29.194787" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:29.194907" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:29.194873" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:29.194857" elapsed="0.000107"/>
</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-10-16T01:23:29.195112" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:29.195175" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:23:29.187963" elapsed="0.007313">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:29.195390" elapsed="0.000024"/>
</return>
<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="FAIL" start="2026-10-16T01:23:29.143143" elapsed="0.052385">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:29.195951" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:29.195695" elapsed="0.000368"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:29.195648" elapsed="0.000459"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:29.196193" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:23:29.141004" elapsed="0.055354">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:29.138297" elapsed="0.058162">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:29.138252" elapsed="0.058279">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:29.196799" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:29.197163" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:29.197470" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:29.197847" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:29.198292" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:29.198604" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:29.198995" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:29.199235" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:23:29.130557" elapsed="0.068779">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:29.199397" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:29.128692" elapsed="0.070793">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:29.199729" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:29.199565" elapsed="0.000216"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:29.199940" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:29.199803" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:29.200165" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:29.200023" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:29.199549" elapsed="0.000683"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:29.128363" elapsed="0.071907">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:29.127947" elapsed="0.072377">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:29.200371" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:29.119458" elapsed="0.081039">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:29.200673" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:29.200996" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:29.200841" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:29.200824" elapsed="0.000243"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:29.201192" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:29.201359" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:29.201417" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:29.117842" elapsed="0.083667">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:29.117332" elapsed="0.084238">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:29.117080" elapsed="0.084538">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:29.116278" elapsed="0.085419">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:29.201955" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:29.094539" elapsed="0.107533">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:30.222681" elapsed="0.000504"/>
</kw>
<msg time="2026-10-16T01:23:30.223311" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:30.221402" elapsed="0.002034"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:30.220260" elapsed="0.003335"/>
</kw>
<msg time="2026-10-16T01:23:30.223686" 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-10-16T01:23:30.212939" elapsed="0.010872"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:30.212052" elapsed="0.011912"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:30.225124" 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-10-16T01:23:30.224537" elapsed="0.000681"/>
</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-10-16T01:23:30.231928" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:30.231148" elapsed="0.000838"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:30.232989" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:30.232345" elapsed="0.000722"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:30.233289" elapsed="0.000068"/>
</return>
<msg time="2026-10-16T01:23:30.233597" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:30.230308" elapsed="0.003341"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:30.234041" elapsed="0.000292"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:30.235465" 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-10-16T01:23:30.234735" elapsed="0.000787"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:30.236426" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:30.235886" elapsed="0.000594"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:30.237361" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:30.236825" elapsed="0.000589"/>
</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-10-16T01:23:30.246193" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:30.244807" elapsed="0.001497"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:30.246431" elapsed="0.000133"/>
</return>
<msg time="2026-10-16T01:23:30.247120" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:30.241501" elapsed="0.005748"/>
</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-10-16T01:23:30.271190" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:30.270743" elapsed="0.000483"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:30.272229" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:30.271908" elapsed="0.000428">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:30.272454" 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-10-16T01:23:30.271445" elapsed="0.001040"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:30.273194" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:30.272744" elapsed="0.000486"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:30.273618" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:30.273848" 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-10-16T01:23:30.273457" elapsed="0.000424"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:30.274501" 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-10-16T01:23:30.274166" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:30.275717" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:30.275472" elapsed="0.000288"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:30.276350" 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-10-16T01:23:30.275936" elapsed="0.000439"/>
</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-10-16T01:23:30.276662" elapsed="0.000020"/>
</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-10-16T01:23:30.276869" elapsed="0.000022"/>
</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-10-16T01:23:30.277063" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:30.276532" elapsed="0.000584"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:30.276420" elapsed="0.000727"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:30.277190" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:30.277361" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:30.275124" elapsed="0.002260"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:30.274643" elapsed="0.002770"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:30.277587" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:30.277441" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:30.274619" elapsed="0.003039"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:30.278255" 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-10-16T01:23:30.277832" elapsed="0.000449"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:30.278326" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:30.269983" elapsed="0.008444"/>
</kw>
<msg time="2026-10-16T01:23:30.278476" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:30.264168" elapsed="0.014355"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:30.282383" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:30.286188" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:30.289991" elapsed="0.000036"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:30.290182" elapsed="0.000020"/>
</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-10-16T01:23:30.290358" elapsed="0.000019"/>
</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-10-16T01:23:30.290711" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:30.290556" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:30.290543" elapsed="0.000242"/>
</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-10-16T01:23:30.290939" elapsed="0.000019"/>
</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-10-16T01:23:30.291128" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:30.291289" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:30.290516" elapsed="0.000821"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:30.290426" elapsed="0.000935"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:30.291512" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:30.291579" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:23:30.291683" 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-10-16T01:23:30.263298" elapsed="0.028423"/>
</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-10-16T01:23:30.292888" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:30.292677" elapsed="0.000271">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:30.293050" 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-10-16T01:23:30.292354" elapsed="0.000720"/>
</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-10-16T01:23:30.293355" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:30.293138" elapsed="0.000269"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:30.293877" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:30.293589" elapsed="0.000312"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:30.293430" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:30.293121" elapsed="0.000833"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:30.294462" 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-10-16T01:23:30.294126" elapsed="0.000360"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:30.294531" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:30.294656" 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-manganese/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-10-16T01:23:30.292053" elapsed="0.002626"/>
</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-10-16T01:23:30.295792" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:30.295577" elapsed="0.000276">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:30.295937" 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-10-16T01:23:30.295257" elapsed="0.000703"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:30.296141" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:23:30.296040" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:30.296022" elapsed="0.000197"/>
</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-10-16T01:23:30.296370" elapsed="0.000020"/>
</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-10-16T01:23:30.296541" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:30.296600" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:23:30.296770" 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-manganese/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-10-16T01:23:30.294946" elapsed="0.001849"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:30.298229" 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-10-16T01:23:30.297989" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:30.298675" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:30.298457" elapsed="0.000275"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:23:30.302977" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:30.303049" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:30.303182" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:30.299030" elapsed="0.004529">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:30.298794" elapsed="0.004845">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:30.303836" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:30.303669" elapsed="0.000231"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:30.298777" elapsed="0.005145">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:30.304273" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:30.304394" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:30.304361" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:30.304345" elapsed="0.000108"/>
</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-10-16T01:23:30.304589" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:30.304652" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:23:30.297270" elapsed="0.007503">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:30.304842" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:23:30.253456" elapsed="0.051512">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:30.305370" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:30.305150" elapsed="0.000304"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:30.305102" elapsed="0.000394"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:30.305579" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:23:30.251309" elapsed="0.054462">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:30.247936" elapsed="0.057936">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:30.247665" elapsed="0.058280">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:30.306206" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:30.306552" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:30.306881" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:30.307245" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:30.307674" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:30.308027" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:30.308374" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:30.308644" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:23:30.240188" elapsed="0.068596">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:30.308847" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:30.238273" elapsed="0.070664">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:30.309172" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:30.309030" elapsed="0.000194"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:30.309384" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:30.309246" elapsed="0.000187"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:30.309597" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:30.309455" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:30.309013" elapsed="0.000653"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:30.237917" elapsed="0.071813">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:30.237511" elapsed="0.072275">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:30.309837" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:30.228910" elapsed="0.081018">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:30.310114" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:30.310336" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:30.310194" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:30.310178" elapsed="0.000226"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:30.310531" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:30.310783" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:30.310846" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:30.227275" elapsed="0.083665">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:30.226788" elapsed="0.084227">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:30.226495" elapsed="0.084571">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:30.225672" elapsed="0.085477">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:30.311357" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:30.202902" elapsed="0.108559">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:31.332234" elapsed="0.000422"/>
</kw>
<msg time="2026-10-16T01:23:31.332816" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:31.330858" elapsed="0.002089"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:31.329651" elapsed="0.003487"/>
</kw>
<msg time="2026-10-16T01:23:31.333233" 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-10-16T01:23:31.322291" elapsed="0.011037"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:31.321375" elapsed="0.012111"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:31.334684" 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-10-16T01:23:31.334090" elapsed="0.000725"/>
</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-10-16T01:23:31.341728" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:31.340869" elapsed="0.000926"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:31.342800" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:31.342160" elapsed="0.000695"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:31.342952" elapsed="0.000099"/>
</return>
<msg time="2026-10-16T01:23:31.343278" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:31.340035" elapsed="0.003293"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:31.343657" elapsed="0.000331"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:31.345089" 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-10-16T01:23:31.344374" elapsed="0.000771"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:31.345994" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:31.345467" elapsed="0.000602"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:31.346895" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:31.346374" elapsed="0.000573"/>
</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-10-16T01:23:31.355877" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:31.354457" elapsed="0.001532"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:31.356155" elapsed="0.000143"/>
</return>
<msg time="2026-10-16T01:23:31.356896" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:31.351201" elapsed="0.005784"/>
</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-10-16T01:23:31.381893" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:31.381370" elapsed="0.000571"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:31.383074" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:31.382687" elapsed="0.000494">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:31.383306" 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-10-16T01:23:31.382204" elapsed="0.001135"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:31.384207" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:31.383697" elapsed="0.000548"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:31.384661" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:31.384885" 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-10-16T01:23:31.384487" elapsed="0.000422"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:31.385340" 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-10-16T01:23:31.385114" elapsed="0.000269"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:31.386589" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:31.386158" elapsed="0.000473"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:31.387104" 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-10-16T01:23:31.386824" 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-10-16T01:23:31.387441" 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-10-16T01:23:31.387629" elapsed="0.000022"/>
</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-10-16T01:23:31.387833" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:31.387309" elapsed="0.000578"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:31.387184" elapsed="0.000732"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:31.387963" elapsed="0.000033"/>
</return>
<msg time="2026-10-16T01:23:31.388116" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:31.385805" elapsed="0.002335"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:31.385467" elapsed="0.002701"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:31.388339" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:31.388195" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:31.385442" elapsed="0.002967"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:31.388977" 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-10-16T01:23:31.388565" elapsed="0.000438"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:31.389061" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:31.380539" elapsed="0.008621"/>
</kw>
<msg time="2026-10-16T01:23:31.389208" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:31.374264" elapsed="0.014992"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:31.393058" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:31.396831" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:31.400598" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:31.400848" 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-10-16T01:23:31.401042" 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-10-16T01:23:31.401393" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:31.401249" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:31.401235" 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-10-16T01:23:31.401619" elapsed="0.000019"/>
</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-10-16T01:23:31.401810" 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-10-16T01:23:31.401972" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:31.401206" elapsed="0.000827"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:31.401113" elapsed="0.000944"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:31.402208" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:31.402276" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:31.402387" 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-10-16T01:23:31.373053" elapsed="0.029358"/>
</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-10-16T01:23:31.403567" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:31.403350" elapsed="0.000286">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:31.403736" 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-10-16T01:23:31.402999" elapsed="0.000761"/>
</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-10-16T01:23:31.404058" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:31.403828" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:31.404578" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:31.404312" elapsed="0.000291"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:31.404133" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:31.403808" elapsed="0.000845"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:31.405180" 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-10-16T01:23:31.404826" elapsed="0.000378"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:31.405248" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:31.405370" 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-manganese/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-10-16T01:23:31.402677" elapsed="0.002716"/>
</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-10-16T01:23:31.406479" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:31.406282" elapsed="0.000259">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:31.406625" 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-10-16T01:23:31.405951" elapsed="0.000697"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:31.406886" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:23:31.406784" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:31.406766" elapsed="0.000200"/>
</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-10-16T01:23:31.407129" elapsed="0.000020"/>
</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-10-16T01:23:31.407302" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:31.407362" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:31.407489" 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-manganese/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-10-16T01:23:31.405639" elapsed="0.001873"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:31.409131" 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-10-16T01:23:31.408879" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:31.409578" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:31.409362" elapsed="0.000256"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:23:31.414370" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:31.414430" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:31.414544" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:31.409927" elapsed="0.005033">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:31.409677" elapsed="0.005380">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:31.415285" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:31.415093" elapsed="0.000253"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:31.409661" elapsed="0.005708">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:31.415802" elapsed="0.000032"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:31.415943" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:31.415903" elapsed="0.000082"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:31.415884" elapsed="0.000139"/>
</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-10-16T01:23:31.416170" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:31.416234" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:23:31.408050" elapsed="0.008298">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:31.416420" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:23:31.362299" elapsed="0.054309">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:31.417188" elapsed="0.000096"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:31.416824" elapsed="0.000525"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:31.416768" elapsed="0.000625"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:31.417479" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:23:31.359989" elapsed="0.057660">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:31.357315" elapsed="0.060459">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:31.357284" elapsed="0.060567">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:31.418133" elapsed="0.000025"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:31.418518" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:31.418874" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:31.419244" elapsed="0.000024"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:31.419787" elapsed="0.000024"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:31.420127" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:31.420483" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:31.420758" elapsed="0.000022"/>
</return>
<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="FAIL" start="2026-10-16T01:23:31.349767" elapsed="0.071128">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:31.420959" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:31.347818" elapsed="0.073250">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:31.421319" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:31.421169" elapsed="0.000200"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:31.421531" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:31.421395" elapsed="0.000184"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:31.421873" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:31.421602" elapsed="0.000322"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:31.421148" elapsed="0.000798"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:31.347453" elapsed="0.074534">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:31.347067" elapsed="0.074993">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:31.422116" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:31.338643" elapsed="0.083569">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:31.422394" elapsed="0.000262"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:31.423020" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:31.422852" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:31.422832" elapsed="0.000261"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:31.423220" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:31.423392" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:31.423452" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:31.337041" elapsed="0.086518">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:31.336460" elapsed="0.087163">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:31.336202" elapsed="0.087474">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:31.335323" elapsed="0.088466">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:31.424066" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:31.312394" elapsed="0.111784">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:32.444232" elapsed="0.000421"/>
</kw>
<msg time="2026-10-16T01:23:32.444807" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:32.442952" elapsed="0.001983"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:32.441897" elapsed="0.003224"/>
</kw>
<msg time="2026-10-16T01:23:32.445212" 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-10-16T01:23:32.435178" elapsed="0.010125"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:32.434273" elapsed="0.011179"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:32.446506" 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-10-16T01:23:32.445970" elapsed="0.000627"/>
</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-10-16T01:23:32.453217" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:32.452423" elapsed="0.000852"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:32.454269" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:32.453606" elapsed="0.000716"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:32.454417" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:23:32.454732" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:32.451592" elapsed="0.003193"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:32.455136" elapsed="0.000311"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:32.456667" 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-10-16T01:23:32.455846" elapsed="0.000910"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:32.457622" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:32.457108" elapsed="0.000569"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:32.458550" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:32.458043" elapsed="0.000561"/>
</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-10-16T01:23:32.467318" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:32.465939" elapsed="0.001486"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:32.467550" elapsed="0.000132"/>
</return>
<msg time="2026-10-16T01:23:32.468444" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:32.462646" elapsed="0.005923"/>
</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-10-16T01:23:32.491896" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:32.491451" elapsed="0.000482"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:32.492928" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:32.492605" elapsed="0.000441">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:32.493165" 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-10-16T01:23:32.492166" elapsed="0.001030"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:32.493880" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:32.493429" elapsed="0.000486"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:32.494316" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:32.494518" 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-10-16T01:23:32.494158" elapsed="0.000394"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:32.495156" 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-10-16T01:23:32.494834" elapsed="0.000379"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:32.496418" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:32.496189" elapsed="0.000270"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:32.496908" 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-10-16T01:23:32.496631" 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-10-16T01:23:32.497226" elapsed="0.000020"/>
</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-10-16T01:23:32.497407" elapsed="0.000022"/>
</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-10-16T01:23:32.497587" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:32.497098" elapsed="0.000540"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:32.496975" elapsed="0.000692"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:32.497723" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:23:32.497856" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:32.495831" elapsed="0.002054"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:32.495457" elapsed="0.002460"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:32.498109" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:32.497943" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:32.495273" elapsed="0.002909"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:32.498765" 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-10-16T01:23:32.498338" elapsed="0.000496"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:32.498881" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:32.490744" elapsed="0.008238"/>
</kw>
<msg time="2026-10-16T01:23:32.499090" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:32.485059" elapsed="0.014079"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:32.503192" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:32.507030" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:32.510773" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:32.510949" elapsed="0.000019"/>
</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-10-16T01:23:32.511183" elapsed="0.000019"/>
</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-10-16T01:23:32.511519" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:32.511378" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:32.511365" elapsed="0.000229"/>
</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-10-16T01:23:32.511761" 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-10-16T01:23:32.511939" elapsed="0.000018"/>
</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-10-16T01:23:32.512112" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:32.511340" elapsed="0.000822"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:32.511253" elapsed="0.000932"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:32.512334" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:32.512401" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:32.512503" 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-10-16T01:23:32.484197" elapsed="0.028330"/>
</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-10-16T01:23:32.513693" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:32.513500" elapsed="0.000272">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:32.513856" 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-10-16T01:23:32.513178" elapsed="0.000700"/>
</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-10-16T01:23:32.514173" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:32.513941" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:32.514676" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:32.514412" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:32.514247" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:32.513925" elapsed="0.000844"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:32.515280" 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-10-16T01:23:32.514925" elapsed="0.000380"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:32.515350" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:32.515473" 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-manganese/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-10-16T01:23:32.512822" elapsed="0.002675"/>
</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-10-16T01:23:32.518514" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:32.516388" elapsed="0.002187">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:32.518660" 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-10-16T01:23:32.516073" elapsed="0.002610"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:32.518865" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:23:32.518764" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:32.518746" elapsed="0.000196"/>
</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-10-16T01:23:32.519115" elapsed="0.000020"/>
</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-10-16T01:23:32.519287" elapsed="0.000023"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:32.519353" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:32.519478" 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-manganese/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-10-16T01:23:32.515762" elapsed="0.003739"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:32.520747" 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-10-16T01:23:32.520504" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:32.521210" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:32.520976" elapsed="0.000275"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:23:32.525475" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:32.525532" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:32.525640" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:32.521535" elapsed="0.004533">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:32.521311" elapsed="0.004872">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:32.526367" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:32.526215" elapsed="0.000211"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:32.521294" elapsed="0.005155">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:32.526804" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:32.526929" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:32.526897" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:32.526880" elapsed="0.000108"/>
</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-10-16T01:23:32.527135" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:32.527199" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:23:32.519794" elapsed="0.007507">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:32.527369" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:23:32.474385" elapsed="0.053114">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:32.527930" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:32.527665" elapsed="0.000349"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:32.527618" elapsed="0.000459"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:32.528162" elapsed="0.000037"/>
</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="FAIL" start="2026-10-16T01:23:32.472238" elapsed="0.056091">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:32.469081" elapsed="0.059350">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:32.469035" elapsed="0.059473">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:32.528792" elapsed="0.000025"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:32.529158" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:32.529470" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:32.529894" elapsed="0.000025"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:32.530347" elapsed="0.000028"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:32.530776" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:32.531145" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:32.531393" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:23:32.461334" elapsed="0.070161">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:32.531605" elapsed="0.000018"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:32.459458" elapsed="0.072268">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:32.531966" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:32.531823" elapsed="0.000207"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:32.532191" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:32.532054" elapsed="0.000187"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:32.532403" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:32.532263" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:32.531805" elapsed="0.000666"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:32.459128" elapsed="0.073382">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:32.458728" elapsed="0.073835">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:32.532611" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:32.450244" elapsed="0.082591">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:32.533031" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:32.533253" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:32.533113" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:32.533097" elapsed="0.000224"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:32.533444" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:32.533612" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:32.533670" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:32.448598" elapsed="0.085192">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:32.448142" elapsed="0.085712">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:32.447866" elapsed="0.086038">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:32.447093" elapsed="0.086892">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:32.534212" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:32.425123" elapsed="0.109195">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:33.554931" elapsed="0.000586"/>
</kw>
<msg time="2026-10-16T01:23:33.555645" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:33.553626" elapsed="0.002301"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:33.552680" elapsed="0.003469"/>
</kw>
<msg time="2026-10-16T01:23:33.556257" 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-10-16T01:23:33.545696" elapsed="0.010660"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:33.544824" elapsed="0.011680"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:33.557600" 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-10-16T01:23:33.557074" elapsed="0.000618"/>
</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-10-16T01:23:33.564392" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:33.563594" elapsed="0.000857"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:33.565484" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:33.564814" elapsed="0.000723"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:33.565636" elapsed="0.000091"/>
</return>
<msg time="2026-10-16T01:23:33.566010" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:33.562790" elapsed="0.003303"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:33.566432" elapsed="0.000346"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:33.567898" 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-10-16T01:23:33.567183" elapsed="0.000771"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:33.568845" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:33.568305" elapsed="0.000598"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:33.569797" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:33.569260" elapsed="0.000592"/>
</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-10-16T01:23:33.578955" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:33.577462" elapsed="0.001665"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:33.579267" elapsed="0.000139"/>
</return>
<msg time="2026-10-16T01:23:33.580072" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:33.574019" elapsed="0.006139"/>
</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-10-16T01:23:33.603114" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:33.602607" elapsed="0.000552"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:33.604188" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:33.603858" elapsed="0.000437">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:33.604416" 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-10-16T01:23:33.603383" elapsed="0.001065"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:33.605182" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:33.604684" elapsed="0.000534"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:33.605608" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:33.605895" 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-10-16T01:23:33.605447" elapsed="0.000490"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:33.606504" 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-10-16T01:23:33.606277" elapsed="0.000269"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:33.607460" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:33.607229" elapsed="0.000272"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:33.608191" 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-10-16T01:23:33.607673" elapsed="0.000543"/>
</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-10-16T01:23:33.608504" 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-10-16T01:23:33.608688" elapsed="0.000038"/>
</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-10-16T01:23:33.608886" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:33.608374" elapsed="0.000564"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:33.608262" elapsed="0.000707"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:33.609010" elapsed="0.000041"/>
</return>
<msg time="2026-10-16T01:23:33.609156" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:33.606880" elapsed="0.002299"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:33.606607" elapsed="0.002601"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:33.609376" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:33.609233" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:33.606590" elapsed="0.002856"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:33.610018" 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-10-16T01:23:33.609601" elapsed="0.000456"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:33.610101" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:33.601883" elapsed="0.008319"/>
</kw>
<msg time="2026-10-16T01:23:33.610249" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:33.596050" elapsed="0.014245"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:33.614136" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:33.617933" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:33.621733" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:33.621948" 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-10-16T01:23:33.622145" 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-10-16T01:23:33.622492" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:33.622349" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:33.622334" 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-10-16T01:23:33.622734" 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-10-16T01:23:33.622913" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:33.623094" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:33.622308" elapsed="0.000836"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:33.622218" elapsed="0.000950"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:33.623321" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:33.623390" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:33.623494" 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-10-16T01:23:33.595173" elapsed="0.028345"/>
</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-10-16T01:23:33.624633" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:33.624442" elapsed="0.000251">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:33.624792" 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-10-16T01:23:33.624119" elapsed="0.000697"/>
</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-10-16T01:23:33.625107" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:33.624877" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:33.625624" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:33.625360" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:33.625183" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:33.624861" elapsed="0.000855"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:33.626241" 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-10-16T01:23:33.625879" elapsed="0.000386"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:33.626310" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:33.626433" 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-manganese/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-10-16T01:23:33.623800" elapsed="0.002656"/>
</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-10-16T01:23:33.627549" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:33.627360" elapsed="0.000249">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:33.627691" 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-10-16T01:23:33.627039" elapsed="0.000691"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:33.627893" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:23:33.627794" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:33.627777" elapsed="0.000192"/>
</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-10-16T01:23:33.628131" 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-10-16T01:23:33.628345" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:33.628407" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:23:33.628534" 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-manganese/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-10-16T01:23:33.626720" elapsed="0.001837"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:33.629980" 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-10-16T01:23:33.629746" elapsed="0.000277"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:33.630451" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:33.630228" elapsed="0.000263"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:23:33.634675" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:33.634761" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:33.634866" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:33.630808" elapsed="0.004446">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:33.630552" elapsed="0.004783">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:33.635516" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:33.635366" elapsed="0.000209"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:33.630535" elapsed="0.005062">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:33.635954" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:33.636090" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:33.636055" elapsed="0.000073"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:33.636025" 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-10-16T01:23:33.636284" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:33.636347" elapsed="0.000013"/>
</return>
<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="FAIL" start="2026-10-16T01:23:33.629037" elapsed="0.007413">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:33.636517" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:23:33.585312" elapsed="0.051330">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:33.637093" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:33.636847" elapsed="0.000332"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:33.636797" elapsed="0.000424"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:33.637307" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:23:33.582997" elapsed="0.054512">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:33.580450" elapsed="0.057163">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:33.580420" elapsed="0.057268">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:33.637975" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:33.638350" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:33.638666" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:33.639071" elapsed="0.000024"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:33.639506" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:33.639847" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:33.640222" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:33.640461" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:23:33.572576" elapsed="0.067989">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:33.640627" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:33.570683" elapsed="0.070060">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:33.640975" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:33.640833" elapsed="0.000207"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:33.641203" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:33.641065" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:33.641418" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:33.641276" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:33.640817" elapsed="0.000669"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:33.570349" elapsed="0.071175">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:33.569949" elapsed="0.071630">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:33.641628" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:33.561410" elapsed="0.080451">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:33.642100" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:33.642348" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:33.642204" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:33.642186" elapsed="0.000232"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:33.642743" elapsed="0.000028"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:33.642930" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:33.642991" elapsed="0.000015"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:33.559762" elapsed="0.083341">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:33.559272" elapsed="0.083895">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:33.558990" elapsed="0.084226">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:33.558205" elapsed="0.085094">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:33.643510" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:33.535240" elapsed="0.108373">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:34.664291" elapsed="0.000453"/>
</kw>
<msg time="2026-10-16T01:23:34.664878" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:34.662920" elapsed="0.002093"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:34.661936" elapsed="0.003289"/>
</kw>
<msg time="2026-10-16T01:23:34.665317" 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-10-16T01:23:34.654912" elapsed="0.010495"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:34.654004" elapsed="0.011551"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:34.666667" 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-10-16T01:23:34.666123" elapsed="0.000670"/>
</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-10-16T01:23:34.673427" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:34.672625" elapsed="0.000861"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:34.674486" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:34.673852" elapsed="0.000689"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:34.674637" elapsed="0.000093"/>
</return>
<msg time="2026-10-16T01:23:34.674964" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:34.671815" elapsed="0.003201"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:34.675366" elapsed="0.000286"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:34.677065" 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-10-16T01:23:34.676186" elapsed="0.000951"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:34.678141" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:34.677493" elapsed="0.000707"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:34.679357" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:34.678530" elapsed="0.000888"/>
</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-10-16T01:23:34.688795" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:34.687308" elapsed="0.001603"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:34.689063" elapsed="0.000140"/>
</return>
<msg time="2026-10-16T01:23:34.689632" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:34.683632" elapsed="0.006172"/>
</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-10-16T01:23:34.712947" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:34.712493" elapsed="0.000493"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:34.714008" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:34.713669" elapsed="0.000465">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:34.714253" 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-10-16T01:23:34.713227" elapsed="0.001058"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:34.714974" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:34.714518" elapsed="0.000492"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:34.715419" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:34.715629" 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-10-16T01:23:34.715258" elapsed="0.000404"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:34.716286" 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-10-16T01:23:34.715948" elapsed="0.000396"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:34.717766" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:34.717369" elapsed="0.000439"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:34.718268" 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-10-16T01:23:34.717988" 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-10-16T01:23:34.718587" 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-10-16T01:23:34.718792" 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-10-16T01:23:34.718976" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:34.718455" elapsed="0.000573"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:34.718339" elapsed="0.000735"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:34.719117" elapsed="0.000029"/>
</return>
<msg time="2026-10-16T01:23:34.719251" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:34.716815" elapsed="0.002459"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:34.716438" elapsed="0.002864"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:34.719473" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:34.719328" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:34.716412" elapsed="0.003130"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:34.720132" 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-10-16T01:23:34.719698" elapsed="0.000459"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:34.720200" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:34.711775" elapsed="0.008524"/>
</kw>
<msg time="2026-10-16T01:23:34.720405" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:34.706018" elapsed="0.014435"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:34.724269" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:34.728140" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:34.731891" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:34.732085" elapsed="0.000020"/>
</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-10-16T01:23:34.732264" elapsed="0.000019"/>
</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-10-16T01:23:34.732598" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:34.732457" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:34.732444" elapsed="0.000227"/>
</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-10-16T01:23:34.732839" elapsed="0.000019"/>
</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-10-16T01:23:34.733016" elapsed="0.000018"/>
</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-10-16T01:23:34.733193" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:34.732418" elapsed="0.000823"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:34.732331" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:34.733413" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:34.733480" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:34.733583" 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-10-16T01:23:34.705132" elapsed="0.028475"/>
</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-10-16T01:23:34.734728" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:34.734522" elapsed="0.000266">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:34.734904" 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-10-16T01:23:34.734200" elapsed="0.000728"/>
</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-10-16T01:23:34.735224" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:34.734992" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:34.735757" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:34.735476" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:34.735300" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:34.734976" elapsed="0.000894"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:34.736391" 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-10-16T01:23:34.736033" elapsed="0.000382"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:34.736460" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:34.736583" 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-manganese/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-10-16T01:23:34.733885" elapsed="0.002721"/>
</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-10-16T01:23:34.737682" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:34.737493" elapsed="0.000264">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:34.737841" 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-10-16T01:23:34.737177" elapsed="0.000687"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:34.738068" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:23:34.737957" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:34.737940" elapsed="0.000207"/>
</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-10-16T01:23:34.738295" elapsed="0.000020"/>
</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-10-16T01:23:34.738464" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:34.738524" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:34.738645" 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-manganese/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-10-16T01:23:34.736865" elapsed="0.001804"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:34.740093" 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-10-16T01:23:34.739851" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:34.740539" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:34.740321" elapsed="0.000258"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:23:34.744631" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:34.744686" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:34.744804" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:34.740877" elapsed="0.004330">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:34.740637" elapsed="0.004650">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:34.745466" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:34.745317" elapsed="0.000238"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:34.740621" elapsed="0.004958">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:34.745940" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:34.746076" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:34.746027" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:34.746011" 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-10-16T01:23:34.746272" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:34.746335" elapsed="0.000013"/>
</return>
<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="FAIL" start="2026-10-16T01:23:34.739142" elapsed="0.007294">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:34.746504" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:23:34.695265" elapsed="0.051374">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:34.747067" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:34.746832" elapsed="0.000318"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:34.746782" elapsed="0.000413"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:34.747278" elapsed="0.000037"/>
</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="FAIL" start="2026-10-16T01:23:34.693130" elapsed="0.054312">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:34.690301" elapsed="0.057240">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:34.690257" elapsed="0.057356">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:34.747875" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:34.748247" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:34.748570" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:34.748943" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:34.749445" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:34.749777" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:34.750185" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:34.750433" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:23:34.682230" elapsed="0.068305">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:34.750597" elapsed="0.000017"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:34.680326" elapsed="0.070361">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:34.751161" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:34.751001" elapsed="0.000212"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:34.751374" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:34.751236" elapsed="0.000187"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:34.751587" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:34.751445" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:34.750982" elapsed="0.000674"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:34.679961" elapsed="0.071733">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:34.679518" elapsed="0.072310">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:34.751878" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:34.670440" elapsed="0.081530">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:34.752162" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:34.752381" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:34.752241" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:34.752226" elapsed="0.000223"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:34.752573" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:34.752828" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:34.752890" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:34.668807" elapsed="0.084174">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:34.668319" elapsed="0.084740">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:34.668064" elapsed="0.085046">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:34.667261" elapsed="0.085932">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:34.753405" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:34.644490" elapsed="0.109022">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:35.772571" elapsed="0.000445"/>
</kw>
<msg time="2026-10-16T01:23:35.773163" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:35.771321" elapsed="0.001963"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:35.770384" elapsed="0.003056"/>
</kw>
<msg time="2026-10-16T01:23:35.773653" 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-10-16T01:23:35.763781" elapsed="0.009997"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:35.762874" elapsed="0.011059"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:35.774998" 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-10-16T01:23:35.774450" elapsed="0.000665"/>
</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-10-16T01:23:35.781674" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:35.780910" elapsed="0.000853"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:35.782753" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:35.782122" elapsed="0.000687"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:35.782906" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:23:35.783216" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:35.780094" elapsed="0.003174"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:35.783596" elapsed="0.000316"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:35.785000" 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-10-16T01:23:35.784302" elapsed="0.000778"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:35.785942" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:35.785408" elapsed="0.000587"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:35.786856" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:35.786325" elapsed="0.000584"/>
</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-10-16T01:23:35.794998" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:35.794145" elapsed="0.000938"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:35.795164" elapsed="0.000085"/>
</return>
<msg time="2026-10-16T01:23:35.795516" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:35.790957" elapsed="0.004637"/>
</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-10-16T01:23:35.817909" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:35.817462" elapsed="0.000483"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:35.818956" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:35.818624" elapsed="0.000454">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:35.819175" 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-10-16T01:23:35.818178" elapsed="0.001019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:35.819673" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:35.819367" elapsed="0.000345"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:35.819992" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:35.820167" 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-10-16T01:23:35.819878" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:35.820640" 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-10-16T01:23:35.820382" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:35.821729" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:35.821481" elapsed="0.000291"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:35.822416" 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-10-16T01:23:35.821953" elapsed="0.000488"/>
</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-10-16T01:23:35.822737" 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-10-16T01:23:35.822923" elapsed="0.000022"/>
</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-10-16T01:23:35.823116" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:35.822594" elapsed="0.000576"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:35.822483" elapsed="0.000717"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:35.823240" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:35.823368" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:35.821146" elapsed="0.002245"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:35.820871" elapsed="0.002549"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:35.823589" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:35.823446" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:35.820742" elapsed="0.002915"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:35.824233" 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-10-16T01:23:35.823827" elapsed="0.000431"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:35.824301" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:35.816755" elapsed="0.007644"/>
</kw>
<msg time="2026-10-16T01:23:35.824447" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:35.811110" elapsed="0.013383"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:35.828285" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:35.832040" elapsed="0.000035"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:35.835789" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:35.835964" elapsed="0.000020"/>
</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-10-16T01:23:35.836152" 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-10-16T01:23:35.836525" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:35.836346" elapsed="0.000231"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:35.836333" 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-10-16T01:23:35.836767" 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-10-16T01:23:35.836943" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:35.837115" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:35.836307" elapsed="0.000859"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:35.836218" elapsed="0.000971"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:35.837339" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:35.837406" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:35.837509" 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-10-16T01:23:35.810242" elapsed="0.027290"/>
</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-10-16T01:23:35.838675" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:35.838486" elapsed="0.000265">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:35.838833" 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-10-16T01:23:35.838169" elapsed="0.000687"/>
</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-10-16T01:23:35.839146" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:35.838919" elapsed="0.000279"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:35.839638" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:35.839376" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:35.839221" elapsed="0.000472"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:35.838902" elapsed="0.000826"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:35.840236" 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-10-16T01:23:35.839888" elapsed="0.000371"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:35.840304" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:35.840427" 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-manganese/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-10-16T01:23:35.837812" elapsed="0.002637"/>
</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-10-16T01:23:35.843243" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:35.841333" elapsed="0.001971">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:35.843389" 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-10-16T01:23:35.841006" elapsed="0.002406"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:35.843575" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:23:35.843476" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:35.843459" elapsed="0.000192"/>
</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-10-16T01:23:35.843819" 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-10-16T01:23:35.843994" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:35.844066" elapsed="0.000016"/>
</return>
<msg time="2026-10-16T01:23:35.844195" 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-manganese/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-10-16T01:23:35.840694" elapsed="0.003556"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:35.845466" 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-10-16T01:23:35.845241" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:35.845925" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:35.845692" elapsed="0.000273"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:23:35.850295" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:35.850352" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:35.850457" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:35.846261" elapsed="0.004592">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:35.846025" elapsed="0.004907">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:35.851136" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:35.850963" elapsed="0.000232"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:35.846009" elapsed="0.005215">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:35.851562" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:35.851682" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:35.851648" elapsed="0.000089"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:35.851633" 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-10-16T01:23:35.851894" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:35.851956" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:23:35.844525" elapsed="0.007548">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:35.852146" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:23:35.800641" elapsed="0.051631">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:35.852658" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:35.852439" elapsed="0.000323"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:35.852392" elapsed="0.000412"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:35.852888" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:23:35.798514" elapsed="0.054565">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:35.795908" elapsed="0.057303">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:35.795880" elapsed="0.057416">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:35.853544" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:35.853937" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:35.854272" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:35.854622" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:35.855086" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:35.855402" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:35.855785" elapsed="0.000028"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:35.856033" elapsed="0.000027"/>
</return>
<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="FAIL" start="2026-10-16T01:23:35.789614" elapsed="0.066532">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:35.856206" elapsed="0.000014"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:35.787755" elapsed="0.068538">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:35.856511" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:35.856371" elapsed="0.000190"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:35.856738" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:35.856583" elapsed="0.000205"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:35.856952" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:35.856810" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:35.856356" elapsed="0.000664"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:35.787394" elapsed="0.069676">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:35.787002" elapsed="0.070122">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:35.857172" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:35.778689" elapsed="0.078574">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:35.857435" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:35.857649" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:35.857512" elapsed="0.000184"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:35.857497" elapsed="0.000338"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:35.857962" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:35.858140" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:35.858199" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:35.777121" elapsed="0.081210">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:35.776611" elapsed="0.081782">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:35.776363" elapsed="0.082240">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:35.775562" elapsed="0.083125">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:35.858915" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:35.754351" elapsed="0.104668">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:36.879277" elapsed="0.000463"/>
</kw>
<msg time="2026-10-16T01:23:36.879872" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:36.877919" elapsed="0.002082"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:36.876848" elapsed="0.003340"/>
</kw>
<msg time="2026-10-16T01:23:36.880280" 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-10-16T01:23:36.869960" elapsed="0.010410"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:36.869088" elapsed="0.011428"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:36.881583" 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-10-16T01:23:36.881041" elapsed="0.000633"/>
</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-10-16T01:23:36.888535" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:36.887760" elapsed="0.000832"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:36.889661" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:36.888986" elapsed="0.000762"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:36.889850" elapsed="0.000066"/>
</return>
<msg time="2026-10-16T01:23:36.890174" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:36.886918" elapsed="0.003308"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:36.890556" elapsed="0.000321"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:36.891985" 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-10-16T01:23:36.891273" elapsed="0.000769"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:36.892977" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:36.892427" elapsed="0.000603"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:36.893901" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:36.893366" elapsed="0.000588"/>
</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-10-16T01:23:36.902864" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:36.901436" elapsed="0.001666"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:36.903237" elapsed="0.000134"/>
</return>
<msg time="2026-10-16T01:23:36.903846" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:36.898172" elapsed="0.005800"/>
</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-10-16T01:23:36.928907" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:36.928457" elapsed="0.000487"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:36.930046" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:36.929729" elapsed="0.000442">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:36.930290" 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-10-16T01:23:36.929210" elapsed="0.001112"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:36.931017" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:36.930558" elapsed="0.000495"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:36.931465" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:36.931675" 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-10-16T01:23:36.931305" elapsed="0.000424"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:36.932328" 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-10-16T01:23:36.931999" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:36.933729" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:36.933389" elapsed="0.000399"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:36.934604" 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-10-16T01:23:36.934027" elapsed="0.000612"/>
</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-10-16T01:23:36.935084" elapsed="0.000037"/>
</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-10-16T01:23:36.935404" elapsed="0.000033"/>
</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-10-16T01:23:36.935605" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:36.934880" elapsed="0.000777"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:36.934720" elapsed="0.000967"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:36.935745" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:23:36.935878" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:36.932849" elapsed="0.003052"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:36.932470" elapsed="0.003460"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:36.936117" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:36.935956" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:36.932446" elapsed="0.003750"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:36.936771" 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-10-16T01:23:36.936352" elapsed="0.000445"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:36.936842" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:36.927672" elapsed="0.009269"/>
</kw>
<msg time="2026-10-16T01:23:36.937027" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:36.921667" elapsed="0.015425"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:36.940978" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:36.944830" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:36.948648" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:36.948841" 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-10-16T01:23:36.949020" elapsed="0.000019"/>
</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-10-16T01:23:36.949370" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:36.949228" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:36.949214" elapsed="0.000229"/>
</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-10-16T01:23:36.949596" elapsed="0.000019"/>
</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-10-16T01:23:36.949787" 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-10-16T01:23:36.949950" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:36.949188" elapsed="0.000811"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:36.949099" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:36.950199" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:36.950271" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:23:36.950377" 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-10-16T01:23:36.920781" elapsed="0.029619"/>
</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-10-16T01:23:36.951525" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:36.951334" elapsed="0.000251">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:36.951668" 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-10-16T01:23:36.950987" elapsed="0.000704"/>
</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-10-16T01:23:36.951991" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:36.951772" elapsed="0.000324"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:36.952560" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:36.952292" elapsed="0.000294"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:36.952122" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:36.951754" elapsed="0.000884"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:36.953175" 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-10-16T01:23:36.952813" elapsed="0.000386"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:36.953245" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:23:36.953371" 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-manganese/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-10-16T01:23:36.950668" elapsed="0.002725"/>
</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-10-16T01:23:36.954486" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:36.954296" elapsed="0.000249">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:36.954629" 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-10-16T01:23:36.953959" elapsed="0.000693"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:36.954844" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:23:36.954737" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:36.954719" elapsed="0.000203"/>
</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-10-16T01:23:36.955087" 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-10-16T01:23:36.955263" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:36.955323" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:36.955447" 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-manganese/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-10-16T01:23:36.953645" elapsed="0.001825"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:36.956917" 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-10-16T01:23:36.956674" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:36.957380" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:36.957160" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:23:36.961828" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:36.961891" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:36.961997" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:36.957728" elapsed="0.004681">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:36.957481" elapsed="0.005011">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:36.962674" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:36.962523" elapsed="0.000226"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:36.957464" elapsed="0.005307">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:36.963130" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:36.963289" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:36.963255" elapsed="0.000073"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:36.963238" elapsed="0.000110"/>
</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-10-16T01:23:36.963484" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:36.963547" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:23:36.955945" elapsed="0.007706">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:36.963737" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:23:36.910771" elapsed="0.053096">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:36.964274" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:36.964033" elapsed="0.000323"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:36.963986" elapsed="0.000412"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:36.964481" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:23:36.908498" elapsed="0.056146">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:36.904490" elapsed="0.060276">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:36.904446" elapsed="0.060396">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:36.965102" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:36.965455" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:36.965780" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:36.966156" elapsed="0.000024"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:36.966595" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:36.966937" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:36.967304" elapsed="0.000019"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:36.967547" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:23:36.896811" elapsed="0.070837">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:36.967820" elapsed="0.000023"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:36.894820" elapsed="0.073111">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:36.968169" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:36.968013" elapsed="0.000207"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:36.968422" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:36.968243" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:36.968640" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:36.968496" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:36.967996" elapsed="0.000732"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:36.894450" elapsed="0.074319">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:36.894048" elapsed="0.074775">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:36.968873" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:36.885526" elapsed="0.083439">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:36.969151" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:36.969375" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:36.969231" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:36.969215" elapsed="0.000229"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:36.969569" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:36.969847" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:36.969909" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:36.883924" elapsed="0.086078">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:36.883434" elapsed="0.086642">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:36.883180" elapsed="0.086955">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:36.882190" elapsed="0.088027">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:36.970427" elapsed="0.000021"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:36.859955" elapsed="0.110577">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:37.990584" elapsed="0.000464"/>
</kw>
<msg time="2026-10-16T01:23:37.991201" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:37.989308" elapsed="0.002027"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:37.988357" elapsed="0.003138"/>
</kw>
<msg time="2026-10-16T01:23:37.991587" 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-10-16T01:23:37.981493" elapsed="0.010185"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:37.980588" elapsed="0.011274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:37.993199" 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-10-16T01:23:37.992598" elapsed="0.000696"/>
</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-10-16T01:23:38.000119" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:37.999323" elapsed="0.000856"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:38.001184" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:38.000514" elapsed="0.000724"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:38.001335" elapsed="0.000064"/>
</return>
<msg time="2026-10-16T01:23:38.001625" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:37.998485" elapsed="0.003191"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:38.002041" elapsed="0.000373"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:38.003508" 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-10-16T01:23:38.002815" elapsed="0.000748"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:38.004453" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:38.003922" elapsed="0.000584"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:38.005370" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:38.004845" elapsed="0.000578"/>
</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-10-16T01:23:38.014285" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:38.012837" elapsed="0.001556"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:38.014519" elapsed="0.000135"/>
</return>
<msg time="2026-10-16T01:23:38.015166" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:38.009485" elapsed="0.005808"/>
</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-10-16T01:23:38.040014" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:38.039525" elapsed="0.000529"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:38.041159" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:38.040821" elapsed="0.000438">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:38.041378" 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-10-16T01:23:38.040344" elapsed="0.001065"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:38.042119" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:38.041643" elapsed="0.000513"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:38.042543" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:38.042777" 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-10-16T01:23:38.042382" elapsed="0.000429"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:38.043411" 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-10-16T01:23:38.043101" elapsed="0.000368"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:38.044923" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:38.044507" elapsed="0.000458"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:38.045485" 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-10-16T01:23:38.045157" elapsed="0.000353"/>
</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-10-16T01:23:38.045828" 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-10-16T01:23:38.046014" 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-10-16T01:23:38.046304" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:38.045673" elapsed="0.000685"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:38.045557" elapsed="0.000830"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:38.046428" elapsed="0.000029"/>
</return>
<msg time="2026-10-16T01:23:38.046563" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:38.043944" elapsed="0.002642"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:38.043564" elapsed="0.003051"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:38.046802" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:38.046641" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:38.043536" elapsed="0.003337"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:38.047437" 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-10-16T01:23:38.047027" elapsed="0.000435"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:38.047505" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:38.038814" elapsed="0.008789"/>
</kw>
<msg time="2026-10-16T01:23:38.047652" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:38.032937" elapsed="0.014781"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:38.051519" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:38.055305" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:38.059161" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:38.059376" elapsed="0.000028"/>
</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-10-16T01:23:38.059616" elapsed="0.000026"/>
</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-10-16T01:23:38.060361" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:38.060211" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:38.060195" elapsed="0.000243"/>
</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-10-16T01:23:38.060591" elapsed="0.000019"/>
</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-10-16T01:23:38.060802" 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-10-16T01:23:38.061008" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:38.060160" elapsed="0.000898"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:38.060018" elapsed="0.001080"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:38.061249" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:38.061318" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:38.061426" 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-10-16T01:23:38.031907" elapsed="0.029543"/>
</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-10-16T01:23:38.062584" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:38.062382" elapsed="0.000265">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:38.062759" 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-10-16T01:23:38.062038" 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-10-16T01:23:38.063064" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:38.062846" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:38.063597" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:38.063336" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:38.063154" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:38.062830" elapsed="0.000843"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:38.064204" 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-10-16T01:23:38.063850" elapsed="0.000381"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:38.064276" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:23:38.064398" 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-manganese/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-10-16T01:23:38.061736" elapsed="0.002684"/>
</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-10-16T01:23:38.065512" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:38.065323" elapsed="0.000247">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:38.065652" 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-10-16T01:23:38.064984" elapsed="0.000691"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:38.065856" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:23:38.065755" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:38.065738" elapsed="0.000195"/>
</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-10-16T01:23:38.066097" 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-10-16T01:23:38.066273" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:38.066334" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:38.066458" 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-manganese/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-10-16T01:23:38.064669" elapsed="0.001812"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:38.067894" 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-10-16T01:23:38.067655" elapsed="0.000281"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:38.068394" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:38.068173" elapsed="0.000262"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:23:38.073193" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:38.073250" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:38.073355" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:38.068741" elapsed="0.005029">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:38.068495" elapsed="0.005357">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:38.074032" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:38.073882" elapsed="0.000226"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:38.068478" elapsed="0.005652">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:38.074478" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:38.074596" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:38.074564" elapsed="0.000069"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:38.074548" elapsed="0.000105"/>
</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-10-16T01:23:38.074809" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:38.074873" elapsed="0.000013"/>
</return>
<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="FAIL" start="2026-10-16T01:23:38.066951" elapsed="0.008024">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:38.075041" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:23:38.021850" elapsed="0.053357">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:38.075596" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:38.075377" elapsed="0.000303"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:38.075328" elapsed="0.000417"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:38.075834" elapsed="0.000039"/>
</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="FAIL" start="2026-10-16T01:23:38.019638" elapsed="0.056378">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:38.015993" elapsed="0.060150">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:38.015944" elapsed="0.060274">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:38.076469" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:38.076870" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:38.077200" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:38.077554" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:38.078011" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:38.078363" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:38.078748" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:38.078989" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:23:38.008159" elapsed="0.070946">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:38.079169" elapsed="0.000014"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:38.006281" elapsed="0.072976">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:38.079477" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:38.079337" elapsed="0.000190"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:38.079685" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:38.079549" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:38.079931" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:38.079784" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:38.079321" elapsed="0.000677"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:38.005922" elapsed="0.074114">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:38.005517" elapsed="0.074588">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:38.080156" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:37.996927" elapsed="0.083329">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:38.080432" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:38.080650" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:38.080510" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:38.080495" elapsed="0.000352"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:38.080977" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:38.081163" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:38.081222" elapsed="0.000015"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:37.995326" elapsed="0.085991">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:37.994843" elapsed="0.086537">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:37.994557" elapsed="0.086927">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:37.993781" elapsed="0.087789">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:38.081805" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:37.971448" elapsed="0.110465">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:39.102221" elapsed="0.000471"/>
</kw>
<msg time="2026-10-16T01:23:39.102847" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:39.100929" elapsed="0.002045"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:39.099943" elapsed="0.003216"/>
</kw>
<msg time="2026-10-16T01:23:39.103252" 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-10-16T01:23:39.093054" elapsed="0.010287"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:39.092174" elapsed="0.011313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:39.104571" 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-10-16T01:23:39.104004" elapsed="0.000657"/>
</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-10-16T01:23:39.111343" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:39.110549" elapsed="0.000852"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:39.112382" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:39.111763" elapsed="0.000673"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:39.112532" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:23:39.112854" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:39.109695" elapsed="0.003211"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:39.113257" elapsed="0.000285"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:39.114624" 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-10-16T01:23:39.113937" elapsed="0.000741"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:39.115566" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:39.115040" elapsed="0.000578"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:39.116474" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:39.115951" elapsed="0.000575"/>
</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-10-16T01:23:39.125423" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:39.123999" elapsed="0.001532"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:39.125657" elapsed="0.000188"/>
</return>
<msg time="2026-10-16T01:23:39.126305" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:39.120666" elapsed="0.005767"/>
</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-10-16T01:23:39.150481" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:39.150038" elapsed="0.000479"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:39.151530" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:39.151216" elapsed="0.000421">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:39.151781" 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-10-16T01:23:39.150755" elapsed="0.001058"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:39.152498" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:39.152047" elapsed="0.000486"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:39.152938" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:39.153163" 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-10-16T01:23:39.152778" elapsed="0.000419"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:39.153786" 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-10-16T01:23:39.153460" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:39.155293" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:39.154952" elapsed="0.000398"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:39.155970" 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-10-16T01:23:39.155588" elapsed="0.000416"/>
</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-10-16T01:23:39.156478" 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-10-16T01:23:39.156716" 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-10-16T01:23:39.156899" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:39.156255" elapsed="0.000696"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:39.156063" elapsed="0.000918"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:39.157022" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:23:39.157167" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:39.154465" elapsed="0.002726"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:39.154105" elapsed="0.003115"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:39.157389" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:39.157246" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:39.153905" elapsed="0.003553"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:39.158022" 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-10-16T01:23:39.157611" elapsed="0.000436"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:39.158103" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:39.149319" elapsed="0.008886"/>
</kw>
<msg time="2026-10-16T01:23:39.158253" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:39.143626" elapsed="0.014673"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:39.162127" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:39.165927" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:39.169723" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:39.169900" elapsed="0.000020"/>
</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-10-16T01:23:39.170076" elapsed="0.000122"/>
</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-10-16T01:23:39.170515" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:39.170376" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:39.170362" elapsed="0.000227"/>
</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-10-16T01:23:39.170755" 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-10-16T01:23:39.170933" elapsed="0.000018"/>
</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-10-16T01:23:39.171106" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:39.170337" elapsed="0.000820"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:39.170247" elapsed="0.000934"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:39.171336" elapsed="0.000028"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:39.171413" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:39.171517" 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-10-16T01:23:39.142683" elapsed="0.028857"/>
</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-10-16T01:23:39.172644" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:39.172455" elapsed="0.000265">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:39.172804" 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-10-16T01:23:39.172137" elapsed="0.000690"/>
</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-10-16T01:23:39.173118" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:39.172890" elapsed="0.000281"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:39.173616" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:39.173354" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:39.173194" elapsed="0.000478"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:39.172873" elapsed="0.000819"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:39.174216" 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-10-16T01:23:39.173863" elapsed="0.000415"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:39.174326" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:39.174450" 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-manganese/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-10-16T01:23:39.171826" elapsed="0.002646"/>
</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-10-16T01:23:39.177418" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:39.175361" elapsed="0.002117">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:39.177563" 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-10-16T01:23:39.175031" elapsed="0.002554"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:39.177772" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:23:39.177654" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:39.177634" elapsed="0.000215"/>
</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-10-16T01:23:39.178012" 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-10-16T01:23:39.178203" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:39.178264" elapsed="0.000017"/>
</return>
<msg time="2026-10-16T01:23:39.178394" 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-manganese/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-10-16T01:23:39.174734" elapsed="0.003683"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:39.179644" 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-10-16T01:23:39.179418" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:39.180119" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:39.179888" elapsed="0.000272"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:23:39.184279" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:39.184339" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:39.184446" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:39.180444" elapsed="0.004405">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:39.180220" elapsed="0.004710">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:39.185126" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:39.184960" elapsed="0.000225"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:39.180203" elapsed="0.005005">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:39.185545" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:39.185664" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:39.185631" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:39.185615" 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-10-16T01:23:39.185876" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:39.185971" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:23:39.178692" elapsed="0.007383">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:39.186158" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:23:39.132987" elapsed="0.053298">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:39.186670" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:39.186453" elapsed="0.000326"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:39.186406" elapsed="0.000419"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:39.186910" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:23:39.130818" elapsed="0.056256">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:39.127156" elapsed="0.060032">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:39.127109" elapsed="0.060153">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:39.187512" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:39.187880" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:39.188206" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:39.188554" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:39.188998" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:39.189326" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:39.189779" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:39.190021" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:23:39.119251" elapsed="0.070886">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:39.190198" elapsed="0.000018"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:39.117374" elapsed="0.072918">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:39.190510" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:39.190371" elapsed="0.000188"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:39.190744" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:39.190581" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:39.190957" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:39.190816" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:39.190355" elapsed="0.000714"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:39.117022" elapsed="0.074104">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:39.116618" elapsed="0.074563">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:39.191230" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:39.108343" elapsed="0.082977">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:39.191496" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:39.191733" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:39.191573" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:39.191558" elapsed="0.000246"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:39.191929" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:39.192108" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:39.192167" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:39.106752" elapsed="0.085506">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:39.106272" elapsed="0.086047">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:39.105997" elapsed="0.086369">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:39.105161" elapsed="0.087284">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:39.192651" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:39.082933" elapsed="0.109943">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:40.213227" elapsed="0.000433"/>
</kw>
<msg time="2026-10-16T01:23:40.213820" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:40.211685" elapsed="0.002260"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:40.210766" elapsed="0.003369"/>
</kw>
<msg time="2026-10-16T01:23:40.214230" 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-10-16T01:23:40.203990" elapsed="0.010331"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:40.203081" elapsed="0.011391"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:40.215546" 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-10-16T01:23:40.214998" elapsed="0.000640"/>
</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-10-16T01:23:40.222463" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:40.221668" elapsed="0.000852"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:40.223521" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:40.222885" elapsed="0.000691"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:40.223675" elapsed="0.000095"/>
</return>
<msg time="2026-10-16T01:23:40.224005" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:40.220861" elapsed="0.003195"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:40.224414" elapsed="0.000318"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:40.225839" 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-10-16T01:23:40.225128" elapsed="0.000767"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:40.226794" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:40.226249" elapsed="0.000603"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:40.227695" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:40.227190" elapsed="0.000590"/>
</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-10-16T01:23:40.236790" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:40.235286" elapsed="0.001618"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:40.237035" elapsed="0.000165"/>
</return>
<msg time="2026-10-16T01:23:40.237637" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:40.231905" elapsed="0.005914"/>
</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-10-16T01:23:40.262284" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:40.261835" elapsed="0.000485"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:40.263348" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:40.263011" elapsed="0.000447">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:40.263578" 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-10-16T01:23:40.262538" elapsed="0.001072"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:40.264336" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:40.263879" elapsed="0.000493"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:40.264781" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:40.264995" 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-10-16T01:23:40.264601" elapsed="0.000428"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:40.265632" 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-10-16T01:23:40.265316" elapsed="0.000373"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:40.266998" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:40.266648" elapsed="0.000407"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:40.267924" 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-10-16T01:23:40.267321" elapsed="0.000638"/>
</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-10-16T01:23:40.268414" elapsed="0.000030"/>
</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-10-16T01:23:40.268674" elapsed="0.000052"/>
</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-10-16T01:23:40.269071" elapsed="0.000067"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:40.268231" elapsed="0.000959"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:40.268021" elapsed="0.001206"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:40.269269" elapsed="0.000028"/>
</return>
<msg time="2026-10-16T01:23:40.269403" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:40.266185" elapsed="0.003241"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:40.265808" elapsed="0.003647"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:40.269627" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:40.269481" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:40.265783" elapsed="0.003915"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:40.270316" 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-10-16T01:23:40.269885" elapsed="0.000456"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:40.270386" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:40.261107" elapsed="0.009378"/>
</kw>
<msg time="2026-10-16T01:23:40.270532" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:40.255310" elapsed="0.015268"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:40.274408" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:40.278217" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:40.282066" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:40.282257" elapsed="0.000020"/>
</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-10-16T01:23:40.282441" elapsed="0.000019"/>
</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-10-16T01:23:40.282792" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:40.282635" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:40.282621" elapsed="0.000245"/>
</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-10-16T01:23:40.283016" elapsed="0.000019"/>
</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-10-16T01:23:40.283207" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:40.283368" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:40.282595" elapsed="0.000822"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:40.282507" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:40.283627" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:40.283709" elapsed="0.000016"/>
</return>
<msg time="2026-10-16T01:23:40.283817" 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-10-16T01:23:40.254436" elapsed="0.029405"/>
</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-10-16T01:23:40.284946" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:40.284752" elapsed="0.000253">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:40.285088" 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-10-16T01:23:40.284417" elapsed="0.000709"/>
</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-10-16T01:23:40.285405" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:40.285190" elapsed="0.000267"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:40.285928" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:40.285645" elapsed="0.000307"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:40.285480" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:40.285174" elapsed="0.000831"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:40.286518" 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-10-16T01:23:40.286176" elapsed="0.000366"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:40.286587" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:40.286726" 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-manganese/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-10-16T01:23:40.284121" elapsed="0.002629"/>
</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-10-16T01:23:40.287827" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:40.287620" elapsed="0.000265">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:40.287968" 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-10-16T01:23:40.287307" elapsed="0.000683"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:40.288171" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:23:40.288053" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:40.288037" elapsed="0.000212"/>
</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-10-16T01:23:40.288403" elapsed="0.000020"/>
</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-10-16T01:23:40.288575" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:40.288635" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:40.288776" 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-manganese/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-10-16T01:23:40.286996" elapsed="0.001804"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:40.290229" 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-10-16T01:23:40.289982" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:40.290674" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:40.290455" elapsed="0.000275"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:23:40.294971" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:40.295059" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:40.295262" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:40.291017" elapsed="0.004628">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:40.290792" elapsed="0.004950">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:40.295925" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:40.295774" elapsed="0.000209"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:40.290775" elapsed="0.005231">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:40.296369" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:40.296491" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:40.296457" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:40.296441" elapsed="0.000108"/>
</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-10-16T01:23:40.296686" elapsed="0.000035"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:40.296767" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:23:40.289269" elapsed="0.007602">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:40.296939" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:23:40.244579" elapsed="0.052488">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:40.297482" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:40.297255" elapsed="0.000309"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:40.297206" elapsed="0.000399"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:40.297688" 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="FAIL" start="2026-10-16T01:23:40.242405" elapsed="0.055476">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:40.238322" elapsed="0.059660">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:40.238276" elapsed="0.059778">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:40.298321" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:40.298669" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:40.298999" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:40.299365" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:40.299859" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:40.300190" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:40.300534" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:40.300884" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:23:40.230535" elapsed="0.070453">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:40.301050" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:40.228614" elapsed="0.072543">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:40.301380" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:40.301239" elapsed="0.000191"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:40.301588" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:40.301452" elapsed="0.000185"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:40.301825" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:40.301658" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:40.301223" elapsed="0.000673"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:40.228282" elapsed="0.073652">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:40.227877" elapsed="0.074111">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:40.302036" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:40.219332" elapsed="0.082812">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:40.302321" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:40.302541" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:40.302399" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:40.302384" elapsed="0.000225"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:40.302827" elapsed="0.000021"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:40.302999" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:40.303057" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:40.217697" elapsed="0.085470">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:40.217229" elapsed="0.086002">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:40.216945" elapsed="0.086336">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:40.216152" elapsed="0.087212">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:40.303622" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:40.193821" elapsed="0.109972">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:41.325225" elapsed="0.000437"/>
</kw>
<msg time="2026-10-16T01:23:41.325818" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:41.323899" elapsed="0.002161"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:41.322898" elapsed="0.003359"/>
</kw>
<msg time="2026-10-16T01:23:41.326360" 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-10-16T01:23:41.315311" elapsed="0.011155"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:41.314314" elapsed="0.012306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:41.327819" 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-10-16T01:23:41.327168" elapsed="0.000759"/>
</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-10-16T01:23:41.334628" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:41.333863" elapsed="0.000823"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:41.335765" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:41.335054" elapsed="0.000768"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:41.335919" elapsed="0.000064"/>
</return>
<msg time="2026-10-16T01:23:41.336235" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:41.333019" elapsed="0.003267"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:41.336613" elapsed="0.000321"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:41.338183" 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-10-16T01:23:41.337325" elapsed="0.000945"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:41.339290" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:41.338683" elapsed="0.000667"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:41.340392" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:41.339781" elapsed="0.000667"/>
</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-10-16T01:23:41.349782" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:41.348326" elapsed="0.001570"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:41.350022" elapsed="0.000169"/>
</return>
<msg time="2026-10-16T01:23:41.350585" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:41.344831" elapsed="0.005833"/>
</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-10-16T01:23:41.373916" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:41.373447" elapsed="0.000511"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:41.375128" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:41.374778" elapsed="0.000462">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:41.375361" 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-10-16T01:23:41.374303" elapsed="0.001089"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:41.376124" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:41.375633" elapsed="0.000529"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:41.376611" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:41.376822" 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-10-16T01:23:41.376410" elapsed="0.000435"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:41.377284" 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-10-16T01:23:41.377039" 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-10-16T01:23:41.378431" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:41.378029" elapsed="0.000444"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:41.378929" 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-10-16T01:23:41.378647" elapsed="0.000307"/>
</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-10-16T01:23:41.379279" 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-10-16T01:23:41.379479" elapsed="0.000021"/>
</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-10-16T01:23:41.379660" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:41.379145" elapsed="0.000581"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:41.379004" elapsed="0.000755"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:41.379806" elapsed="0.000031"/>
</return>
<msg time="2026-10-16T01:23:41.379945" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:41.377678" elapsed="0.002289"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:41.377404" elapsed="0.002592"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:41.380180" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:41.380023" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:41.377380" elapsed="0.002870"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:41.380831" 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-10-16T01:23:41.380410" elapsed="0.000447"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:41.380900" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:41.372724" elapsed="0.008274"/>
</kw>
<msg time="2026-10-16T01:23:41.381050" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:41.366938" elapsed="0.014159"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:41.384887" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:41.388670" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:41.392478" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:41.392654" elapsed="0.000020"/>
</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-10-16T01:23:41.392846" elapsed="0.000019"/>
</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-10-16T01:23:41.393204" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:41.393041" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:41.393028" 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-10-16T01:23:41.393429" elapsed="0.000018"/>
</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-10-16T01:23:41.393602" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:41.393775" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:41.393001" elapsed="0.000824"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:41.392913" elapsed="0.000935"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:41.393997" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:41.394065" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:41.394183" 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-10-16T01:23:41.366057" elapsed="0.028150"/>
</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-10-16T01:23:41.395320" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:41.395123" elapsed="0.000258">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:41.395463" 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-10-16T01:23:41.394783" elapsed="0.000703"/>
</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-10-16T01:23:41.395781" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:41.395550" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:41.396327" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:41.396038" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:41.395857" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:41.395532" elapsed="0.000875"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:41.396913" 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-10-16T01:23:41.396563" elapsed="0.000380"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:41.396988" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:23:41.397136" 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-manganese/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-10-16T01:23:41.394472" elapsed="0.002688"/>
</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-10-16T01:23:41.398474" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:41.398071" elapsed="0.000461">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:41.398616" 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-10-16T01:23:41.397756" elapsed="0.000883"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:41.398817" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:23:41.398717" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:41.398685" elapsed="0.000210"/>
</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-10-16T01:23:41.399044" elapsed="0.000020"/>
</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-10-16T01:23:41.399230" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:41.399291" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:41.399415" 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-manganese/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-10-16T01:23:41.397444" elapsed="0.001994"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:41.400879" 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-10-16T01:23:41.400635" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:41.401349" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:41.401124" elapsed="0.000265"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:23:41.405288" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:41.405344" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:41.405449" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:41.401670" elapsed="0.004188">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:41.401448" elapsed="0.004491">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:41.406133" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:41.405970" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:41.401432" elapsed="0.004782">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:41.406556" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:41.406676" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:41.406643" elapsed="0.000090"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:41.406627" elapsed="0.000128"/>
</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-10-16T01:23:41.406891" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:41.406953" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:23:41.399922" elapsed="0.007134">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:41.407170" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:23:41.356281" elapsed="0.051021">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:41.407730" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:41.407483" elapsed="0.000332"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:41.407428" elapsed="0.000428"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:41.407950" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:23:41.353882" elapsed="0.054248">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:41.351134" elapsed="0.057098">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:41.351090" elapsed="0.057215">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:41.408560" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:41.408933" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:41.409260" elapsed="0.000091"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:41.409694" elapsed="0.000047"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:41.410166" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:41.410482" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:41.410855" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:41.411289" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:23:41.343269" elapsed="0.068122">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:41.411454" elapsed="0.000024"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:41.341308" elapsed="0.070248">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:41.411802" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:41.411635" elapsed="0.000219"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:41.412013" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:41.411877" elapsed="0.000185"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:41.412267" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:41.412084" elapsed="0.000230"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:41.411619" elapsed="0.000717"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:41.340947" elapsed="0.071427">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:41.340542" elapsed="0.071884">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:41.412475" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:41.331619" elapsed="0.080993">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:41.412874" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:41.413098" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:41.412956" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:41.412941" elapsed="0.000243"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:41.413310" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:41.413477" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:41.413536" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:41.329961" elapsed="0.083671">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:41.329472" elapsed="0.084222">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:41.329221" elapsed="0.084604">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:41.328411" elapsed="0.085500">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:41.414141" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:41.304787" elapsed="0.109464">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:42.434526" elapsed="0.000465"/>
</kw>
<msg time="2026-10-16T01:23:42.435138" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:42.433240" elapsed="0.002028"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:42.432094" elapsed="0.003336"/>
</kw>
<msg time="2026-10-16T01:23:42.435525" 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-10-16T01:23:42.425139" elapsed="0.010476"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:42.424248" elapsed="0.011548"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:42.436869" 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-10-16T01:23:42.436317" elapsed="0.000645"/>
</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-10-16T01:23:42.443818" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:42.443013" elapsed="0.000864"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:42.444919" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:42.444239" elapsed="0.000736"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:42.445223" elapsed="0.000068"/>
</return>
<msg time="2026-10-16T01:23:42.445527" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:42.442201" elapsed="0.003378"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:42.445945" elapsed="0.000315"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:42.447358" 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-10-16T01:23:42.446634" elapsed="0.000780"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:42.448307" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:42.447775" elapsed="0.000585"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:42.449227" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:42.448672" elapsed="0.000608"/>
</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-10-16T01:23:42.458233" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:42.456792" elapsed="0.001551"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:42.458470" elapsed="0.000135"/>
</return>
<msg time="2026-10-16T01:23:42.459081" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:42.453361" elapsed="0.005870"/>
</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-10-16T01:23:42.482940" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:42.482496" elapsed="0.000480"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:42.483998" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:42.483664" elapsed="0.000442">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:42.484247" 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-10-16T01:23:42.483222" elapsed="0.001056"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:42.484964" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:42.484511" elapsed="0.000488"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:42.485405" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:42.485615" 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-10-16T01:23:42.485244" elapsed="0.000405"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:42.486263" 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-10-16T01:23:42.485936" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:42.487737" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:42.487461" elapsed="0.000318"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:42.488237" 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-10-16T01:23:42.487964" 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-10-16T01:23:42.488544" 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-10-16T01:23:42.488746" 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-10-16T01:23:42.488932" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:42.488415" elapsed="0.000569"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:42.488304" elapsed="0.000711"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:42.489056" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:42.489244" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:42.486943" elapsed="0.002325"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:42.486562" elapsed="0.002735"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:42.489472" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:42.489323" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:42.486381" elapsed="0.003162"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:42.490110" 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-10-16T01:23:42.489696" elapsed="0.000454"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:42.490201" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:42.481787" elapsed="0.008513"/>
</kw>
<msg time="2026-10-16T01:23:42.490348" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:42.476024" elapsed="0.014369"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:42.494226" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:42.497986" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:42.501761" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:42.501939" elapsed="0.000020"/>
</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-10-16T01:23:42.502113" elapsed="0.000033"/>
</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-10-16T01:23:42.502475" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:42.502323" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:42.502309" 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-10-16T01:23:42.502724" 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-10-16T01:23:42.502903" elapsed="0.000018"/>
</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-10-16T01:23:42.503068" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:42.502283" elapsed="0.000846"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:42.502194" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:42.503306" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:42.503374" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:23:42.503478" 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-10-16T01:23:42.475180" elapsed="0.028321"/>
</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-10-16T01:23:42.504669" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:42.504477" elapsed="0.000269">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:42.504831" 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-10-16T01:23:42.504149" elapsed="0.000705"/>
</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-10-16T01:23:42.505149" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:42.504916" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:42.505651" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:42.505388" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:42.505225" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:42.504899" elapsed="0.000845"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:42.506252" 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-10-16T01:23:42.505901" elapsed="0.000375"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:42.506320" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:42.506443" 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-manganese/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-10-16T01:23:42.503835" elapsed="0.002630"/>
</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-10-16T01:23:42.509442" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:42.507358" elapsed="0.002149">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:42.509593" 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-10-16T01:23:42.507024" elapsed="0.002593"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:42.509802" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:23:42.509681" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:42.509664" elapsed="0.000215"/>
</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-10-16T01:23:42.510031" 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-10-16T01:23:42.510229" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:42.510291" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:42.510418" 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-manganese/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-10-16T01:23:42.506726" elapsed="0.003715"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:42.511678" 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-10-16T01:23:42.511438" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:42.512158" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:42.511924" elapsed="0.000274"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:23:42.516736" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:42.516793" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:42.516936" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:42.512479" elapsed="0.004846">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:42.512257" elapsed="0.005148">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:42.517588" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:42.517436" elapsed="0.000210"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:42.512241" elapsed="0.005427">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:42.518028" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:42.518165" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:42.518129" elapsed="0.000074"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:42.518100" 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-10-16T01:23:42.518357" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:42.518424" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:23:42.510732" elapsed="0.007793">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:42.518591" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:23:42.465432" elapsed="0.053314">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:42.519146" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:42.518915" elapsed="0.000314"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:42.518868" elapsed="0.000403"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:42.519355" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:23:42.463300" elapsed="0.056225">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:42.459692" elapsed="0.059932">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:42.459649" elapsed="0.060048">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:42.519964" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:42.520330" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:42.520637" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:42.521017" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:42.521459" elapsed="0.000024"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:42.521798" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:42.522185" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:42.522472" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:23:42.451978" elapsed="0.070598">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:42.522638" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:42.450141" elapsed="0.072611">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:42.522976" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:42.522835" elapsed="0.000191"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:42.523200" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:42.523048" elapsed="0.000202"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:42.523413" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:42.523272" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:42.522819" elapsed="0.000662"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:42.449784" elapsed="0.073736">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:42.449376" elapsed="0.074197">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:42.523622" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:42.440828" elapsed="0.082964">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:42.523972" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:42.524209" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:42.524050" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:42.524035" elapsed="0.000244"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:42.524404" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:42.524572" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:42.524631" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:42.439203" elapsed="0.085605">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:42.438658" elapsed="0.086215">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:42.438358" elapsed="0.086564">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:42.437455" elapsed="0.087547">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:42.525229" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:42.415194" elapsed="0.110139">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:43.545548" elapsed="0.000530"/>
</kw>
<msg time="2026-10-16T01:23:43.546222" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:43.544293" elapsed="0.002051"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:43.543352" elapsed="0.003165"/>
</kw>
<msg time="2026-10-16T01:23:43.546625" 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-10-16T01:23:43.536443" elapsed="0.010317"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:43.535502" elapsed="0.011410"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:43.547988" 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-10-16T01:23:43.547424" elapsed="0.000656"/>
</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-10-16T01:23:43.554787" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:43.553987" elapsed="0.000859"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:43.555878" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:43.555205" elapsed="0.000730"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:43.556032" elapsed="0.000065"/>
</return>
<msg time="2026-10-16T01:23:43.556351" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:43.553161" elapsed="0.003242"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:43.556825" elapsed="0.000292"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:43.558239" 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-10-16T01:23:43.557507" elapsed="0.000789"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:43.559184" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:43.558625" elapsed="0.000615"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:43.560095" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:43.559551" elapsed="0.000621"/>
</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-10-16T01:23:43.569048" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:43.567523" elapsed="0.001657"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:43.569318" elapsed="0.000134"/>
</return>
<msg time="2026-10-16T01:23:43.570084" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:43.564278" elapsed="0.005957"/>
</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-10-16T01:23:43.593467" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:43.593012" elapsed="0.000492"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:43.594516" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:43.594203" elapsed="0.000421">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:43.594765" 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-10-16T01:23:43.593739" elapsed="0.001059"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:43.595580" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:43.595116" elapsed="0.000499"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:43.596027" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:43.596251" 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-10-16T01:23:43.595865" elapsed="0.000420"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:43.596892" 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-10-16T01:23:43.596553" elapsed="0.000397"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:43.598237" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:43.597896" elapsed="0.000398"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:43.599084" 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-10-16T01:23:43.598570" elapsed="0.000539"/>
</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-10-16T01:23:43.599411" elapsed="0.000020"/>
</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-10-16T01:23:43.599593" elapsed="0.000022"/>
</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-10-16T01:23:43.599791" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:43.599280" elapsed="0.000564"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:43.599167" elapsed="0.000706"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:43.599915" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:23:43.600045" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:43.597407" elapsed="0.002661"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:43.597036" elapsed="0.003060"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:43.600290" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:43.600122" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:43.597012" elapsed="0.003349"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:43.600940" 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-10-16T01:23:43.600518" elapsed="0.000448"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:43.601010" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:43.592295" elapsed="0.008815"/>
</kw>
<msg time="2026-10-16T01:23:43.601174" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:43.586571" elapsed="0.014651"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:43.605048" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:43.608852" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:43.612648" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:43.612878" 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-10-16T01:23:43.613060" elapsed="0.000019"/>
</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-10-16T01:23:43.613418" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:43.613274" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:43.613260" 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-10-16T01:23:43.613644" 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-10-16T01:23:43.613838" 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-10-16T01:23:43.614001" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:43.613233" elapsed="0.000817"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:43.613141" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:43.614241" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:43.614309" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:23:43.614414" 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-10-16T01:23:43.585727" elapsed="0.028711"/>
</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-10-16T01:23:43.615552" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:43.615355" elapsed="0.000258">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:43.615710" 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-10-16T01:23:43.615014" elapsed="0.000721"/>
</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-10-16T01:23:43.616015" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:43.615798" elapsed="0.000269"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:43.616535" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:43.616270" elapsed="0.000290"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:43.616090" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:43.615782" elapsed="0.000831"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:43.617142" 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-10-16T01:23:43.616787" elapsed="0.000380"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:43.617213" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:43.617336" 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-manganese/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-10-16T01:23:43.614715" elapsed="0.002643"/>
</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-10-16T01:23:43.618440" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:43.618250" elapsed="0.000248">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:43.618585" 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-10-16T01:23:43.617916" elapsed="0.000691"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:43.618828" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:23:43.618726" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:43.618693" elapsed="0.000214"/>
</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-10-16T01:23:43.619058" elapsed="0.000020"/>
</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-10-16T01:23:43.619252" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:43.619314" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:23:43.619440" 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-manganese/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-10-16T01:23:43.617603" elapsed="0.001860"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:43.620905" 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-10-16T01:23:43.620660" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:43.621373" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:43.621151" elapsed="0.000262"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:23:43.625601" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:43.625657" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:43.625780" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:43.621697" elapsed="0.004474">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:43.621474" elapsed="0.004777">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:43.626430" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:43.626281" elapsed="0.000213"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:43.621457" elapsed="0.005058">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:43.626872" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:43.626992" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:43.626959" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:43.626943" elapsed="0.000106"/>
</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-10-16T01:23:43.627200" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:43.627264" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:23:43.619943" elapsed="0.007422">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:43.627433" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:23:43.575975" elapsed="0.051585">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:43.627972" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:43.627751" elapsed="0.000339"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:43.627679" elapsed="0.000470"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:43.628236" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:23:43.573531" elapsed="0.054870">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:43.570692" elapsed="0.057813">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:43.570648" elapsed="0.057932">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:43.628848" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:43.629223" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:43.629539" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:43.629919" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:43.630368" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:43.630680" elapsed="0.000043"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:43.631049" elapsed="0.000019"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:43.631303" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:23:43.562929" elapsed="0.068475">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:43.631467" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:43.561013" elapsed="0.070544">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:43.631807" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:43.631637" elapsed="0.000222"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:43.632020" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:43.631881" elapsed="0.000188"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:43.632248" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:43.632090" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:43.631621" elapsed="0.000697"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:43.560646" elapsed="0.071711">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:43.560269" elapsed="0.072141">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:43.632460" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:43.551776" elapsed="0.080775">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:43.632810" elapsed="0.000052"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:43.633071" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:43.632928" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:43.632911" elapsed="0.000243"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:43.633284" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:43.633454" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:43.633514" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:43.550117" elapsed="0.083490">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:43.549625" elapsed="0.084045">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:43.549348" elapsed="0.084446">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:43.548546" elapsed="0.085334">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:43.634092" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:43.526387" elapsed="0.107829">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:44.654384" elapsed="0.000463"/>
</kw>
<msg time="2026-10-16T01:23:44.654978" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:44.653001" elapsed="0.002105"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:44.652059" elapsed="0.003232"/>
</kw>
<msg time="2026-10-16T01:23:44.655382" 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-10-16T01:23:44.645082" elapsed="0.010391"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:44.644203" elapsed="0.011417"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:44.656692" 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-10-16T01:23:44.656169" elapsed="0.000649"/>
</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-10-16T01:23:44.663506" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:44.662730" elapsed="0.000834"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:44.664568" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:44.663934" elapsed="0.000688"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:44.664752" elapsed="0.000066"/>
</return>
<msg time="2026-10-16T01:23:44.665050" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:44.661848" elapsed="0.003252"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:44.665456" elapsed="0.000323"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:44.667010" 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-10-16T01:23:44.666169" elapsed="0.000898"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:44.667971" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:44.667423" elapsed="0.000602"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:44.668899" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:44.668362" elapsed="0.000591"/>
</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-10-16T01:23:44.677782" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:44.676270" elapsed="0.001642"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:44.678044" elapsed="0.000169"/>
</return>
<msg time="2026-10-16T01:23:44.678651" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:44.673000" elapsed="0.005827"/>
</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-10-16T01:23:44.702287" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:44.701846" elapsed="0.000477"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:44.703335" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:44.703003" elapsed="0.000439">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:44.703560" 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-10-16T01:23:44.702539" elapsed="0.001052"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:44.704294" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:44.703847" elapsed="0.000482"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:44.704740" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:44.704943" 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-10-16T01:23:44.704559" elapsed="0.000416"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:44.705564" 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-10-16T01:23:44.705259" elapsed="0.000362"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:44.707081" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:44.706581" elapsed="0.000542"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:44.707573" 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-10-16T01:23:44.707315" 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-10-16T01:23:44.707895" elapsed="0.000020"/>
</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-10-16T01:23:44.708081" elapsed="0.000022"/>
</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-10-16T01:23:44.708281" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:44.707765" elapsed="0.000568"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:44.707640" elapsed="0.000723"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:44.708403" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:44.708531" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:44.706073" elapsed="0.002481"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:44.705724" elapsed="0.002858"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:44.708766" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:44.708607" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:44.705680" elapsed="0.003157"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:44.709399" 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-10-16T01:23:44.708990" elapsed="0.000468"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:44.709504" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:44.701119" elapsed="0.008486"/>
</kw>
<msg time="2026-10-16T01:23:44.709652" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:44.695463" elapsed="0.014257"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:44.713471" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:44.717260" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:44.721012" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:44.721204" elapsed="0.000020"/>
</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-10-16T01:23:44.721379" elapsed="0.000019"/>
</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-10-16T01:23:44.721725" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:44.721572" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:44.721558" 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-10-16T01:23:44.721950" elapsed="0.000019"/>
</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-10-16T01:23:44.722124" 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-10-16T01:23:44.722304" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:44.721532" elapsed="0.000820"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:44.721445" elapsed="0.000930"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:44.722523" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:44.722590" elapsed="0.000013"/>
</return>
<msg time="2026-10-16T01:23:44.722692" 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-10-16T01:23:44.694602" elapsed="0.028128"/>
</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-10-16T01:23:44.723867" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:44.723661" elapsed="0.000264">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:44.724007" 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-10-16T01:23:44.723341" elapsed="0.000689"/>
</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-10-16T01:23:44.724326" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:44.724093" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:44.724842" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:44.724561" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:44.724401" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:44.724077" elapsed="0.000841"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:44.725426" 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-10-16T01:23:44.725075" elapsed="0.000376"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:44.725496" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:44.725618" 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-manganese/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-10-16T01:23:44.722992" elapsed="0.002649"/>
</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-10-16T01:23:44.726743" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:44.726542" elapsed="0.000261">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:44.726885" 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-10-16T01:23:44.726221" elapsed="0.000687"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:44.727069" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:23:44.726971" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:44.726954" elapsed="0.000499"/>
</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-10-16T01:23:44.727664" 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-10-16T01:23:44.727869" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:44.727930" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:23:44.728057" 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-manganese/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-10-16T01:23:44.725899" elapsed="0.002181"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:44.729572" 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-10-16T01:23:44.729345" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:44.730037" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:44.729819" elapsed="0.000257"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:23:44.734392" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:44.734449" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:44.734549" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:44.730374" elapsed="0.004570">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:44.730136" elapsed="0.004918">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:44.735251" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:44.735087" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:44.730119" elapsed="0.005214">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:44.735673" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:44.735811" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:44.735778" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:44.735761" elapsed="0.000108"/>
</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-10-16T01:23:44.736004" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:44.736067" elapsed="0.000013"/>
</return>
<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="FAIL" start="2026-10-16T01:23:44.728618" elapsed="0.007564">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:44.736250" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:23:44.684946" elapsed="0.051430">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:44.736787" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:44.736542" elapsed="0.000329"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:44.736494" elapsed="0.000418"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:44.736995" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:23:44.682785" elapsed="0.054388">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:44.679315" elapsed="0.057959">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:44.679270" elapsed="0.058077">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:44.737598" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:44.737963" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:44.738285" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:44.738634" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:44.739081" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:44.739409" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:44.739777" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:44.740018" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:23:44.671638" elapsed="0.068481">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:44.740226" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:44.669807" elapsed="0.070512">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:44.740538" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:44.740399" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:44.740776" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:44.740611" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:44.740988" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:44.740847" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:44.740383" elapsed="0.000673"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:44.669443" elapsed="0.071651">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:44.669049" elapsed="0.072117">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:44.741216" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:44.660449" elapsed="0.080857">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:44.741480" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:44.741725" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:44.741562" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:44.741547" elapsed="0.000249"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:44.741956" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:44.742126" elapsed="0.000036"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:44.742204" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:44.658844" elapsed="0.083453">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:44.658355" elapsed="0.084003">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:44.658081" elapsed="0.084326">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:44.657303" elapsed="0.085185">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:44.742695" elapsed="0.000145"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:44.635167" elapsed="0.107757">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:45.764790" elapsed="0.000447"/>
</kw>
<msg time="2026-10-16T01:23:45.765357" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:45.763497" elapsed="0.002091"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:45.762514" elapsed="0.003268"/>
</kw>
<msg time="2026-10-16T01:23:45.765876" 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-10-16T01:23:45.755855" elapsed="0.010112"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:45.754778" elapsed="0.011337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:45.767198" 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-10-16T01:23:45.766628" elapsed="0.000665"/>
</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-10-16T01:23:45.773932" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:45.773145" elapsed="0.000845"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:45.775084" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:45.774446" elapsed="0.000692"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:45.775260" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:23:45.775549" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:45.772332" elapsed="0.003267"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:45.775956" elapsed="0.000308"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:45.777352" 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-10-16T01:23:45.776630" elapsed="0.000779"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:45.778302" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:45.777765" elapsed="0.000591"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:45.779238" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:45.778665" elapsed="0.000627"/>
</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-10-16T01:23:45.788019" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:45.786552" elapsed="0.001577"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:45.788283" elapsed="0.000136"/>
</return>
<msg time="2026-10-16T01:23:45.788903" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:45.783314" elapsed="0.005668"/>
</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-10-16T01:23:45.811141" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:45.810718" elapsed="0.000476"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:45.812198" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:45.811874" elapsed="0.000427">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:45.812422" 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-10-16T01:23:45.811407" elapsed="0.001048"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:45.813139" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:45.812686" elapsed="0.000508"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:45.813577" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:45.813852" 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-10-16T01:23:45.813420" elapsed="0.000466"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:45.814483" 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-10-16T01:23:45.814173" elapsed="0.000374"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:45.815748" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:45.815503" elapsed="0.000287"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:45.816235" 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-10-16T01:23:45.815963" 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-10-16T01:23:45.816541" elapsed="0.000020"/>
</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-10-16T01:23:45.816742" elapsed="0.000022"/>
</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-10-16T01:23:45.816922" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:45.816414" elapsed="0.000560"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:45.816304" elapsed="0.000699"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:45.817044" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:45.817191" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:45.815167" elapsed="0.002048"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:45.814874" elapsed="0.002369"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:45.817413" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:45.817269" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:45.814622" elapsed="0.002861"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:45.818055" 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-10-16T01:23:45.817641" elapsed="0.000440"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:45.818124" elapsed="0.000039"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:45.809995" elapsed="0.008243"/>
</kw>
<msg time="2026-10-16T01:23:45.818286" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:45.804326" elapsed="0.014006"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:45.822105" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:45.825890" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:45.829641" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:45.829861" 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-10-16T01:23:45.830042" elapsed="0.000019"/>
</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-10-16T01:23:45.830394" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:45.830254" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:45.830241" elapsed="0.000227"/>
</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-10-16T01:23:45.830617" 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-10-16T01:23:45.830807" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:45.830967" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:45.830214" elapsed="0.000802"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:45.830110" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:45.831202" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:45.831271" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:23:45.831375" 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-10-16T01:23:45.803470" elapsed="0.027929"/>
</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-10-16T01:23:45.832500" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:45.832310" elapsed="0.000249">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:45.832640" 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-10-16T01:23:45.831976" elapsed="0.000687"/>
</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-10-16T01:23:45.832957" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:45.832742" elapsed="0.000268"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:45.833472" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:45.833208" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:45.833033" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:45.832724" elapsed="0.000824"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:45.834062" 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-10-16T01:23:45.833724" elapsed="0.000362"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:45.834132" elapsed="0.000039"/>
</return>
<msg time="2026-10-16T01:23:45.834269" 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-manganese/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-10-16T01:23:45.831662" elapsed="0.002630"/>
</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-10-16T01:23:45.837126" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:45.835177" elapsed="0.002021">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:45.837286" 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-10-16T01:23:45.834850" elapsed="0.002459"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:45.837474" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:23:45.837375" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:45.837357" elapsed="0.000194"/>
</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-10-16T01:23:45.837723" 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-10-16T01:23:45.837939" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:45.838002" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:23:45.838129" 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-manganese/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-10-16T01:23:45.834539" elapsed="0.003628"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:45.839397" 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-10-16T01:23:45.839169" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:45.839864" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:45.839630" elapsed="0.000273"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:23:45.844089" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:45.844144" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:45.844269" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:45.840198" elapsed="0.004442">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:45.839963" elapsed="0.004783">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:45.844929" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:45.844778" elapsed="0.000210"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:45.839947" elapsed="0.005062">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:45.845360" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:45.845479" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:45.845446" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:45.845431" elapsed="0.000106"/>
</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-10-16T01:23:45.845673" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:45.845754" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:23:45.838440" elapsed="0.007417">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:45.845924" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:23:45.793853" elapsed="0.052198">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:45.846451" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:45.846234" elapsed="0.000300"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:45.846186" elapsed="0.000390"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:45.846658" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:23:45.791633" elapsed="0.055249">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:45.789295" elapsed="0.057687">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:45.789266" elapsed="0.057789">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:45.847316" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:45.847663" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:45.847990" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:45.848352" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:45.848806" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:45.849121" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:45.849480" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:45.849753" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:23:45.781976" elapsed="0.067879">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:45.849917" elapsed="0.000014"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:45.780131" elapsed="0.069873">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:45.850239" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:45.850084" elapsed="0.000206"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:45.850447" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:45.850311" elapsed="0.000185"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:45.850658" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:45.850517" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:45.850069" elapsed="0.000683"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:45.779796" elapsed="0.070996">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:45.779388" elapsed="0.071458">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:45.850893" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:45.770925" elapsed="0.080059">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:45.851170" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:45.851420" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:45.851249" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:45.851234" elapsed="0.000271"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:45.851673" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:45.851977" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:45.852036" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:45.769328" elapsed="0.082801">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:45.768852" elapsed="0.083354">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:45.768546" elapsed="0.083709">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:45.767777" elapsed="0.084560">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:45.852543" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:45.743774" elapsed="0.108877">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:46.872425" elapsed="0.000470"/>
</kw>
<msg time="2026-10-16T01:23:46.873016" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:46.871010" elapsed="0.002125"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:46.870061" elapsed="0.003260"/>
</kw>
<msg time="2026-10-16T01:23:46.873414" 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-10-16T01:23:46.863324" elapsed="0.010180"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:46.862424" elapsed="0.011229"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:46.874744" 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-10-16T01:23:46.874194" elapsed="0.000646"/>
</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-10-16T01:23:46.881490" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:46.880697" elapsed="0.000850"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:46.882548" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:46.881911" elapsed="0.000692"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:46.882733" elapsed="0.000066"/>
</return>
<msg time="2026-10-16T01:23:46.883030" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:46.879896" elapsed="0.003186"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:46.883431" elapsed="0.000323"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:46.884852" 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-10-16T01:23:46.884125" elapsed="0.000782"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:46.885796" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:46.885259" elapsed="0.000591"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:46.886838" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:46.886155" elapsed="0.000736"/>
</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-10-16T01:23:46.896816" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:46.895103" elapsed="0.001852"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:46.897111" elapsed="0.000282"/>
</return>
<msg time="2026-10-16T01:23:46.898088" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:46.891110" elapsed="0.007134"/>
</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-10-16T01:23:46.921147" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:46.920692" elapsed="0.000511"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:46.922225" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:46.921899" elapsed="0.000430">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:46.922449" 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-10-16T01:23:46.921424" elapsed="0.001056"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:46.923190" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:46.922741" elapsed="0.000485"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:46.923614" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:46.923840" 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-10-16T01:23:46.923456" elapsed="0.000418"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:46.924469" 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-10-16T01:23:46.924141" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:46.925472" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:46.925240" elapsed="0.000273"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:46.926107" 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-10-16T01:23:46.925685" elapsed="0.000446"/>
</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-10-16T01:23:46.926437" elapsed="0.000020"/>
</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-10-16T01:23:46.926620" 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-10-16T01:23:46.926820" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:46.926306" elapsed="0.000568"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:46.926190" elapsed="0.000713"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:46.926944" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:46.927074" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:46.924887" elapsed="0.002210"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:46.924613" elapsed="0.002513"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:46.927318" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:46.927151" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:46.924588" elapsed="0.002801"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:46.927956" 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-10-16T01:23:46.927542" elapsed="0.000439"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:46.928025" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:46.919968" elapsed="0.008156"/>
</kw>
<msg time="2026-10-16T01:23:46.928227" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:46.914217" elapsed="0.014059"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:46.932103" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:46.935920" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:46.939774" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:46.939951" elapsed="0.000020"/>
</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-10-16T01:23:46.940129" elapsed="0.000019"/>
</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-10-16T01:23:46.940485" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:46.940344" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:46.940331" elapsed="0.000229"/>
</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-10-16T01:23:46.940730" 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-10-16T01:23:46.940907" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:46.941066" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:46.940304" elapsed="0.000810"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:46.940213" elapsed="0.000925"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:46.941305" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:46.941374" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:46.941478" 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-10-16T01:23:46.913355" elapsed="0.028146"/>
</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-10-16T01:23:46.942609" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:46.942419" elapsed="0.000248">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:46.942796" 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-10-16T01:23:46.942080" 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-10-16T01:23:46.943110" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:46.942885" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:46.943640" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:46.943371" elapsed="0.000294"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:46.943204" elapsed="0.000509"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:46.942868" elapsed="0.000867"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:46.944253" 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-10-16T01:23:46.943894" elapsed="0.000383"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:46.944323" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:46.944447" 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-manganese/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-10-16T01:23:46.941781" elapsed="0.002689"/>
</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-10-16T01:23:46.945543" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:46.945355" elapsed="0.000247">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:46.945684" 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-10-16T01:23:46.945026" elapsed="0.000697"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:46.945886" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:23:46.945786" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:46.945770" elapsed="0.000194"/>
</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-10-16T01:23:46.946112" elapsed="0.000020"/>
</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-10-16T01:23:46.946300" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:46.946362" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:46.946486" 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-manganese/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-10-16T01:23:46.944730" elapsed="0.001779"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:46.947943" 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-10-16T01:23:46.947693" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:46.948410" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:46.948189" elapsed="0.000262"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:23:46.952618" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:46.952674" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:46.952798" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:46.948751" elapsed="0.004438">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:46.948511" elapsed="0.004761">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:46.953452" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:46.953302" elapsed="0.000243"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:46.948494" elapsed="0.005077">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:46.953935" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:46.954058" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:46.954023" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:46.954007" elapsed="0.000108"/>
</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-10-16T01:23:46.954270" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:46.954337" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:23:46.946980" elapsed="0.007464">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:46.954512" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:23:46.903621" elapsed="0.051019">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:46.955066" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:46.954847" elapsed="0.000301"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:46.954800" elapsed="0.000406"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:46.955292" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:23:46.901469" elapsed="0.053987">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:46.898737" elapsed="0.056820">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:46.898659" elapsed="0.056971">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:46.955901" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:46.956260" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:46.956570" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:46.956948" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:46.957393" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:46.957727" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:46.958072" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:46.958325" elapsed="0.000019"/>
</return>
<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="FAIL" start="2026-10-16T01:23:46.889616" elapsed="0.068813">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:46.958491" elapsed="0.000017"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:46.887753" elapsed="0.070827">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:46.958864" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:46.958695" elapsed="0.000220"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:46.959079" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:46.958938" elapsed="0.000190"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:46.959312" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:46.959150" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:46.958678" elapsed="0.000704"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:46.887390" elapsed="0.072030">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:46.886989" elapsed="0.072484">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:46.959522" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:46.878475" elapsed="0.081141">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:46.959931" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:46.960155" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:46.960013" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:46.959997" elapsed="0.000245"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:46.960368" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:46.960537" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:46.960595" elapsed="0.000015"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:46.876853" elapsed="0.083837">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:46.876363" elapsed="0.084408">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:46.876089" elapsed="0.084733">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:46.875312" elapsed="0.085592">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:46.961114" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:46.853411" elapsed="0.107820">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:47.980782" elapsed="0.000498"/>
</kw>
<msg time="2026-10-16T01:23:47.981401" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:47.979430" elapsed="0.002095"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:47.978461" elapsed="0.003220"/>
</kw>
<msg time="2026-10-16T01:23:47.981927" 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-10-16T01:23:47.971681" elapsed="0.010346"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:47.970815" elapsed="0.011387"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:47.983293" 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-10-16T01:23:47.982734" elapsed="0.000653"/>
</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-10-16T01:23:47.990140" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:47.989310" elapsed="0.001039"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:47.991359" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:47.990691" elapsed="0.000722"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:47.991511" elapsed="0.000063"/>
</return>
<msg time="2026-10-16T01:23:47.991835" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:47.988450" elapsed="0.003437"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:47.992240" elapsed="0.000287"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:47.993618" 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-10-16T01:23:47.992928" elapsed="0.000747"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:47.994587" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:47.994059" elapsed="0.000581"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:47.995561" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:47.995027" elapsed="0.000587"/>
</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-10-16T01:23:48.004481" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:48.003080" elapsed="0.001509"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:48.004796" elapsed="0.000140"/>
</return>
<msg time="2026-10-16T01:23:48.005393" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:47.999696" elapsed="0.005822"/>
</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-10-16T01:23:48.028961" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:48.028515" elapsed="0.000482"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:48.029997" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:48.029666" elapsed="0.000436">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:48.030240" 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-10-16T01:23:48.029226" elapsed="0.001047"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:48.030958" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:48.030508" elapsed="0.000485"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:48.031395" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:48.031597" 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-10-16T01:23:48.031237" elapsed="0.000392"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:48.032291" 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-10-16T01:23:48.031912" elapsed="0.000439"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:48.033863" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:48.033297" elapsed="0.000639"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:48.034440" 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-10-16T01:23:48.034163" 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-10-16T01:23:48.034778" 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-10-16T01:23:48.034966" elapsed="0.000022"/>
</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-10-16T01:23:48.035146" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:48.034618" elapsed="0.000595"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:48.034508" elapsed="0.000736"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:48.035285" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:48.035414" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:48.032813" elapsed="0.002624"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:48.032437" elapsed="0.003028"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:48.035634" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:48.035491" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:48.032413" elapsed="0.003307"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:48.036289" 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-10-16T01:23:48.035878" elapsed="0.000436"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:48.036358" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:48.027805" elapsed="0.008652"/>
</kw>
<msg time="2026-10-16T01:23:48.036503" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:48.022031" elapsed="0.014518"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:48.040358" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:48.044146" elapsed="0.000036"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:48.047914" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:48.048090" elapsed="0.000020"/>
</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-10-16T01:23:48.048283" 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-10-16T01:23:48.048653" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:48.048478" elapsed="0.000243"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:48.048464" elapsed="0.000281"/>
</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-10-16T01:23:48.048903" 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-10-16T01:23:48.049085" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:48.049263" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:48.048438" elapsed="0.000875"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:48.048351" elapsed="0.000986"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:48.049488" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:48.049556" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:48.049659" 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-10-16T01:23:48.021192" elapsed="0.028491"/>
</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-10-16T01:23:48.050799" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:48.050590" elapsed="0.000268">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:48.050940" 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-10-16T01:23:48.050271" elapsed="0.000691"/>
</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-10-16T01:23:48.051258" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:48.051025" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:48.051779" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:48.051491" elapsed="0.000311"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:48.051333" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:48.051008" elapsed="0.000846"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:48.052372" 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-10-16T01:23:48.052012" elapsed="0.000384"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:48.052442" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:23:48.052564" 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-manganese/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-10-16T01:23:48.049959" elapsed="0.002627"/>
</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-10-16T01:23:48.053669" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:48.053484" elapsed="0.000265">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:48.053832" 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-10-16T01:23:48.053153" elapsed="0.000702"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:48.054016" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:23:48.053919" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:48.053903" elapsed="0.000188"/>
</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-10-16T01:23:48.054261" elapsed="0.000020"/>
</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-10-16T01:23:48.054435" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:48.054495" elapsed="0.000013"/>
</return>
<msg time="2026-10-16T01:23:48.054617" 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-manganese/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-10-16T01:23:48.052849" elapsed="0.001823"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:48.056083" 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-10-16T01:23:48.055858" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:48.056548" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:48.056332" elapsed="0.000256"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:23:48.060821" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:48.060876" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:48.060975" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:48.056893" elapsed="0.004470">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:48.056647" elapsed="0.004795">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:48.061620" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:48.061472" elapsed="0.000206"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:48.056631" elapsed="0.005086">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:48.062056" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:48.062189" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:48.062142" elapsed="0.000086"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:48.062126" 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-10-16T01:23:48.062382" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:48.062445" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:23:48.055130" elapsed="0.007416">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:48.062613" elapsed="0.000022"/>
</return>
<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="FAIL" start="2026-10-16T01:23:48.011479" elapsed="0.051282">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:48.063147" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:48.062930" elapsed="0.000310"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:48.062883" elapsed="0.000399"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:48.063364" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:23:48.009279" elapsed="0.054247">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:48.006033" elapsed="0.057622">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:48.005988" elapsed="0.057781">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:48.064018" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:48.064380" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:48.064691" elapsed="0.000037"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:48.065058" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:48.065504" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:48.065843" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:48.066211" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:48.066448" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:23:47.998371" elapsed="0.068177">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:48.066609" elapsed="0.000014"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:47.996468" elapsed="0.070228">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:48.066955" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:48.066816" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:48.067161" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:48.067026" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:48.067387" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:48.067246" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:48.066800" elapsed="0.000655"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:47.996116" elapsed="0.071377">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:47.995740" elapsed="0.071805">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:48.067593" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:47.987071" elapsed="0.080614">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:48.067896" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:48.068112" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:48.067974" elapsed="0.000184"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:48.067959" elapsed="0.000234"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:48.068319" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:48.068486" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:48.068544" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:47.985461" elapsed="0.083208">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:47.984977" elapsed="0.083876">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:47.984658" elapsed="0.084247">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:47.983870" elapsed="0.085117">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:48.069217" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:47.962020" elapsed="0.107303">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:49.088659" elapsed="0.000452"/>
</kw>
<msg time="2026-10-16T01:23:49.089259" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:49.087410" elapsed="0.001973"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:49.086481" elapsed="0.003061"/>
</kw>
<msg time="2026-10-16T01:23:49.089631" 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-10-16T01:23:49.080016" elapsed="0.009733"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:49.079114" elapsed="0.010791"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:49.090976" 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-10-16T01:23:49.090426" elapsed="0.000642"/>
</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-10-16T01:23:49.097642" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:49.096882" elapsed="0.000846"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:49.098728" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:49.098068" elapsed="0.000718"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:49.098885" elapsed="0.000064"/>
</return>
<msg time="2026-10-16T01:23:49.099174" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:49.096051" elapsed="0.003199"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:49.099580" elapsed="0.000318"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:49.100980" 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-10-16T01:23:49.100281" elapsed="0.000754"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:49.101919" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:49.101387" elapsed="0.000584"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:49.102827" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:49.102296" elapsed="0.000583"/>
</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-10-16T01:23:49.111562" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:49.110166" elapsed="0.001688"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:49.111989" elapsed="0.000137"/>
</return>
<msg time="2026-10-16T01:23:49.112579" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:49.106874" elapsed="0.005874"/>
</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-10-16T01:23:49.135850" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:49.135407" elapsed="0.000480"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:49.136891" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:49.136564" elapsed="0.000433">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:49.137135" 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-10-16T01:23:49.136103" elapsed="0.001064"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:49.137926" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:49.137418" elapsed="0.000545"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:49.138370" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:49.138576" 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-10-16T01:23:49.138211" elapsed="0.000397"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:49.139216" 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-10-16T01:23:49.138896" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:49.140722" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:49.140382" elapsed="0.000400"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:49.141227" 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-10-16T01:23:49.140958" 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-10-16T01:23:49.141535" elapsed="0.000020"/>
</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-10-16T01:23:49.141735" 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-10-16T01:23:49.141918" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:49.141408" elapsed="0.000562"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:49.141296" elapsed="0.000703"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:49.142038" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:49.142166" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:49.139896" elapsed="0.002305"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:49.139518" elapsed="0.002713"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:49.142399" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:49.142256" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:49.139336" elapsed="0.003132"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:49.143026" 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-10-16T01:23:49.142620" elapsed="0.000430"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:49.143093" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:49.134681" elapsed="0.008522"/>
</kw>
<msg time="2026-10-16T01:23:49.143286" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:49.129061" elapsed="0.014272"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:49.147066" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:49.150905" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:49.154652" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:49.154841" elapsed="0.000020"/>
</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-10-16T01:23:49.155017" elapsed="0.000019"/>
</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-10-16T01:23:49.155363" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:49.155223" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:49.155209" elapsed="0.000227"/>
</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-10-16T01:23:49.155587" elapsed="0.000019"/>
</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-10-16T01:23:49.155777" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:49.155939" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:49.155170" elapsed="0.000818"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:49.155083" elapsed="0.000928"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:49.156158" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:49.156241" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:49.156343" 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-10-16T01:23:49.128212" elapsed="0.028154"/>
</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-10-16T01:23:49.157466" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:49.157274" elapsed="0.000251">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:49.157607" 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-10-16T01:23:49.156938" elapsed="0.000691"/>
</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-10-16T01:23:49.157922" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:49.157692" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:49.158471" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:49.158207" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:49.158028" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:49.157676" elapsed="0.000871"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:49.159053" 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-10-16T01:23:49.158719" elapsed="0.000358"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:49.159122" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:23:49.159260" 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-manganese/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-10-16T01:23:49.156626" elapsed="0.002657"/>
</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-10-16T01:23:49.162004" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:49.160153" elapsed="0.001912">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:49.162151" 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-10-16T01:23:49.159839" elapsed="0.002335"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:49.162354" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:23:49.162254" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:49.162236" elapsed="0.000194"/>
</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-10-16T01:23:49.162582" 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-10-16T01:23:49.162770" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:49.162837" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:49.162962" 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-manganese/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-10-16T01:23:49.159525" elapsed="0.003460"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:49.164226" 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-10-16T01:23:49.163984" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:49.164670" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:49.164453" elapsed="0.000274"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:23:49.169129" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:49.169224" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:49.169372" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:49.165011" elapsed="0.004847">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:49.164788" elapsed="0.005150">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:49.170118" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:49.169968" elapsed="0.000208"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:49.164771" elapsed="0.005448">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:49.170558" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:49.170745" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:49.170687" elapsed="0.000097"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:49.170670" elapsed="0.000133"/>
</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-10-16T01:23:49.170939" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:49.171001" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:23:49.163271" elapsed="0.007833">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:49.171170" elapsed="0.000027"/>
</return>
<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="FAIL" start="2026-10-16T01:23:49.118505" elapsed="0.052818">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:49.171733" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:49.171491" elapsed="0.000330"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:49.171444" elapsed="0.000421"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:49.171949" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:23:49.116324" elapsed="0.055788">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:49.113240" elapsed="0.058989">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:49.113177" elapsed="0.059126">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:49.172545" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:49.172921" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:49.173245" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:49.173591" elapsed="0.000021"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:49.174047" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:49.174376" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:49.174755" elapsed="0.000022"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:49.174999" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:23:49.105531" elapsed="0.069567">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:49.175158" elapsed="0.000014"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:49.103693" elapsed="0.071569">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:49.175479" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:49.175341" elapsed="0.000188"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:49.175745" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:49.175550" elapsed="0.000247"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:49.175960" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:49.175819" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:49.175325" elapsed="0.000702"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:49.103362" elapsed="0.072703">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:49.102974" elapsed="0.073144">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:49.176167" elapsed="0.000029"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:49.094660" elapsed="0.081614">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:49.176445" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:49.176660" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:49.176522" elapsed="0.000310"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:49.176507" elapsed="0.000350"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:49.176984" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:49.177150" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:49.177222" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:49.093072" elapsed="0.084242">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:49.092585" elapsed="0.084790">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:49.092336" elapsed="0.085087">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:49.091540" elapsed="0.085962">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:49.177729" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:49.070243" elapsed="0.107591">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:50.271938" elapsed="0.000219"/>
</kw>
<msg time="2026-10-16T01:23:50.272322" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:50.271295" elapsed="0.001098"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:50.270823" elapsed="0.001646"/>
</kw>
<msg time="2026-10-16T01:23:50.272512" 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-10-16T01:23:50.267797" elapsed="0.004755"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:50.267154" elapsed="0.005461"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:50.273179" 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-10-16T01:23:50.272943" 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-10-16T01:23:50.276167" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:50.275830" elapsed="0.000377"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:50.276623" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:50.276356" elapsed="0.000292"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:50.276694" elapsed="0.000048"/>
</return>
<msg time="2026-10-16T01:23:50.276848" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:50.275468" elapsed="0.001403"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:50.277017" elapsed="0.000129"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:50.277627" 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-10-16T01:23:50.277325" elapsed="0.000326"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:50.278045" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:50.277820" elapsed="0.000249"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:50.278586" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:50.278223" elapsed="0.000388"/>
</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-10-16T01:23:50.282329" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:50.281728" elapsed="0.000649"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:50.282433" elapsed="0.000060"/>
</return>
<msg time="2026-10-16T01:23:50.282686" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:50.280275" elapsed="0.002489"/>
</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-10-16T01:23:50.298936" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:50.298608" elapsed="0.000354"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:50.299685" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:50.299454" elapsed="0.000329">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:50.299869" 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-10-16T01:23:50.299119" elapsed="0.000773"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:50.300389" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:50.300059" elapsed="0.000355"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:50.300692" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:50.300868" 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-10-16T01:23:50.300578" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:50.301319" 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-10-16T01:23:50.301083" elapsed="0.000278"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:50.302267" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:50.302021" elapsed="0.000287"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:50.302797" 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-10-16T01:23:50.302480" elapsed="0.000344"/>
</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-10-16T01:23:50.303107" elapsed="0.000020"/>
</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-10-16T01:23:50.303305" elapsed="0.000022"/>
</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-10-16T01:23:50.303485" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:50.302977" elapsed="0.000560"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:50.302868" elapsed="0.000699"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:50.303609" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:50.303754" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:50.301670" elapsed="0.002108"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:50.301421" 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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:50.303979" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:50.303834" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:50.301404" elapsed="0.002645"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:50.304619" 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-10-16T01:23:50.304220" elapsed="0.000424"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:50.304688" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:50.298089" elapsed="0.006717"/>
</kw>
<msg time="2026-10-16T01:23:50.304854" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:50.293890" elapsed="0.011010"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:50.308808" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:50.312833" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:50.316644" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:50.316835" elapsed="0.000020"/>
</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-10-16T01:23:50.317014" elapsed="0.000019"/>
</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-10-16T01:23:50.317368" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:50.317226" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:50.317211" 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-10-16T01:23:50.317593" elapsed="0.000018"/>
</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-10-16T01:23:50.317783" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:50.317982" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:50.317170" elapsed="0.000862"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:50.317080" elapsed="0.000975"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:50.318220" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:50.318291" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:50.318395" 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-10-16T01:23:50.293286" elapsed="0.025134"/>
</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-10-16T01:23:50.319530" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:50.319339" elapsed="0.000251">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:50.319672" 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-10-16T01:23:50.319000" elapsed="0.000709"/>
</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-10-16T01:23:50.319991" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:50.319775" elapsed="0.000269"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:50.320503" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:50.320239" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:50.320067" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:50.319758" elapsed="0.000820"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:50.321089" 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-10-16T01:23:50.320750" elapsed="0.000363"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:50.321158" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:50.321298" 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-manganese/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-10-16T01:23:50.318681" elapsed="0.002639"/>
</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-10-16T01:23:50.322398" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:50.322206" elapsed="0.000250">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:50.322538" 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-10-16T01:23:50.321875" elapsed="0.000685"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:50.322737" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:23:50.322624" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:50.322607" elapsed="0.000207"/>
</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-10-16T01:23:50.322962" elapsed="0.000020"/>
</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-10-16T01:23:50.323131" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:50.323206" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:23:50.323331" 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-manganese/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-10-16T01:23:50.321564" elapsed="0.001790"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:50.324572" 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-10-16T01:23:50.324345" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:50.325074" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:50.324851" elapsed="0.000264"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:23:50.330380" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:50.330438" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:50.330555" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:50.325416" elapsed="0.005559">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:50.325175" elapsed="0.005884">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:50.331255" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:50.331090" elapsed="0.000226"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:50.325158" elapsed="0.006180">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:50.331683" elapsed="0.000042"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:50.331824" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:50.331791" elapsed="0.000076"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:50.331774" 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-10-16T01:23:50.332024" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:50.332087" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:23:50.323622" elapsed="0.008585">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:50.332277" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:23:50.286328" elapsed="0.046076">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:50.332812" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:50.332571" elapsed="0.000329"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:50.332524" elapsed="0.000418"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:50.333024" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:23:50.284654" elapsed="0.048553">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:50.282977" elapsed="0.050331">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:50.282957" elapsed="0.050426">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:50.333628" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:50.334025" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:50.334356" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:50.334733" elapsed="0.000024"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:50.335164" elapsed="0.000035"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:50.335491" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:50.335866" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:50.336102" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:23:50.279678" elapsed="0.056539">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:50.336280" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:50.279002" elapsed="0.057366">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:50.336588" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:50.336447" elapsed="0.000191"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:50.336822" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:50.336660" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:50.337036" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:50.336895" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:50.336432" elapsed="0.000672"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:50.278851" elapsed="0.058291">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:50.278654" elapsed="0.058554">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:50.337259" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:50.274867" elapsed="0.062482">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:50.337522" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:50.337865" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:50.337601" elapsed="0.000315"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:50.337585" elapsed="0.000353"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:50.338064" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:50.338248" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:50.338308" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:50.274148" elapsed="0.064252">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:50.273933" elapsed="0.064529">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:50.273810" elapsed="0.064737">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:50.273443" elapsed="0.065188">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:50.338857" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:50.178758" elapsed="0.160204">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:51.357598" elapsed="0.000449"/>
</kw>
<msg time="2026-10-16T01:23:51.358164" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:51.356319" elapsed="0.001989"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:51.355342" elapsed="0.003125"/>
</kw>
<msg time="2026-10-16T01:23:51.358559" 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-10-16T01:23:51.348781" elapsed="0.009867"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:51.347886" elapsed="0.010946"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:51.359932" 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-10-16T01:23:51.359347" elapsed="0.000682"/>
</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-10-16T01:23:51.367507" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:51.366735" elapsed="0.000831"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:51.368980" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:51.368309" elapsed="0.000726"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:51.369133" elapsed="0.000086"/>
</return>
<msg time="2026-10-16T01:23:51.369452" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:51.365898" elapsed="0.003605"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:51.369907" elapsed="0.000316"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:51.371333" 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-10-16T01:23:51.370594" elapsed="0.000796"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:51.372431" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:51.371796" elapsed="0.000693"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:51.373440" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:51.372845" elapsed="0.000650"/>
</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-10-16T01:23:51.382298" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:51.380770" elapsed="0.001638"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:51.382536" elapsed="0.000134"/>
</return>
<msg time="2026-10-16T01:23:51.383214" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:51.377462" elapsed="0.005897"/>
</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-10-16T01:23:51.411652" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:51.411213" elapsed="0.000508"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:51.412769" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:51.412434" elapsed="0.000450">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:51.413006" 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-10-16T01:23:51.411955" elapsed="0.001085"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:51.413800" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:51.413297" elapsed="0.000541"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:51.414245" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:51.414455" 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-10-16T01:23:51.414070" elapsed="0.000419"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:51.415100" 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-10-16T01:23:51.414782" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:51.416479" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:51.416136" elapsed="0.000399"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:51.417155" 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-10-16T01:23:51.416799" elapsed="0.000405"/>
</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-10-16T01:23:51.417599" elapsed="0.000029"/>
</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-10-16T01:23:51.417878" elapsed="0.000032"/>
</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-10-16T01:23:51.418132" elapsed="0.000027"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:51.417420" elapsed="0.000798"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:51.417265" elapsed="0.000994"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:51.418317" elapsed="0.000037"/>
</return>
<msg time="2026-10-16T01:23:51.418497" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:51.415629" elapsed="0.002900"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:51.415270" elapsed="0.003299"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:51.418827" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:51.418604" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:51.415244" elapsed="0.003684"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:51.419726" 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-10-16T01:23:51.419152" elapsed="0.000611"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:51.419824" elapsed="0.000038"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:51.410449" elapsed="0.009515"/>
</kw>
<msg time="2026-10-16T01:23:51.420029" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:51.404563" elapsed="0.015530"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:51.424607" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:51.428407" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:51.432156" elapsed="0.000039"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:51.432349" elapsed="0.000020"/>
</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-10-16T01:23:51.432528" elapsed="0.000019"/>
</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-10-16T01:23:51.432919" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:51.432769" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:51.432755" 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-10-16T01:23:51.433148" 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-10-16T01:23:51.433340" elapsed="0.000018"/>
</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-10-16T01:23:51.433499" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:51.432725" elapsed="0.000822"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:51.432596" elapsed="0.000974"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:51.433735" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:51.433804" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:23:51.433909" 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-10-16T01:23:51.403681" elapsed="0.030252"/>
</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-10-16T01:23:51.435050" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:51.434856" elapsed="0.000254">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:51.435205" 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-10-16T01:23:51.434511" elapsed="0.000718"/>
</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-10-16T01:23:51.435507" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:51.435292" elapsed="0.000267"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:51.436055" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:51.435788" elapsed="0.000291"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:51.435582" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:51.435275" elapsed="0.000856"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:51.436641" 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-10-16T01:23:51.436307" elapsed="0.000401"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:51.436757" elapsed="0.000028"/>
</return>
<msg time="2026-10-16T01:23:51.436883" 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-manganese/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-10-16T01:23:51.434211" elapsed="0.002695"/>
</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-10-16T01:23:51.437988" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:51.437795" elapsed="0.000252">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:51.438131" 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-10-16T01:23:51.437461" elapsed="0.000693"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:51.438331" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:23:51.438232" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:51.438215" elapsed="0.000193"/>
</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-10-16T01:23:51.438560" elapsed="0.000020"/>
</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-10-16T01:23:51.438747" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:51.438809" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:51.438932" 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-manganese/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-10-16T01:23:51.437150" elapsed="0.001806"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:51.440204" 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-10-16T01:23:51.439963" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:51.440654" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:51.440435" elapsed="0.000273"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:23:51.445270" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:51.445328" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:51.445428" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:51.441044" elapsed="0.004786">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:51.440773" elapsed="0.005137">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:51.446091" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:51.445940" elapsed="0.000209"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:51.440754" elapsed="0.005430">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:51.446529" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:51.446650" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:51.446616" elapsed="0.000073"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:51.446600" elapsed="0.000126"/>
</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-10-16T01:23:51.446864" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:51.446965" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:23:51.439247" elapsed="0.007824">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:51.447138" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:23:51.392403" elapsed="0.054875">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:51.447721" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:51.447462" elapsed="0.000350"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:51.447401" elapsed="0.000456"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:51.447940" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:23:51.388507" elapsed="0.059601">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:51.383946" elapsed="0.064279">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:51.383899" elapsed="0.064400">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:51.448547" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:51.448916" elapsed="0.000023"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:51.449244" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:51.449593" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:51.450039" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:51.450367" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:51.450744" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:51.450984" elapsed="0.000020"/>
</return>
<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="FAIL" start="2026-10-16T01:23:51.376116" elapsed="0.074972">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:51.451151" elapsed="0.000031"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:51.374564" elapsed="0.076694">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:51.451482" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:51.451341" elapsed="0.000191"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:51.451697" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:51.451555" elapsed="0.000220"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:51.451947" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:51.451798" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:51.451323" elapsed="0.000724"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:51.374222" elapsed="0.077867">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:51.373594" elapsed="0.078550">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:51.452206" elapsed="0.000016"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:51.364487" elapsed="0.087814">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:51.452478" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:51.452696" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:51.452556" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:51.452541" elapsed="0.000251"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:51.452941" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:51.453114" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:51.453185" elapsed="0.000015"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:51.362768" elapsed="0.090513">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:51.362216" elapsed="0.091128">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:51.361380" elapsed="0.092013">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:51.360517" elapsed="0.092960">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:51.453686" elapsed="0.000149"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:51.339694" elapsed="0.114227">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:52.473190" elapsed="0.000430"/>
</kw>
<msg time="2026-10-16T01:23:52.473774" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:52.471892" elapsed="0.002010"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:52.470897" elapsed="0.003167"/>
</kw>
<msg time="2026-10-16T01:23:52.474172" 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-10-16T01:23:52.463782" elapsed="0.010485"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:52.462888" elapsed="0.011529"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:52.475541" 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-10-16T01:23:52.474939" elapsed="0.000696"/>
</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-10-16T01:23:52.483920" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:52.483022" elapsed="0.000960"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:52.485063" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:52.484374" elapsed="0.000746"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:52.485271" elapsed="0.000072"/>
</return>
<msg time="2026-10-16T01:23:52.485589" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:52.482073" elapsed="0.003569"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:52.486046" elapsed="0.000342"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:52.487605" 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-10-16T01:23:52.486822" elapsed="0.000842"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:52.488889" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:52.488152" elapsed="0.000807"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:52.490024" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:52.489410" elapsed="0.000668"/>
</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-10-16T01:23:52.499518" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:52.498005" elapsed="0.001624"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:52.499825" elapsed="0.000147"/>
</return>
<msg time="2026-10-16T01:23:52.500476" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:52.494498" elapsed="0.006116"/>
</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-10-16T01:23:52.526336" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:52.525856" elapsed="0.000519"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:52.527474" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:52.527100" elapsed="0.000490">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:52.527744" 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-10-16T01:23:52.526616" elapsed="0.001164"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:52.528526" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:52.528040" elapsed="0.000533"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:52.529091" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:52.529357" 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-10-16T01:23:52.528872" elapsed="0.000522"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:52.529987" 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-10-16T01:23:52.529671" elapsed="0.000358"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:52.531006" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:52.530765" elapsed="0.000284"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:52.531662" 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-10-16T01:23:52.531259" elapsed="0.000430"/>
</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-10-16T01:23:52.532025" 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-10-16T01:23:52.532231" 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-10-16T01:23:52.532472" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:52.531892" elapsed="0.000637"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:52.531769" elapsed="0.000790"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:52.532601" elapsed="0.000028"/>
</return>
<msg time="2026-10-16T01:23:52.532765" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:52.530384" elapsed="0.002407"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:52.530093" elapsed="0.002729"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:52.533003" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:52.532850" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:52.530075" elapsed="0.003003"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:52.533694" 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-10-16T01:23:52.533268" elapsed="0.000469"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:52.533783" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:52.525076" elapsed="0.008810"/>
</kw>
<msg time="2026-10-16T01:23:52.533935" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:52.519054" elapsed="0.014929"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:52.537976" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:52.541919" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:52.545847" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:52.546031" 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-10-16T01:23:52.546241" 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-10-16T01:23:52.546587" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:52.546444" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:52.546431" 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-10-16T01:23:52.546851" 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-10-16T01:23:52.547035" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:52.547214" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:52.546404" elapsed="0.000862"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:52.546313" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:52.547511" elapsed="0.000024"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:52.547588" elapsed="0.000016"/>
</return>
<msg time="2026-10-16T01:23:52.547720" 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-10-16T01:23:52.518143" elapsed="0.029607"/>
</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-10-16T01:23:52.548926" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:52.548713" elapsed="0.000276">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:52.549075" 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-10-16T01:23:52.548365" elapsed="0.000736"/>
</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-10-16T01:23:52.549406" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:52.549181" elapsed="0.000280"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:52.549956" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:52.549663" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:52.549492" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:52.549150" elapsed="0.000888"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:52.550578" 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-10-16T01:23:52.550228" elapsed="0.000375"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:52.550656" elapsed="0.000032"/>
</return>
<msg time="2026-10-16T01:23:52.550811" 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-manganese/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-10-16T01:23:52.548028" elapsed="0.002807"/>
</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-10-16T01:23:52.551981" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:52.551771" elapsed="0.000272">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:52.552131" 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-10-16T01:23:52.551418" elapsed="0.000750"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:52.552355" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:23:52.552238" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:52.552220" elapsed="0.000219"/>
</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-10-16T01:23:52.552593" 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-10-16T01:23:52.552785" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:52.552848" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:23:52.552978" 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-manganese/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-10-16T01:23:52.551088" elapsed="0.001914"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:52.555996" 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-10-16T01:23:52.555756" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:52.556506" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:52.556256" 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-10-16T01:23:52.561034" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:52.561135" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:52.561278" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:52.556871" elapsed="0.004795">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:52.556612" elapsed="0.005153">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:52.561963" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:52.561800" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:52.556594" elapsed="0.005452">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:52.562474" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:52.562645" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:52.562600" elapsed="0.000095"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:52.562578" 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-10-16T01:23:52.562925" elapsed="0.000026"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:52.563008" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:23:52.554987" elapsed="0.008155">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:52.563247" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:23:52.507728" elapsed="0.055678">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:52.563871" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:52.563597" elapsed="0.000366"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:52.563548" elapsed="0.000458"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:52.564092" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:23:52.505172" elapsed="0.059110">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:52.501147" elapsed="0.063240">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:52.501100" elapsed="0.063362">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:52.564736" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:52.565097" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:52.565428" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:52.565812" elapsed="0.000024"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:52.566307" elapsed="0.000024"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:52.566630" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:52.567012" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:52.567276" elapsed="0.000019"/>
</return>
<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="FAIL" start="2026-10-16T01:23:52.492646" elapsed="0.074737">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:52.567447" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:52.491018" elapsed="0.076521">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:52.567830" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:52.567626" elapsed="0.000265"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:52.568057" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:52.567915" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:52.568292" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:52.568130" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:52.567606" elapsed="0.000759"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:52.490614" elapsed="0.077792">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:52.490204" elapsed="0.078258">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:52.568514" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:52.480339" elapsed="0.088268">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:52.568898" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:52.569223" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:52.569004" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:52.568981" elapsed="0.000351"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:52.569475" elapsed="0.000021"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:52.569649" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:52.569786" elapsed="0.000017"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:52.478477" elapsed="0.091415">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:52.477819" elapsed="0.092138">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:52.477494" elapsed="0.092513">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:52.476658" elapsed="0.093432">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:52.570366" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:52.454797" elapsed="0.115679">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:53.590558" elapsed="0.000450"/>
</kw>
<msg time="2026-10-16T01:23:53.591129" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:53.589258" elapsed="0.002015"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:53.588285" elapsed="0.003151"/>
</kw>
<msg time="2026-10-16T01:23:53.591527" 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-10-16T01:23:53.581224" elapsed="0.010392"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:53.580323" elapsed="0.011476"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:53.592860" 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-10-16T01:23:53.592307" elapsed="0.000647"/>
</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-10-16T01:23:53.599750" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:53.598944" elapsed="0.000867"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:53.600807" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:53.600166" elapsed="0.000697"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:53.600960" elapsed="0.000063"/>
</return>
<msg time="2026-10-16T01:23:53.601274" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:53.598103" elapsed="0.003224"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:53.601657" elapsed="0.000320"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:53.603059" 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-10-16T01:23:53.602367" elapsed="0.000747"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:53.604005" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:53.603464" elapsed="0.000595"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:53.604933" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:53.604398" elapsed="0.000589"/>
</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-10-16T01:23:53.613925" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:53.612510" elapsed="0.001525"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:53.614181" elapsed="0.000137"/>
</return>
<msg time="2026-10-16T01:23:53.614996" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:53.609255" elapsed="0.005872"/>
</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-10-16T01:23:53.638863" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:53.638414" elapsed="0.000486"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:53.640032" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:53.639714" elapsed="0.000441">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:53.640278" 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-10-16T01:23:53.639220" elapsed="0.001090"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:53.641006" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:53.640545" elapsed="0.000497"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:53.641451" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:53.641658" 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-10-16T01:23:53.641288" elapsed="0.000403"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:53.642314" 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-10-16T01:23:53.641987" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:53.643874" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:53.643321" elapsed="0.000611"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:53.644385" 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-10-16T01:23:53.644113" 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-10-16T01:23:53.644697" elapsed="0.000036"/>
</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-10-16T01:23:53.644901" elapsed="0.000022"/>
</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-10-16T01:23:53.645081" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:53.644565" elapsed="0.000567"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:53.644454" elapsed="0.000721"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:53.645216" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:53.645346" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:53.642832" elapsed="0.002537"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:53.642457" elapsed="0.002941"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:53.645566" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:53.645423" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:53.642433" elapsed="0.003202"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:53.646216" 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-10-16T01:23:53.645805" elapsed="0.000437"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:53.646285" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:53.637688" elapsed="0.008697"/>
</kw>
<msg time="2026-10-16T01:23:53.646431" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:53.631927" elapsed="0.014550"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:53.650370" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:53.654172" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:53.658036" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:53.658224" 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-10-16T01:23:53.658402" elapsed="0.000019"/>
</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-10-16T01:23:53.658760" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:53.658600" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:53.658587" 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-10-16T01:23:53.658988" elapsed="0.000019"/>
</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-10-16T01:23:53.659173" 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-10-16T01:23:53.659335" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:53.658560" elapsed="0.000824"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:53.658470" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:53.659558" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:53.659624" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:53.659742" 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-10-16T01:23:53.631047" elapsed="0.028719"/>
</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-10-16T01:23:53.660872" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:53.660660" elapsed="0.000273">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:53.661016" 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-10-16T01:23:53.660340" elapsed="0.000699"/>
</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-10-16T01:23:53.661335" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:53.661102" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:53.661853" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:53.661572" elapsed="0.000306"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:53.661410" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:53.661085" elapsed="0.000845"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:53.662440" 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-10-16T01:23:53.662088" elapsed="0.000377"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:53.662510" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:53.662634" 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-manganese/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-10-16T01:23:53.660030" elapsed="0.002627"/>
</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-10-16T01:23:53.663790" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:53.663586" elapsed="0.000263">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:53.663933" 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-10-16T01:23:53.663268" elapsed="0.000688"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:53.664119" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-10-16T01:23:53.664020" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:53.664004" elapsed="0.000209"/>
</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-10-16T01:23:53.664365" 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-10-16T01:23:53.664538" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:53.664598" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:23:53.664749" 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-manganese/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-10-16T01:23:53.662957" elapsed="0.001817"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:53.666226" 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-10-16T01:23:53.665987" elapsed="0.000281"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:53.666672" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:53.666454" elapsed="0.000274"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:23:53.671083" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:53.671153" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:53.671253" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:53.667013" elapsed="0.004615">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:53.666789" elapsed="0.004940">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:53.671917" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:53.671762" elapsed="0.000213"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:53.666772" elapsed="0.005225">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:53.672350" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:53.672471" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:53.672437" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:53.672421" elapsed="0.000107"/>
</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-10-16T01:23:53.672664" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:53.672745" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:23:53.665251" elapsed="0.007597">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:53.672948" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:23:53.621165" elapsed="0.051914">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:53.673481" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:53.673262" elapsed="0.000301"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:53.673214" elapsed="0.000391"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:53.673688" 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="FAIL" start="2026-10-16T01:23:53.618953" elapsed="0.054928">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:53.615607" elapsed="0.058374">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:53.615562" elapsed="0.058492">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:53.674315" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:53.674658" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:53.674985" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:53.675347" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:53.675803" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:53.676126" elapsed="0.000034"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:53.676488" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:53.676763" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:23:53.607906" elapsed="0.068960">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:53.676928" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:53.605842" elapsed="0.071175">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:53.677250" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:53.677096" elapsed="0.000205"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:53.677458" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:53.677323" elapsed="0.000184"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:53.677671" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:53.677529" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:53.677080" elapsed="0.000683"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:53.605475" elapsed="0.072326">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:53.605081" elapsed="0.072773">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:53.677903" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:53.596697" elapsed="0.081330">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:53.678217" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:53.678438" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:53.678297" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:53.678281" elapsed="0.000226"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:53.678632" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:53.678888" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:53.678949" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:53.595058" elapsed="0.083984">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:53.594475" elapsed="0.084629">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:53.594224" elapsed="0.084944">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:53.593426" elapsed="0.085826">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:53.679461" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:53.571328" elapsed="0.108238">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:54.698975" elapsed="0.000446"/>
</kw>
<msg time="2026-10-16T01:23:54.699531" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:54.697691" elapsed="0.001949"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:54.696614" elapsed="0.003214"/>
</kw>
<msg time="2026-10-16T01:23:54.699919" 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-10-16T01:23:54.689625" elapsed="0.010387"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:54.688778" elapsed="0.011408"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:54.701238" 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-10-16T01:23:54.700670" elapsed="0.000661"/>
</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-10-16T01:23:54.708055" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:54.707281" elapsed="0.000832"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:54.709109" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:54.708472" elapsed="0.000715"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:54.709369" elapsed="0.000066"/>
</return>
<msg time="2026-10-16T01:23:54.709673" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:54.706320" elapsed="0.003437"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:54.710091" elapsed="0.000324"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:54.711542" 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-10-16T01:23:54.710840" elapsed="0.000758"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:54.712500" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:54.711963" elapsed="0.000591"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:54.713429" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:54.712895" elapsed="0.000588"/>
</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-10-16T01:23:54.722278" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:54.720856" elapsed="0.001532"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:54.722515" elapsed="0.000131"/>
</return>
<msg time="2026-10-16T01:23:54.723149" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:54.717509" elapsed="0.005774"/>
</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-10-16T01:23:54.747254" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:54.746808" elapsed="0.000483"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:54.748265" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:54.747968" elapsed="0.000388">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:54.748474" 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-10-16T01:23:54.747506" elapsed="0.000999"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:54.749215" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:54.748760" elapsed="0.000491"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:54.749635" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:54.749848" 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-10-16T01:23:54.749478" elapsed="0.000404"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:54.750478" 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-10-16T01:23:54.750171" elapsed="0.000363"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:54.751976" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:54.751653" elapsed="0.000364"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:54.752460" 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-10-16T01:23:54.752205" elapsed="0.000280"/>
</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-10-16T01:23:54.752780" 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-10-16T01:23:54.752965" elapsed="0.000022"/>
</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-10-16T01:23:54.753158" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:54.752637" elapsed="0.000573"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:54.752527" elapsed="0.000711"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:54.753279" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:54.753446" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:54.751181" elapsed="0.002289"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:54.750618" elapsed="0.002880"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:54.753666" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:54.753523" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:54.750594" elapsed="0.003167"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:54.754321" 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-10-16T01:23:54.753915" elapsed="0.000432"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:54.754392" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:54.746065" elapsed="0.008426"/>
</kw>
<msg time="2026-10-16T01:23:54.754539" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:54.740306" elapsed="0.014279"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:54.758477" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:54.762315" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:54.766182" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:54.766360" elapsed="0.000020"/>
</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-10-16T01:23:54.766536" 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-10-16T01:23:54.766893" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:54.766750" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:54.766736" 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-10-16T01:23:54.767118" elapsed="0.000033"/>
</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-10-16T01:23:54.767308" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:54.767464" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:54.766694" elapsed="0.000819"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:54.766604" elapsed="0.000932"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:54.767684" elapsed="0.000034"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:54.767769" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:23:54.767874" 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-10-16T01:23:54.739443" elapsed="0.028455"/>
</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-10-16T01:23:54.769036" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:54.768843" elapsed="0.000252">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:54.769194" 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-10-16T01:23:54.768506" elapsed="0.000712"/>
</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-10-16T01:23:54.769501" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:54.769282" elapsed="0.000271"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:54.770014" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:54.769750" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:54.769576" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:54.769265" elapsed="0.000826"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:54.770600" 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-10-16T01:23:54.770264" elapsed="0.000360"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:54.770669" elapsed="0.000040"/>
</return>
<msg time="2026-10-16T01:23:54.770810" 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-manganese/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-10-16T01:23:54.768208" elapsed="0.002625"/>
</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-10-16T01:23:54.771914" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:54.771718" elapsed="0.000257">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:54.772059" 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-10-16T01:23:54.771390" elapsed="0.000692"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:54.772430" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:23:54.772326" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:54.772151" elapsed="0.000357"/>
</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-10-16T01:23:54.772657" 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-10-16T01:23:54.772847" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:54.772908" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:54.773034" 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-manganese/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-10-16T01:23:54.771078" elapsed="0.001979"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:54.774302" 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-10-16T01:23:54.774061" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:54.774764" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:54.774531" elapsed="0.000274"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:23:54.778979" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:54.779032" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:54.779181" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:54.775085" elapsed="0.004451">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:54.774864" elapsed="0.004750">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:54.779812" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:54.779645" elapsed="0.000227"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:54.774848" elapsed="0.005046">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:54.780248" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:54.780367" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:54.780334" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:54.780318" elapsed="0.000108"/>
</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-10-16T01:23:54.780561" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:54.780623" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:23:54.773340" elapsed="0.007402">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:54.780811" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:23:54.729789" elapsed="0.051152">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:54.781343" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:54.781109" elapsed="0.000316"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:54.781061" elapsed="0.000405"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:54.781548" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:23:54.727605" elapsed="0.054131">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:54.723970" elapsed="0.057868">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:54.723922" elapsed="0.057989">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:54.782170" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:54.782519" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:54.782845" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:54.783271" elapsed="0.000031"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:54.783764" elapsed="0.000024"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:54.784088" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:54.784453" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:54.784759" elapsed="0.000019"/>
</return>
<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="FAIL" start="2026-10-16T01:23:54.716192" elapsed="0.068672">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:54.784926" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:54.714338" elapsed="0.070676">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:54.785253" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:54.785096" elapsed="0.000208"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:54.785462" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:54.785326" elapsed="0.000185"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:54.785674" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:54.785533" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:54.785079" elapsed="0.000692"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:54.713981" elapsed="0.071828">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:54.713576" elapsed="0.072286">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:54.785910" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:54.704896" elapsed="0.081105">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:54.786190" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:54.786411" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:54.786270" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:54.786255" elapsed="0.000224"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:54.786603" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:54.786859" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:54.786920" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:54.703306" elapsed="0.083707">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:54.702846" elapsed="0.084229">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:54.702572" elapsed="0.084565">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:54.701807" elapsed="0.085414">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:54.787430" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:54.680195" elapsed="0.107338">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:55.800574" elapsed="0.000313"/>
</kw>
<msg time="2026-10-16T01:23:55.801030" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:55.799378" elapsed="0.001752"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:55.798589" elapsed="0.002647"/>
</kw>
<msg time="2026-10-16T01:23:55.801294" 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-10-16T01:23:55.794328" elapsed="0.007023"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:55.793740" elapsed="0.007702"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:55.802105" 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-10-16T01:23:55.801778" elapsed="0.000399"/>
</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-10-16T01:23:55.806457" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:55.805968" elapsed="0.000525"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:55.807102" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:55.806723" elapsed="0.000429"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:55.807215" elapsed="0.000043"/>
</return>
<msg time="2026-10-16T01:23:55.807402" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:55.805447" elapsed="0.001987"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:55.807641" elapsed="0.000202"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:55.808511" 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-10-16T01:23:55.808073" elapsed="0.000472"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:55.809088" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:55.808771" elapsed="0.000364"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:55.809644" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:55.809331" elapsed="0.000347"/>
</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-10-16T01:23:55.815243" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:55.814371" elapsed="0.000941"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:55.815392" elapsed="0.000084"/>
</return>
<msg time="2026-10-16T01:23:55.815776" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:55.812321" elapsed="0.003535"/>
</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-10-16T01:23:55.838645" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:55.838222" elapsed="0.000459"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:55.839686" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:55.839383" elapsed="0.000432">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:55.839932" 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-10-16T01:23:55.838917" elapsed="0.001047"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:55.840762" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:55.840300" elapsed="0.000499"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:55.841204" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:55.841417" 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-10-16T01:23:55.841029" elapsed="0.000422"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:55.842054" 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-10-16T01:23:55.841740" elapsed="0.000388"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:55.843655" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:55.843331" elapsed="0.000403"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:55.844354" 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-10-16T01:23:55.843988" elapsed="0.000390"/>
</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-10-16T01:23:55.844661" 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-10-16T01:23:55.844864" elapsed="0.000022"/>
</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-10-16T01:23:55.845046" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:55.844532" elapsed="0.000566"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:55.844421" elapsed="0.000720"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:55.845183" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:55.845313" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:55.842831" elapsed="0.002505"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:55.842216" elapsed="0.003149"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:55.845534" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:55.845389" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:55.842192" elapsed="0.003411"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:55.846188" 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-10-16T01:23:55.845775" elapsed="0.000438"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:55.846257" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:55.837491" elapsed="0.008865"/>
</kw>
<msg time="2026-10-16T01:23:55.846402" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:55.831851" elapsed="0.014597"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:55.850277" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:55.854054" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:55.857880" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:55.858089" elapsed="0.000037"/>
</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-10-16T01:23:55.858287" 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-10-16T01:23:55.858629" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:55.858487" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:55.858473" elapsed="0.000244"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:55.858872" 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-10-16T01:23:55.859054" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:55.859229" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:55.858447" elapsed="0.000832"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:55.858356" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:55.859453" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:55.859520" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:55.859623" 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-10-16T01:23:55.830984" elapsed="0.028663"/>
</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-10-16T01:23:55.860776" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:55.860562" elapsed="0.000273">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:55.860918" 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-10-16T01:23:55.860242" elapsed="0.000699"/>
</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-10-16T01:23:55.861234" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:55.861004" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:55.861748" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:55.861469" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:55.861310" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:55.860988" elapsed="0.000836"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:55.862333" 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-10-16T01:23:55.861979" elapsed="0.000378"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:55.862402" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:55.862525" 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-manganese/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-10-16T01:23:55.859924" elapsed="0.002624"/>
</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-10-16T01:23:55.863624" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:55.863434" elapsed="0.000249">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:55.863785" 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-10-16T01:23:55.863105" elapsed="0.000703"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:55.865850" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:23:55.865738" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:55.863886" elapsed="0.002045"/>
</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-10-16T01:23:55.866090" elapsed="0.000036"/>
</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-10-16T01:23:55.866281" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:55.866342" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:55.866469" 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-manganese/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-10-16T01:23:55.862810" elapsed="0.003682"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:55.867736" 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-10-16T01:23:55.867492" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:55.868209" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:55.867973" elapsed="0.000276"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:23:55.872323" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:55.872378" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:55.872484" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:55.868533" elapsed="0.004346">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:55.868310" elapsed="0.004649">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:55.873157" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:55.872989" elapsed="0.000228"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:55.868293" elapsed="0.004945">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:55.873576" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:55.873695" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:55.873662" elapsed="0.000089"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:55.873646" 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-10-16T01:23:55.873905" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:55.873967" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:23:55.866783" elapsed="0.007293">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:55.874158" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:23:55.821059" elapsed="0.053229">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:55.874673" elapsed="0.000078"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:55.874457" elapsed="0.000358"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:55.874410" elapsed="0.000447"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:55.874942" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:23:55.818838" elapsed="0.056282">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:55.816173" elapsed="0.059050">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:55.816143" elapsed="0.059153">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:55.875547" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:55.875912" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:55.876244" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:55.876597" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:55.877059" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:55.877391" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:55.877771" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:55.878006" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:23:55.811481" elapsed="0.066640">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:55.878185" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:55.810236" elapsed="0.068039">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:55.878496" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:55.878355" elapsed="0.000190"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:55.878730" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:55.878568" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:55.878943" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:55.878803" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:55.878339" elapsed="0.000672"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:55.809994" elapsed="0.069056">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:55.809758" elapsed="0.069345">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:55.879165" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:55.804508" elapsed="0.074747">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:55.879434" elapsed="0.000050"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:55.879689" elapsed="0.000145"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:55.879547" elapsed="0.000318"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:55.879531" elapsed="0.000357"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:55.880016" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:55.880303" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:55.880364" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:55.803508" elapsed="0.076949">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:55.803185" elapsed="0.077333">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:55.802963" elapsed="0.077604">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:55.802459" elapsed="0.078188">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:55.880873" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:55.788166" elapsed="0.092811">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:56.900958" elapsed="0.000466"/>
</kw>
<msg time="2026-10-16T01:23:56.901552" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:56.899586" elapsed="0.002092"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:56.898648" elapsed="0.003225"/>
</kw>
<msg time="2026-10-16T01:23:56.901967" 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-10-16T01:23:56.891810" elapsed="0.010251"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:56.890913" elapsed="0.011359"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:56.903435" 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-10-16T01:23:56.902808" elapsed="0.000720"/>
</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-10-16T01:23:56.911215" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:56.910345" elapsed="0.000939"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:56.912309" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:56.911638" elapsed="0.000725"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:56.912462" elapsed="0.000066"/>
</return>
<msg time="2026-10-16T01:23:56.912794" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:56.909444" elapsed="0.003404"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:56.913222" elapsed="0.000293"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:56.914891" 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-10-16T01:23:56.913942" elapsed="0.001009"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:56.915898" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:56.915350" elapsed="0.000602"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:56.916996" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:56.916340" elapsed="0.000711"/>
</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-10-16T01:23:56.926211" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:56.924692" elapsed="0.001633"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:56.926455" elapsed="0.000134"/>
</return>
<msg time="2026-10-16T01:23:56.927079" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:56.921246" elapsed="0.005986"/>
</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-10-16T01:23:56.953988" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:56.953528" elapsed="0.000496"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:56.955046" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:56.954730" elapsed="0.000442">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:56.955294" 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-10-16T01:23:56.954262" elapsed="0.001064"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:56.956040" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:56.955578" elapsed="0.000498"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:56.956482" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:56.956693" 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-10-16T01:23:56.956322" elapsed="0.000425"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:56.957442" 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-10-16T01:23:56.957042" elapsed="0.000458"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:56.958791" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:56.958449" elapsed="0.000399"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:56.959667" 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-10-16T01:23:56.959089" elapsed="0.000633"/>
</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-10-16T01:23:56.960151" elapsed="0.000039"/>
</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-10-16T01:23:56.960471" elapsed="0.000032"/>
</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-10-16T01:23:56.960755" elapsed="0.000029"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:56.959942" elapsed="0.000888"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:56.959785" elapsed="0.001085"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:56.960929" elapsed="0.000037"/>
</return>
<msg time="2026-10-16T01:23:56.961136" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:56.957961" elapsed="0.003210"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:56.957585" elapsed="0.003627"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:56.961456" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:56.961248" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:56.957561" elapsed="0.004020"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:56.962478" 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-10-16T01:23:56.961856" elapsed="0.000713"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:56.962621" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:56.952800" elapsed="0.009940"/>
</kw>
<msg time="2026-10-16T01:23:56.962791" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:56.946868" elapsed="0.015969"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:56.966651" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:56.970481" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:56.974288" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:56.974468" elapsed="0.000020"/>
</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-10-16T01:23:56.974653" elapsed="0.000019"/>
</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-10-16T01:23:56.975013" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:56.974866" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:56.974853" 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-10-16T01:23:56.975270" 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-10-16T01:23:56.975449" elapsed="0.000018"/>
</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-10-16T01:23:56.975609" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:56.974827" elapsed="0.000831"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:56.974737" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:56.975848" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:56.975917" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:56.976021" 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-10-16T01:23:56.945941" elapsed="0.030104"/>
</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-10-16T01:23:56.977216" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:56.977010" elapsed="0.000267">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:56.977360" 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-10-16T01:23:56.976668" elapsed="0.000716"/>
</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-10-16T01:23:56.977667" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:56.977448" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:56.978200" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:56.977921" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:56.977759" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:56.977431" elapsed="0.000847"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:56.978792" 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-10-16T01:23:56.978436" elapsed="0.000381"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:56.978862" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:56.978986" 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-manganese/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-10-16T01:23:56.976329" elapsed="0.002681"/>
</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-10-16T01:23:56.980115" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:56.979910" elapsed="0.000264">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:56.980258" 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-10-16T01:23:56.979575" elapsed="0.000706"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:56.980445" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:23:56.980346" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:56.980329" elapsed="0.000194"/>
</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-10-16T01:23:56.980675" elapsed="0.000034"/>
</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-10-16T01:23:56.980871" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:56.980933" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:56.981057" 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-manganese/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-10-16T01:23:56.979277" elapsed="0.001803"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:56.982527" 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-10-16T01:23:56.982298" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:56.982994" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:56.982773" elapsed="0.000262"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:23:56.987956" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:56.988013" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:56.988133" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:56.983345" elapsed="0.005167">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:56.983114" elapsed="0.005510">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:56.988826" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:56.988657" elapsed="0.000229"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:56.983078" elapsed="0.005830">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:56.989269" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:56.989390" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:56.989356" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:56.989340" elapsed="0.000108"/>
</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-10-16T01:23:56.989584" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:56.989647" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:23:56.981555" elapsed="0.008214">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:56.989840" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:23:56.935689" elapsed="0.054276">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:56.990369" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:56.990150" elapsed="0.000301"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:56.990089" elapsed="0.000404"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:56.990574" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:23:56.932060" elapsed="0.058702">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:56.927953" elapsed="0.062912">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:56.927653" elapsed="0.063285">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:56.991204" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:56.991547" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:56.991871" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:56.992239" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:56.992663" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:56.992994" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:56.993356" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:56.993595" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:23:56.919849" elapsed="0.073848">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:56.993819" elapsed="0.000017"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:56.917924" elapsed="0.075989">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:56.994151" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:56.993995" elapsed="0.000208"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:56.994364" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:56.994226" elapsed="0.000188"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:56.994578" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:56.994436" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:56.993979" elapsed="0.000667"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:56.917558" elapsed="0.077127">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:56.917182" elapsed="0.077593">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:56.994824" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:56.907492" elapsed="0.087423">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:56.995113" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:56.995334" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:56.995194" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:56.995178" elapsed="0.000225"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:56.995528" elapsed="0.000021"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:56.995723" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:56.995784" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:56.905872" elapsed="0.090004">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:56.905374" elapsed="0.090564">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:56.905080" elapsed="0.090906">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:56.904281" elapsed="0.091787">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:56.996295" elapsed="0.000021"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:56.881863" elapsed="0.114536">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:58.015345" elapsed="0.000438"/>
</kw>
<msg time="2026-10-16T01:23:58.015892" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:58.014012" elapsed="0.002249"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:58.013043" elapsed="0.003442"/>
</kw>
<msg time="2026-10-16T01:23:58.016585" 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-10-16T01:23:58.006359" elapsed="0.010323"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:58.005477" elapsed="0.011420"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:58.018427" 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-10-16T01:23:58.017850" elapsed="0.000671"/>
</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-10-16T01:23:58.025297" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:58.024482" elapsed="0.000874"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:58.026392" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:58.025686" elapsed="0.000761"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:58.026541" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:23:58.026859" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:58.023507" elapsed="0.003404"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:58.027314" elapsed="0.000301"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:58.028772" 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-10-16T01:23:58.028019" elapsed="0.000812"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:58.029688" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:58.029183" elapsed="0.000590"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:58.030637" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:58.030115" elapsed="0.000575"/>
</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-10-16T01:23:58.039676" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:58.038269" elapsed="0.001569"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:58.039968" elapsed="0.000161"/>
</return>
<msg time="2026-10-16T01:23:58.040569" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:58.034776" elapsed="0.005920"/>
</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-10-16T01:23:58.066428" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:58.065898" elapsed="0.000567"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:58.067444" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:58.067165" elapsed="0.000373">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:58.067657" 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-10-16T01:23:58.066682" elapsed="0.001007"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:58.068457" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:58.067950" elapsed="0.000542"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:58.068902" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:58.069197" 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-10-16T01:23:58.068741" elapsed="0.000498"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:58.069878" 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-10-16T01:23:58.069541" elapsed="0.000396"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:58.071425" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:58.070887" elapsed="0.000596"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:58.072130" 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-10-16T01:23:58.071748" elapsed="0.000418"/>
</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-10-16T01:23:58.072567" elapsed="0.000028"/>
</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-10-16T01:23:58.072847" elapsed="0.000032"/>
</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-10-16T01:23:58.073110" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:58.072386" elapsed="0.000777"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:58.072229" elapsed="0.000961"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:58.073231" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:23:58.073362" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:58.070394" elapsed="0.002991"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:58.070023" elapsed="0.003391"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:58.073583" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:58.073439" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:58.069999" elapsed="0.003654"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:58.074229" 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-10-16T01:23:58.073824" elapsed="0.000431"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:58.074299" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:58.065178" elapsed="0.009221"/>
</kw>
<msg time="2026-10-16T01:23:58.074447" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:58.059484" elapsed="0.015009"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:58.078422" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:58.082230" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:58.086002" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:58.086232" 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-10-16T01:23:58.086413" 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-10-16T01:23:58.086783" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:58.086615" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:58.086602" 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-10-16T01:23:58.087013" elapsed="0.000019"/>
</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-10-16T01:23:58.087203" 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-10-16T01:23:58.087365" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:58.086575" elapsed="0.000838"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:58.086483" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:58.087587" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:58.087655" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:23:58.087777" 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-10-16T01:23:58.058615" elapsed="0.029186"/>
</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-10-16T01:23:58.088919" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:58.088725" elapsed="0.000254">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:58.089063" 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-10-16T01:23:58.088382" elapsed="0.000717"/>
</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-10-16T01:23:58.089390" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:58.089171" elapsed="0.000272"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:58.089910" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:58.089624" elapsed="0.000310"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:58.089466" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:58.089154" elapsed="0.000832"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:58.090511" 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-10-16T01:23:58.090172" elapsed="0.000363"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:58.090580" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:58.090718" 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-manganese/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-10-16T01:23:58.088065" elapsed="0.002677"/>
</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-10-16T01:23:58.091864" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:58.091656" elapsed="0.000266">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:58.092006" 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-10-16T01:23:58.091339" elapsed="0.000691"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:58.092217" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:23:58.092115" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:58.092096" elapsed="0.000198"/>
</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-10-16T01:23:58.092443" elapsed="0.000020"/>
</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-10-16T01:23:58.092651" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:58.092728" elapsed="0.000017"/>
</return>
<msg time="2026-10-16T01:23:58.092858" 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-manganese/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-10-16T01:23:58.090991" elapsed="0.001891"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:58.094305" 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-10-16T01:23:58.094060" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:58.094766" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:58.094534" elapsed="0.000273"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:23:58.099023" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:58.099097" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:58.099201" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:58.095105" elapsed="0.004450">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:58.094867" elapsed="0.004766">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:58.099840" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:58.099669" elapsed="0.000230"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:58.094850" elapsed="0.005071">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:58.100277" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:58.100397" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:58.100364" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:58.100349" elapsed="0.000106"/>
</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-10-16T01:23:58.100589" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:58.100653" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:23:58.093350" elapsed="0.007423">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:58.100843" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:23:58.048680" elapsed="0.052293">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:58.101383" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:58.101161" elapsed="0.000305"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:58.101112" elapsed="0.000397"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:58.101594" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:23:58.045359" elapsed="0.056465">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:58.041420" elapsed="0.060507">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:58.041376" elapsed="0.060627">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:58.102278" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:58.102627" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:58.102963" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:58.103331" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:58.103787" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:58.104117" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:58.104464" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:58.104734" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:23:58.033413" elapsed="0.071427">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:58.104903" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:58.031554" elapsed="0.073441">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:58.105245" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:58.105100" elapsed="0.000197"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:58.105458" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:58.105319" elapsed="0.000188"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:58.105673" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:58.105530" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:58.105066" elapsed="0.000706"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:58.031225" elapsed="0.074586">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:58.030817" elapsed="0.075050">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:58.105916" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:58.022158" elapsed="0.083849">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:58.106201" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:58.106422" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:58.106281" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:58.106266" elapsed="0.000226"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:58.106653" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:58.106948" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:58.107011" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:58.020523" elapsed="0.086597">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:58.020055" elapsed="0.087131">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:58.019806" elapsed="0.087431">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:58.019000" elapsed="0.088323">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:58.107534" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:57.997046" elapsed="0.110593">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:59.127258" elapsed="0.000412"/>
</kw>
<msg time="2026-10-16T01:23:59.127817" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:59.125965" elapsed="0.001971"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:23:59.124567" elapsed="0.003557"/>
</kw>
<msg time="2026-10-16T01:23:59.128218" 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-10-16T01:23:59.117895" elapsed="0.010416"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:23:59.117010" elapsed="0.011452"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:59.129518" 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-10-16T01:23:59.128973" elapsed="0.000637"/>
</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-10-16T01:23:59.136261" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:59.135462" elapsed="0.000856"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:59.137304" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:59.136645" elapsed="0.000713"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:59.137452" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:23:59.137771" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:59.134624" elapsed="0.003201"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:23:59.138188" elapsed="0.000286"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:59.139592" 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-10-16T01:23:59.138869" elapsed="0.000778"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:59.140636" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:59.140096" elapsed="0.000592"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:59.141673" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:59.141028" elapsed="0.000731"/>
</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-10-16T01:23:59.150798" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:23:59.149322" elapsed="0.001588"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:23:59.151036" elapsed="0.000170"/>
</return>
<msg time="2026-10-16T01:23:59.151640" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:23:59.145998" elapsed="0.006013"/>
</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-10-16T01:23:59.175948" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:59.175502" elapsed="0.000482"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:23:59.176979" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:23:59.176659" elapsed="0.000437">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:59.177217" 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-10-16T01:23:59.176217" elapsed="0.001031"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:59.177933" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:59.177482" elapsed="0.000486"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:23:59.178377" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:23:59.178578" 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-10-16T01:23:59.178218" elapsed="0.000393"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:59.179221" 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-10-16T01:23:59.178896" elapsed="0.000383"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:59.180727" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:59.180388" elapsed="0.000398"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:23:59.181399" 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-10-16T01:23:59.181025" elapsed="0.000408"/>
</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-10-16T01:23:59.181842" elapsed="0.000030"/>
</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-10-16T01:23:59.182104" 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-10-16T01:23:59.182285" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:23:59.181642" elapsed="0.000693"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:23:59.181492" elapsed="0.000872"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:23:59.182404" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:59.182531" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:23:59.179900" elapsed="0.002654"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:59.179524" elapsed="0.003058"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:59.182765" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:59.182607" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:59.179340" elapsed="0.003496"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:23:59.183402" 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-10-16T01:23:59.182991" elapsed="0.000436"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:23:59.183471" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:23:59.174785" elapsed="0.008784"/>
</kw>
<msg time="2026-10-16T01:23:59.183655" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:59.169108" elapsed="0.014609"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:59.187575" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:59.191431" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:59.195221" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:59.195397" elapsed="0.000019"/>
</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-10-16T01:23:59.195572" elapsed="0.000019"/>
</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-10-16T01:23:59.195933" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:59.195792" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:59.195778" elapsed="0.000228"/>
</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-10-16T01:23:59.196172" 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-10-16T01:23:59.196349" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:59.196507" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:23:59.195751" elapsed="0.000804"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:23:59.195640" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:59.196742" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:59.196812" elapsed="0.000013"/>
</return>
<msg time="2026-10-16T01:23:59.196914" 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-10-16T01:23:59.168250" elapsed="0.028688"/>
</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-10-16T01:23:59.198036" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:59.197844" elapsed="0.000270">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:59.198233" 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-10-16T01:23:59.197508" 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-10-16T01:23:59.198536" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:59.198321" elapsed="0.000266"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:23:59.199051" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:23:59.198787" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-16T01:23:59.198610" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:59.198305" elapsed="0.000838"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:59.199634" 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-10-16T01:23:59.199300" elapsed="0.000358"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:23:59.199718" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:23:59.199842" 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-manganese/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-10-16T01:23:59.197211" elapsed="0.002654"/>
</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-10-16T01:23:59.202745" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:23:59.200753" elapsed="0.002054">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:23:59.202891" 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-10-16T01:23:59.200424" elapsed="0.002490"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:23:59.203090" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:23:59.202978" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:59.202961" elapsed="0.000208"/>
</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-10-16T01:23:59.203319" elapsed="0.000020"/>
</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-10-16T01:23:59.203490" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:59.203549" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:23:59.203676" 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-manganese/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-10-16T01:23:59.200128" elapsed="0.003586"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:59.204945" 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-10-16T01:23:59.204713" elapsed="0.000274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:59.205413" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:23:59.205190" elapsed="0.000264"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:23:59.209549" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:23:59.209603" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:23:59.209735" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:59.205757" elapsed="0.004374">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:59.205514" elapsed="0.004697">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:59.210393" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:59.210242" elapsed="0.000247"/>
</branch>
<status status="FAIL" start="2026-10-16T01:23:59.205498" elapsed="0.005016">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:23:59.210867" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:59.210988" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:59.210955" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:59.210939" elapsed="0.000108"/>
</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-10-16T01:23:59.211204" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:23:59.211267" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:23:59.203987" elapsed="0.007382">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:59.211437" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:23:59.158503" elapsed="0.053060">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:23:59.211976" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:59.211758" elapsed="0.000300"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:59.211683" elapsed="0.000435"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:23:59.212202" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:23:59.156307" elapsed="0.056059">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:23:59.152497" elapsed="0.059967">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:23:59.152454" elapsed="0.060083">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:59.212803" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:23:59.213166" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:59.213475" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:23:59.213850" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:23:59.214292" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:59.214601" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:23:59.214971" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:23:59.215227" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:23:59.144636" elapsed="0.070692">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:23:59.215390" elapsed="0.000014"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:23:59.142593" elapsed="0.072885">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:59.215759" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:59.215591" elapsed="0.000219"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:59.215969" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:59.215832" elapsed="0.000186"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:59.216197" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:59.216040" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:59.215574" elapsed="0.000692"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:23:59.142261" elapsed="0.074042">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:23:59.141855" elapsed="0.074501">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:59.216404" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:23:59.133256" elapsed="0.083237">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:59.216666" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:59.217014" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:59.216873" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:23:59.216856" elapsed="0.000241"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:59.217222" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:59.217388" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:23:59.217446" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:23:59.131615" elapsed="0.085923">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:23:59.131167" elapsed="0.086433">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:23:59.130894" elapsed="0.086754">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:23:59.130113" elapsed="0.087634">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:59.217955" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:23:59.108418" elapsed="0.109655">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<msg time="2026-10-16T01:23:59.218157" level="FAIL">Keyword 'Check Ovsdb Shards Status' failed after retrying for 1 minute 30 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<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="FAIL" start="2026-10-16T01:22:29.114257" elapsed="90.103989">Keyword 'Check Ovsdb Shards Status' failed after retrying for 1 minute 30 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<doc>Check Shard Status after some cluster event.</doc>
<status status="FAIL" start="2026-10-16T01:22:29.113883" elapsed="90.104456">Keyword 'Check Ovsdb Shards Status' failed after retrying for 1 minute 30 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<doc>Create original cluster list and check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:22:28.772224" elapsed="90.446261">Keyword 'Check Ovsdb Shards Status' failed after retrying for 1 minute 30 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:23:59.220288" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:23:59.220027" 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-10-16T01:23:59.222248" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:59.222030" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:59.221898" elapsed="0.000418"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:23:59.224259" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:59.224174" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:59.224157" elapsed="0.000167"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:59.225254" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:59.224902" elapsed="0.000377"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:59.225765" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:59.225472" elapsed="0.000317"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:59.225832" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:23:59.225960" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:59.224527" elapsed="0.001456"/>
</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-10-16T01:23:59.228416" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:59.228331" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:59.228313" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:23:59.229595" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:59.229511" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:59.229494" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:23:59.230058" level="INFO">${karaf_connection_index} = 386</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:23:59.229823" elapsed="0.000273"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:23:59.230864" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:23:59.230259" elapsed="0.000633"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:23:59.265355" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:23:59.231499" elapsed="0.034036"/>
</kw>
<msg time="2026-10-16T01:23:59.265719" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:23:59.265764" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:23:59.231050" elapsed="0.034750"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:23:59.345623" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:23:59.266417" elapsed="0.079413"/>
</kw>
<msg time="2026-10-16T01:23:59.345988" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:23:59.346029" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:23:59.265965" elapsed="0.080120"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:59.346358" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:59.346156" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:59.346139" elapsed="0.000315"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:59.347047" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:23:59.346681" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:59.347447" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:59.347247" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:59.347230" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:23:59.347573" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:59.350256" 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-10-16T01:23:59.352017" elapsed="0.000505"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:23:59.353889" 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-10-16T01:23:59.348543" elapsed="0.005752"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:23:59.347877" elapsed="0.006538"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:23:59.229253" elapsed="0.125240"/>
</kw>
<msg time="2026-10-16T01:23:59.354575" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:23:59.354615" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:23:59.228624" elapsed="0.126027"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:23:59.354886" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:23:59.354798" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:59.354779" elapsed="0.000184"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:23:59.355308" 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-10-16T01:23:59.355609" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:23:59.355674" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:23:59.228002" elapsed="0.127775"/>
</kw>
<msg time="2026-10-16T01:23:59.355860" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:23:59.355900" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:23:59.226321" elapsed="0.129614"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:59.356233" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:59.356001" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:59.355985" elapsed="0.000321"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:23:59.226184" elapsed="0.130144"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:23:59.358801" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:59.358697" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:59.358679" elapsed="0.000186"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:23:59.359982" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:59.359897" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:59.359880" elapsed="0.000165"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:23:59.360443" level="INFO">${karaf_connection_index} = 388</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:23:59.360202" elapsed="0.000266"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:23:59.360829" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:23:59.360628" elapsed="0.000226"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:23:59.396307" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:23:59.361471" elapsed="0.035016"/>
</kw>
<msg time="2026-10-16T01:23:59.396647" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:23:59.396689" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:23:59.361008" elapsed="0.035736"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:23:59.463124" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:23:59.397357" elapsed="0.065947"/>
</kw>
<msg time="2026-10-16T01:23:59.463465" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:23:59.463506" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:23:59.396908" elapsed="0.066635"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:59.463846" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:59.463613" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:59.463595" elapsed="0.000348"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:59.464481" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:23:59.464140" elapsed="0.000419"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:59.464838" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:59.464621" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:59.464604" elapsed="0.000344"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:23:59.464979" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:59.467466" 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-10-16T01:23:59.469215" elapsed="0.000641"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:23:59.471258" elapsed="0.000311"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:23:59.465785" elapsed="0.005851"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:23:59.465269" elapsed="0.006504"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:23:59.359609" elapsed="0.112242"/>
</kw>
<msg time="2026-10-16T01:23:59.471940" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:23:59.471980" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:23:59.359015" elapsed="0.113004"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:23:59.472233" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-10-16T01:23:59.472126" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:59.472105" 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-10-16T01:23:59.472628" 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-10-16T01:23:59.473023" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:23:59.473107" 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-10-16T01:23:59.358407" elapsed="0.114795"/>
</kw>
<msg time="2026-10-16T01:23:59.473285" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:23:59.473325" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:23:59.356571" elapsed="0.116824"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:59.473685" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:59.473467" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:59.473450" elapsed="0.000326"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:23:59.356435" elapsed="0.117363"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:23:59.476212" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:59.476127" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:59.476110" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:23:59.477366" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:59.477282" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:59.477264" elapsed="0.000165"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:23:59.477819" 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-10-16T01:23:59.477572" elapsed="0.000273"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:23:59.478196" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:23:59.478004" elapsed="0.000217"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:23:59.512220" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:23:59.478807" elapsed="0.033601"/>
</kw>
<msg time="2026-10-16T01:23:59.512564" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:23:59.512606" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:23:59.478375" elapsed="0.034266"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:23:59.583395" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:23:59.513277" elapsed="0.070299"/>
</kw>
<msg time="2026-10-16T01:23:59.583755" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:23:59.583798" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:23:59.512832" elapsed="0.071003"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:59.584122" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:59.583904" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:59.583887" elapsed="0.000331"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:59.584751" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:23:59.584399" elapsed="0.000438"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:59.585117" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:59.584903" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:59.584887" elapsed="0.000330"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:23:59.585248" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:59.587763" 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-10-16T01:23:59.589458" elapsed="0.000464"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:23:59.591111" elapsed="0.000454"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:23:59.586042" elapsed="0.005591"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:23:59.585515" elapsed="0.006656"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:23:59.477009" elapsed="0.115259"/>
</kw>
<msg time="2026-10-16T01:23:59.592351" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:23:59.592392" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:23:59.476420" elapsed="0.116009"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:23:59.592584" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:23:59.592499" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:59.592482" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:23:59.592992" 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-10-16T01:23:59.593308" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:23:59.593373" 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-10-16T01:23:59.475819" elapsed="0.117639"/>
</kw>
<msg time="2026-10-16T01:23:59.593540" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:23:59.593579" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:23:59.474044" elapsed="0.119570"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:59.593974" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:59.593680" elapsed="0.000343"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:59.593664" elapsed="0.000381"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:23:59.473907" elapsed="0.120176"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:23:59.226031" elapsed="0.368078"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:23:59.223864" elapsed="0.370297"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:23:59.221317" elapsed="0.372895"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:23:59.220692" elapsed="0.373564"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:23:59.219648" elapsed="0.374658"/>
</kw>
<kw name="Get Ovsdb Entity Owner Status For One Device" owner="ClusterOvsdb">
<msg time="2026-10-16T01:23:59.598095" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:23:59.596857" elapsed="0.001274">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${new_owner}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:59.598345" elapsed="0.000021"/>
</kw>
<doc>Check Entity Owner Status and identify owner and candidate.</doc>
<status status="FAIL" start="2026-10-16T01:23:59.219078" elapsed="0.379412">Variable '${ovsdb_uuid}' not found.</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-10-16T01:23:59.599945" elapsed="0.000221"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:23:59.599629" elapsed="0.000586"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:23:59.601125" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:59.601022" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:59.601005" elapsed="0.000184"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:23:59.603105" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:59.603002" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:59.602985" elapsed="0.000183"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:23:59.604076" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:23:59.603735" elapsed="0.000368"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:23:59.604564" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:23:59.604290" elapsed="0.000298"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:23:59.604629" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:23:59.604772" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:23:59.603368" elapsed="0.001427"/>
</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-10-16T01:23:59.607397" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:59.607313" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:59.607296" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:23:59.608562" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:59.608478" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:59.608461" elapsed="0.000165"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:23:59.609016" level="INFO">${karaf_connection_index} = 386</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:23:59.608793" elapsed="0.000249"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:23:59.609395" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:23:59.609216" elapsed="0.000203"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:23:59.643839" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:23:59.610010" elapsed="0.034009"/>
</kw>
<msg time="2026-10-16T01:23:59.644221" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:23:59.644265" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:23:59.609573" elapsed="0.034729"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:23:59.722677" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:23:59.644945" elapsed="0.077932"/>
</kw>
<msg time="2026-10-16T01:23:59.723035" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:23:59.723099" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:23:59.644472" elapsed="0.078664"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:59.723419" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:59.723208" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:59.723189" elapsed="0.000325"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:59.724068" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:23:59.723694" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:59.724414" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:59.724215" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:59.724199" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:23:59.724538" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:59.727024" 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-10-16T01:23:59.728766" elapsed="0.000466"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:23:59.730409" 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-10-16T01:23:59.725351" elapsed="0.005500"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:23:59.724838" elapsed="0.006131"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:23:59.608220" elapsed="0.122826"/>
</kw>
<msg time="2026-10-16T01:23:59.731150" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:23:59.731190" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:23:59.607608" elapsed="0.123617"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:23:59.731399" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-16T01:23:59.731295" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:59.731278" elapsed="0.000201"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:23:59.732128" 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-10-16T01:23:59.732432" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:23:59.732496" 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-10-16T01:23:59.606998" elapsed="0.125584"/>
</kw>
<msg time="2026-10-16T01:23:59.732666" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:23:59.732722" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:23:59.605134" elapsed="0.127625"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:59.733047" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:59.732827" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:59.732811" elapsed="0.000331"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:23:59.604984" elapsed="0.128180"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:23:59.735726" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:59.735623" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:59.735605" elapsed="0.000186"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:23:59.737247" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:59.736827" elapsed="0.000464"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:59.736810" elapsed="0.000502"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:23:59.737684" level="INFO">${karaf_connection_index} = 388</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:23:59.737456" elapsed="0.000272"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:23:59.738090" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:23:59.737889" elapsed="0.000226"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:23:59.771211" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:23:59.738680" elapsed="0.032708"/>
</kw>
<msg time="2026-10-16T01:23:59.771548" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:23:59.771589" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:23:59.738268" elapsed="0.033355"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:23:59.851425" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:23:59.772249" elapsed="0.079362"/>
</kw>
<msg time="2026-10-16T01:23:59.851797" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:23:59.851838" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:23:59.771809" elapsed="0.080102"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:59.852213" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:59.851985" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:59.851966" elapsed="0.000344"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:59.852851" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:23:59.852491" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:59.853217" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:59.852996" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:59.852979" elapsed="0.000331"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:23:59.853341" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:59.855849" 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-10-16T01:23:59.857569" elapsed="0.000473"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:23:59.859242" elapsed="0.000303"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:23:59.854156" elapsed="0.005455"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:23:59.853613" elapsed="0.006377"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:23:59.736542" elapsed="0.123544"/>
</kw>
<msg time="2026-10-16T01:23:59.860171" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:23:59.860210" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:23:59.735939" elapsed="0.124307"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:23:59.860400" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:23:59.860316" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:59.860299" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:23:59.860820" 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-10-16T01:23:59.861139" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:23:59.861203" 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-10-16T01:23:59.735325" elapsed="0.125963"/>
</kw>
<msg time="2026-10-16T01:23:59.861372" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:23:59.861411" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:23:59.733414" elapsed="0.128032"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:59.861778" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:59.861513" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:59.861497" elapsed="0.000355"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:23:59.733277" elapsed="0.128596"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:23:59.864484" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:59.864399" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:59.864381" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:23:59.865671" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:23:59.865587" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:59.865570" elapsed="0.000240"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:23:59.866208" 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-10-16T01:23:59.865964" elapsed="0.000269"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:23:59.866569" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:23:59.866392" elapsed="0.000202"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:23:59.899032" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:23:59.867208" elapsed="0.032028"/>
</kw>
<msg time="2026-10-16T01:23:59.899391" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:23:59.899433" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:23:59.866771" elapsed="0.032697"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:23:59.971435" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:23:59.900118" elapsed="0.071496"/>
</kw>
<msg time="2026-10-16T01:23:59.971798" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:23:59.971840" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:23:59.899631" elapsed="0.072244"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:59.972158" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:59.971945" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:59.971927" elapsed="0.000327"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:59.972790" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:23:59.972433" elapsed="0.000439"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:59.973146" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:59.972932" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:59.972916" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:23:59.973274" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:59.975762" 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-10-16T01:23:59.977506" elapsed="0.000481"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:23:59.979377" elapsed="0.000309"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:23:59.974082" elapsed="0.005689"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:23:59.973541" elapsed="0.006348"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:23:59.865330" elapsed="0.114636"/>
</kw>
<msg time="2026-10-16T01:23:59.980047" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:23:59.980102" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:23:59.864729" elapsed="0.115410"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:23:59.980293" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:23:59.980208" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:59.980191" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:23:59.980682" elapsed="0.000112"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:59.981134" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:23:59.981199" 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-10-16T01:23:59.864101" elapsed="0.117185"/>
</kw>
<msg time="2026-10-16T01:23:59.981369" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:23:59.981409" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:23:59.862140" elapsed="0.119304"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:59.981747" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:59.981512" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:59.981496" elapsed="0.000325"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:23:59.861985" elapsed="0.119858"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:23:59.604845" elapsed="0.377025"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:23:59.602689" elapsed="0.379235"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:23:59.600765" elapsed="0.381214"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:23:59.600359" elapsed="0.381663"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:23:59.599293" elapsed="0.382798"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:23:59.985775" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:23:59.985528" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-10-16T01:23:59.985511" elapsed="0.000341"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:23:59.986194" 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-10-16T01:23:59.986288" 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-10-16T01:23:59.986042" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:23:59.986804" level="INFO">Attempting to execute command "sudo ovs-vsctl add-br br-s1" on remote system "10.30.171.104" 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-10-16T01:23:59.986499" elapsed="0.000349"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:23:59.987351" level="INFO">${conn_id} = 519</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-10-16T01:23:59.987023" elapsed="0.000353"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:23:59.988228" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:23:59.988297" 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-10-16T01:23:59.987942" elapsed="0.000377"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:23:59.988471" elapsed="0.000299"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:23:59.989554" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:24:00.655824" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:24:00 UTC 2026

  System load:  0.01               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:22:25 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:23:59.989320" elapsed="0.666605"/>
</kw>
<msg time="2026-10-16T01:24:00.656059" 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-10-16T01:23:59.988932" elapsed="0.667194"/>
</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-10-16T01:23:59.987571" elapsed="0.668643"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:24:00.656628" level="INFO">Executing command 'sudo ovs-vsctl add-br br-s1'.</msg>
<msg time="2026-10-16T01:24:00.700087" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:24:00.700352" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:24:00.700443" 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-10-16T01:24:00.656445" elapsed="0.044047"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:00.700887" elapsed="0.000466"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:00.702458" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:00.701869" 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-10-16T01:24:00.702962" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:00.702733" elapsed="0.000353"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:00.702657" elapsed="0.000480"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:24:00.703431" elapsed="0.000054"/>
</return>
<status status="PASS" start="2026-10-16T01:24:00.703247" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:00.703215" elapsed="0.000388"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:24:00.703672" elapsed="0.000064"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:00.705328" elapsed="0.000670"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:24:00.706499" elapsed="0.000345"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:00.707203" elapsed="0.000221"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:24:00.704396" elapsed="0.003136"/>
</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-10-16T01:23:59.985109" elapsed="0.722576"/>
</kw>
<msg time="2026-10-16T01:24:00.707823" 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-10-16T01:23:59.984554" elapsed="0.723370"/>
</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-10-16T01:23:59.984143" elapsed="0.723963"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:24:00.709252" 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-10-16T01:24:00.708539" elapsed="0.000770"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:24:00.710636" 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-10-16T01:24:00.709894" elapsed="0.000846"/>
</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-10-16T01:24:00.719237" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:24:00.718746" elapsed="0.000527"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:00.719890" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:00.719483" elapsed="0.000441"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:24:00.719981" elapsed="0.000037"/>
</return>
<msg time="2026-10-16T01:24:00.720183" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:24:00.718170" elapsed="0.002055"/>
</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-10-16T01:24:00.724065" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:24:00.723641" elapsed="0.000464"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:24:00.724178" elapsed="0.000045"/>
</return>
<msg time="2026-10-16T01:24:00.724389" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:24:00.723192" elapsed="0.001280"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:00.726182" 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-10-16T01:24:00.725814" elapsed="0.000444"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:00.726901" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:00.726567" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:24:00.731805" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:24:00.731877" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:24:00.732019" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:24:00.727385" elapsed="0.005187">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:24:00.727064" elapsed="0.005618">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:00.732959" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:00.732749" elapsed="0.000307"/>
</branch>
<status status="FAIL" start="2026-10-16T01:24:00.727021" elapsed="0.006072">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:00.733579" elapsed="0.000032"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:00.733767" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:00.733718" elapsed="0.000102"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:24:00.733678" elapsed="0.000170"/>
</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-10-16T01:24:00.734057" elapsed="0.000028"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:24:00.734148" elapsed="0.000019"/>
</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-10-16T01:24:00.724923" elapsed="0.009360">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:00.734358" 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-10-16T01:24:00.722557" elapsed="0.011919">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:00.734792" elapsed="0.000031"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:24:00.720453" elapsed="0.014436">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:24:00.720293" elapsed="0.014667">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:24:00.717431" elapsed="0.017666">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:01.744615" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:24:01.743828" elapsed="0.000847"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:01.745861" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:01.745169" elapsed="0.000750"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:24:01.746014" elapsed="0.000101"/>
</return>
<msg time="2026-10-16T01:24:01.746386" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:24:01.742916" elapsed="0.003530"/>
</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-10-16T01:24:01.753218" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:24:01.752537" elapsed="0.000737"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:24:01.753369" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:24:01.753645" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:24:01.751781" elapsed="0.001915"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:01.756389" 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-10-16T01:24:01.755851" elapsed="0.000633"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:01.757460" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:01.756938" 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-10-16T01:24:01.763907" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:24:01.764017" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:24:01.764652" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:24:01.758276" elapsed="0.007212">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:24:01.757687" elapsed="0.007968">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:01.766125" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:01.765762" elapsed="0.000502"/>
</branch>
<status status="FAIL" start="2026-10-16T01:24:01.757648" elapsed="0.008665">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:01.767095" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:01.767363" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:01.767289" elapsed="0.000160"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:24:01.767253" 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-10-16T01:24:01.767831" elapsed="0.000045"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:24:01.767974" elapsed="0.000031"/>
</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-10-16T01:24:01.754415" elapsed="0.013808">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:01.768360" 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-10-16T01:24:01.750011" elapsed="0.018536">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:01.769059" elapsed="0.000057"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:24:01.746842" elapsed="0.022480">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:24:01.746561" elapsed="0.022895">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:24:01.741726" elapsed="0.027923">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:02.779975" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:24:02.778996" elapsed="0.001076"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:02.781195" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:02.780484" elapsed="0.000765"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:24:02.781351" elapsed="0.000088"/>
</return>
<msg time="2026-10-16T01:24:02.781683" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:24:02.778133" elapsed="0.003633"/>
</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-10-16T01:24:02.787784" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:24:02.787146" elapsed="0.000696"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:24:02.787937" elapsed="0.000057"/>
</return>
<msg time="2026-10-16T01:24:02.788233" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:24:02.786353" elapsed="0.001931"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:02.790967" 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-10-16T01:24:02.790422" elapsed="0.000663"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:02.792042" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:02.791497" elapsed="0.000638"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:24:02.798920" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:24:02.799072" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:24:02.799308" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:24:02.792818" elapsed="0.011454">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:24:02.792281" elapsed="0.012164">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:02.805367" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:02.804518" elapsed="0.000993"/>
</branch>
<status status="FAIL" start="2026-10-16T01:24:02.792241" elapsed="0.013323">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:02.806385" elapsed="0.000054"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:02.806657" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:02.806584" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:24:02.806550" elapsed="0.000294"/>
</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-10-16T01:24:02.807307" elapsed="0.000046"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:24:02.807452" 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-10-16T01:24:02.788988" elapsed="0.018682">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:02.807826" 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-10-16T01:24:02.785392" elapsed="0.022664">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:02.808524" elapsed="0.000049"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:24:02.782194" elapsed="0.026486">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:24:02.781891" elapsed="0.026941">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:24:02.776625" elapsed="0.032417">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:03.818221" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:24:03.817357" elapsed="0.000926"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:03.819361" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:03.818673" elapsed="0.000744"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:24:03.819510" elapsed="0.000066"/>
</return>
<msg time="2026-10-16T01:24:03.819843" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:24:03.816490" elapsed="0.003405"/>
</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-10-16T01:24:03.825851" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:24:03.825185" elapsed="0.000723"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:24:03.826032" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:24:03.826338" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:24:03.824409" elapsed="0.001988"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:03.829093" 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-10-16T01:24:03.828531" elapsed="0.000667"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:03.830194" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:03.829642" elapsed="0.000643"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:24:03.836792" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:24:03.836910" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:24:03.837151" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:24:03.830954" elapsed="0.006989">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:24:03.830421" elapsed="0.007800">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:03.838633" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:03.838297" elapsed="0.000502"/>
</branch>
<status status="FAIL" start="2026-10-16T01:24:03.830384" elapsed="0.008466">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:03.840058" elapsed="0.000057"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:03.840335" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:03.840261" elapsed="0.000160"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:24:03.840225" 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-10-16T01:24:03.840803" elapsed="0.000046"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:24:03.840946" elapsed="0.000031"/>
</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-10-16T01:24:03.827132" elapsed="0.014052">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:03.841304" 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-10-16T01:24:03.823438" elapsed="0.018055">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:03.841988" elapsed="0.000071"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:24:03.820284" elapsed="0.021884">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:24:03.820031" elapsed="0.022250">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:24:03.815293" elapsed="0.027171">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:04.851822" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:24:04.850929" elapsed="0.000956"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:04.852971" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:04.852268" elapsed="0.000781"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:24:04.853143" elapsed="0.000065"/>
</return>
<msg time="2026-10-16T01:24:04.853439" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:24:04.850077" elapsed="0.003413"/>
</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-10-16T01:24:04.859509" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:24:04.858869" elapsed="0.000695"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:24:04.859659" elapsed="0.000089"/>
</return>
<msg time="2026-10-16T01:24:04.859971" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:24:04.858103" elapsed="0.001946"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:04.862679" 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-10-16T01:24:04.862170" elapsed="0.000636"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:04.863772" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:04.863251" elapsed="0.000614"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:24:04.870741" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:24:04.870957" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:24:04.871193" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:24:04.864526" elapsed="0.007442">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:24:04.864024" elapsed="0.008127">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:04.872557" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:04.872221" elapsed="0.000464"/>
</branch>
<status status="FAIL" start="2026-10-16T01:24:04.863964" elapsed="0.008809">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:04.873551" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:04.873852" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:04.873776" elapsed="0.000161"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:24:04.873739" elapsed="0.000243"/>
</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-10-16T01:24:04.874314" elapsed="0.000044"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:24:04.874455" elapsed="0.000030"/>
</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-10-16T01:24:04.860730" elapsed="0.013935">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:04.874819" 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-10-16T01:24:04.857122" elapsed="0.017916">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:04.875505" elapsed="0.000049"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:24:04.853880" elapsed="0.021780">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:24:04.853598" elapsed="0.022211">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:24:04.848873" elapsed="0.027557">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:05.886006" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:24:05.885122" elapsed="0.000948"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:05.887151" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:05.886450" elapsed="0.000756"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:24:05.887300" elapsed="0.000065"/>
</return>
<msg time="2026-10-16T01:24:05.887594" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:24:05.884196" elapsed="0.003449"/>
</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-10-16T01:24:05.893656" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:24:05.893045" elapsed="0.000701"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:24:05.893942" elapsed="0.000085"/>
</return>
<msg time="2026-10-16T01:24:05.894250" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:24:05.892249" elapsed="0.002053"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:05.897038" 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-10-16T01:24:05.896416" elapsed="0.000719"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:05.898109" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:05.897553" elapsed="0.000648"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:24:05.904439" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:24:05.904559" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:24:05.904812" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:24:05.898885" elapsed="0.006693">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:24:05.898341" elapsed="0.007434">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:05.906210" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:05.905850" elapsed="0.000493"/>
</branch>
<status status="FAIL" start="2026-10-16T01:24:05.898303" elapsed="0.008089">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:05.907190" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:05.907459" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:05.907385" elapsed="0.000157"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:24:05.907350" 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-10-16T01:24:05.907924" elapsed="0.000045"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:24:05.908090" 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-10-16T01:24:05.895011" elapsed="0.013292">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:05.908423" 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-10-16T01:24:05.891270" elapsed="0.017342">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:05.909139" elapsed="0.000052"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:24:05.888069" elapsed="0.021229">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:24:05.887791" elapsed="0.021622">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:24:05.883025" elapsed="0.026570">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<msg time="2026-10-16T01:24:05.909820" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<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="FAIL" start="2026-10-16T01:24:00.711210" elapsed="5.198979">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${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="NOT RUN" start="2026-10-16T01:24:05.910741" elapsed="0.000048"/>
</kw>
<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-10-16T01:23:59.983746" elapsed="5.927272">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<doc>Create bridge with OVS command and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-10-16T01:23:59.598780" elapsed="6.312535">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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-10-16T01:24:05.915406" elapsed="0.000497"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:24:05.914816" elapsed="0.001227"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:05.918273" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:05.917937" elapsed="0.000444"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:05.917899" elapsed="0.000529"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:05.922853" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:05.922632" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:05.922596" elapsed="0.000419"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:24:05.925274" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:24:05.924478" elapsed="0.000854"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:05.926343" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:05.925668" elapsed="0.000731"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:24:05.926491" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:24:05.926809" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:24:05.923623" elapsed="0.003239"/>
</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-10-16T01:24:05.932777" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:05.932552" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:05.932513" elapsed="0.000409"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:05.935518" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:05.935330" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:05.935293" elapsed="0.000366"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:05.936570" level="INFO">${karaf_connection_index} = 386</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:24:05.936048" elapsed="0.000578"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:05.937406" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:24:05.937073" elapsed="0.000368"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:24:05.970118" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:24:05.938481" elapsed="0.031894"/>
</kw>
<msg time="2026-10-16T01:24:05.970610" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:24:05.970670" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:05.937656" elapsed="0.033096"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:24:06.040860" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:05.971637" elapsed="0.069468"/>
</kw>
<msg time="2026-10-16T01:24:06.041270" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:24:06.041312" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:05.971012" elapsed="0.070336"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:06.041637" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:06.041420" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:06.041402" elapsed="0.000358"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:06.042308" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:06.041942" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:06.042655" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:06.042454" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:06.042437" elapsed="0.000334"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:24:06.042802" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:06.045372" 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-10-16T01:24:06.047160" elapsed="0.000489"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:06.049106" 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-10-16T01:24:06.043610" elapsed="0.005878"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:24:06.043102" elapsed="0.006503"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:24:05.934676" elapsed="0.115009"/>
</kw>
<msg time="2026-10-16T01:24:06.049788" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:06.049828" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:05.933275" elapsed="0.116589"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:24:06.050035" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:24:06.049934" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:06.049917" elapsed="0.000198"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:24:06.050455" 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-10-16T01:24:06.050854" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:24:06.050921" 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-10-16T01:24:05.931882" elapsed="0.119153"/>
</kw>
<msg time="2026-10-16T01:24:06.051120" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:06.051161" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:05.927663" elapsed="0.123533"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:06.051483" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:06.051263" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:06.051248" elapsed="0.000307"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:24:05.927345" elapsed="0.124232"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:06.054064" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:06.053963" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:06.053945" elapsed="0.000182"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:06.055294" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:06.055209" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:06.055192" elapsed="0.000165"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:06.055748" level="INFO">${karaf_connection_index} = 388</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:24:06.055502" elapsed="0.000272"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:06.056140" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:24:06.055938" elapsed="0.000226"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:24:06.094091" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:24:06.056767" elapsed="0.037501"/>
</kw>
<msg time="2026-10-16T01:24:06.094424" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:24:06.094465" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:06.056320" elapsed="0.038181"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:24:06.170240" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:06.095130" elapsed="0.075300"/>
</kw>
<msg time="2026-10-16T01:24:06.170593" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:24:06.170636" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:06.094665" elapsed="0.076006"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:06.170993" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:06.170770" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:06.170750" elapsed="0.000343"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:06.171612" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:06.171274" elapsed="0.000439"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:06.171995" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:06.171778" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:06.171761" elapsed="0.000332"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:24:06.172124" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:06.174625" 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-10-16T01:24:06.176379" elapsed="0.000471"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:06.178223" elapsed="0.000303"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:24:06.172914" elapsed="0.005680"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:24:06.172391" elapsed="0.006340"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:24:06.054928" elapsed="0.123882"/>
</kw>
<msg time="2026-10-16T01:24:06.178892" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:06.178932" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:06.054315" elapsed="0.124674"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:24:06.179148" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:24:06.179060" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:06.179043" elapsed="0.000184"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:24:06.179578" 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-10-16T01:24:06.179991" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:24:06.180059" 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-10-16T01:24:06.053649" elapsed="0.126496"/>
</kw>
<msg time="2026-10-16T01:24:06.180228" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:06.180268" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:06.051844" elapsed="0.128459"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:06.180593" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:06.180371" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:06.180355" elapsed="0.000310"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:24:06.051688" elapsed="0.128999"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:06.183131" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:06.183047" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:06.183030" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:06.184294" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:06.184209" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:06.184193" elapsed="0.000164"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:06.184748" 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-10-16T01:24:06.184500" elapsed="0.000273"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:06.185156" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:24:06.184937" elapsed="0.000244"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:24:06.218468" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:24:06.185768" elapsed="0.032899"/>
</kw>
<msg time="2026-10-16T01:24:06.218868" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:24:06.218910" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:06.185337" elapsed="0.033609"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:24:06.294868" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:06.219559" elapsed="0.075538"/>
</kw>
<msg time="2026-10-16T01:24:06.295258" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:24:06.295299" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:06.219133" elapsed="0.076202"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:06.295620" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:06.295405" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:06.295387" elapsed="0.000353"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:06.296285" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:06.295923" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:06.296626" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:06.296431" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:06.296415" elapsed="0.000359"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:24:06.296806" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:06.299497" 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-10-16T01:24:06.301256" elapsed="0.000475"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:06.302931" 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-10-16T01:24:06.297798" elapsed="0.005532"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:24:06.297093" elapsed="0.006385"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:24:06.183933" elapsed="0.119625"/>
</kw>
<msg time="2026-10-16T01:24:06.303640" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:06.303679" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:06.183340" elapsed="0.120668"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:24:06.304168" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:24:06.304082" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:06.304065" elapsed="0.000181"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:24:06.304554" 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-10-16T01:24:06.304871" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:24:06.304938" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:24:06.182745" elapsed="0.122307"/>
</kw>
<msg time="2026-10-16T01:24:06.305135" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:06.305175" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:06.180955" elapsed="0.124256"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:06.305496" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:06.305278" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:06.305263" elapsed="0.000304"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:24:06.180817" elapsed="0.124771"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:24:05.926967" elapsed="0.378648"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:24:05.921953" elapsed="0.383711"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:24:05.917332" elapsed="0.388447"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:05.916383" elapsed="0.389442"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:24:05.913949" elapsed="0.391925"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:06.309331" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:06.309097" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:06.309079" elapsed="0.000327"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:06.309749" 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-10-16T01:24:06.309844" 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-10-16T01:24:06.309600" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:06.310402" 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.104" 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-10-16T01:24:06.310111" elapsed="0.000334"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:06.310945" level="INFO">${conn_id} = 524</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-10-16T01:24:06.310622" elapsed="0.000366"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:24:06.311883" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:24:06.311956" 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-10-16T01:24:06.311539" elapsed="0.000455"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:06.312145" elapsed="0.000286"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:24:06.313252" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:24:06.732572" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:24:00 UTC 2026

  System load:  0.01               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:24:00 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:24:06.313017" elapsed="0.419672"/>
</kw>
<msg time="2026-10-16T01:24:06.732781" 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-10-16T01:24:06.312606" elapsed="0.420253"/>
</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-10-16T01:24:06.311184" elapsed="0.421796"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:24:06.733418" level="INFO">Executing command 'sudo ovs-vsctl add-port br-s1 vx1 -- set Interface vx1 type=vxlan'.</msg>
<msg time="2026-10-16T01:24:06.776991" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:24:06.777221" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:24:06.777311" 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-10-16T01:24:06.733231" elapsed="0.044131"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:06.777756" elapsed="0.000489"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:06.779346" 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-10-16T01:24:06.778758" elapsed="0.000683"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:24:06.779851" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:06.779597" elapsed="0.000354"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:06.779549" elapsed="0.000473"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:24:06.780313" elapsed="0.000053"/>
</return>
<status status="PASS" start="2026-10-16T01:24:06.780130" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:06.780099" elapsed="0.000383"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:24:06.780550" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:06.782201" elapsed="0.000659"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:24:06.783293" elapsed="0.000311"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:06.783946" elapsed="0.000243"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:24:06.781244" elapsed="0.003052"/>
</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-10-16T01:24:06.308650" elapsed="0.475829"/>
</kw>
<msg time="2026-10-16T01:24:06.784687" 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-10-16T01:24:06.308132" elapsed="0.476693"/>
</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-10-16T01:24:06.307681" elapsed="0.477340"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:24:06.786190" 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-10-16T01:24:06.785466" elapsed="0.000780"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:24:06.787404" 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-10-16T01:24:06.786743" elapsed="0.000715"/>
</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-10-16T01:24:06.797536" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:24:06.796750" elapsed="0.000842"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:06.798627" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:06.797981" elapsed="0.000699"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:24:06.798807" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:24:06.799121" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:24:06.795914" elapsed="0.003261"/>
</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-10-16T01:24:06.803296" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:24:06.802902" elapsed="0.000428"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:24:06.803388" elapsed="0.000036"/>
</return>
<msg time="2026-10-16T01:24:06.803557" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:24:06.802435" elapsed="0.001153"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:06.805568" 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-10-16T01:24:06.804977" elapsed="0.000650"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:06.806239" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:06.805911" elapsed="0.000383"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:24:06.811112" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:24:06.811185" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:24:06.811331" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:24:06.806694" elapsed="0.005193">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:24:06.806377" elapsed="0.005637">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:06.812272" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:06.812062" elapsed="0.000290"/>
</branch>
<status status="FAIL" start="2026-10-16T01:24:06.806355" elapsed="0.006029">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:06.812891" elapsed="0.000033"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:06.813130" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:06.813083" elapsed="0.000101"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:24:06.813057" elapsed="0.000156"/>
</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-10-16T01:24:06.813408" elapsed="0.000027"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:24:06.813496" elapsed="0.000019"/>
</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-10-16T01:24:06.804094" elapsed="0.009539">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:06.813730" 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-10-16T01:24:06.801848" elapsed="0.012006">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:06.814165" elapsed="0.000031"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:24:06.799546" elapsed="0.014717">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:24:06.799289" elapsed="0.015046">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:24:06.794812" elapsed="0.019637">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:07.823644" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:24:07.822835" elapsed="0.000907"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:07.824817" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:07.824146" elapsed="0.000729"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:24:07.824985" elapsed="0.000065"/>
</return>
<msg time="2026-10-16T01:24:07.825281" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:24:07.822004" elapsed="0.003329"/>
</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-10-16T01:24:07.831581" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:24:07.830966" elapsed="0.000671"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:24:07.831766" elapsed="0.000059"/>
</return>
<msg time="2026-10-16T01:24:07.832110" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:24:07.830200" elapsed="0.001963"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:07.835292" 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-10-16T01:24:07.834329" elapsed="0.001061"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:07.836376" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:07.835842" 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-10-16T01:24:07.842793" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:24:07.842908" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:24:07.843140" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:24:07.837168" elapsed="0.006839">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:24:07.836606" elapsed="0.007567">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:07.844584" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:07.844246" elapsed="0.000504"/>
</branch>
<status status="FAIL" start="2026-10-16T01:24:07.836568" elapsed="0.008236">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:07.845593" elapsed="0.000054"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:07.845922" elapsed="0.000052"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:07.845845" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:24:07.845783" elapsed="0.000301"/>
</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-10-16T01:24:07.846390" elapsed="0.000044"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:24:07.846531" elapsed="0.000031"/>
</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-10-16T01:24:07.832888" elapsed="0.013886">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:07.846898" 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-10-16T01:24:07.829223" elapsed="0.017892">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:07.847613" elapsed="0.000049"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:24:07.825686" elapsed="0.022113">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:24:07.825440" elapsed="0.022474">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:24:07.820736" elapsed="0.027387">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:08.857875" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:24:08.856963" elapsed="0.000998"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:08.859065" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:08.858313" elapsed="0.000808"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:24:08.859217" elapsed="0.000070"/>
</return>
<msg time="2026-10-16T01:24:08.859519" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:24:08.856098" elapsed="0.003472"/>
</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-10-16T01:24:08.865505" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:24:08.864875" elapsed="0.000687"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:24:08.865655" elapsed="0.000089"/>
</return>
<msg time="2026-10-16T01:24:08.865987" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:24:08.864132" elapsed="0.001911"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:08.869221" 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-10-16T01:24:08.868192" elapsed="0.001129"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:08.870300" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:08.869774" elapsed="0.000617"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:24:08.877222" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:24:08.877337" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:24:08.877554" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:24:08.871215" elapsed="0.007208">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:24:08.870638" elapsed="0.007961">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:08.879149" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:08.878679" elapsed="0.000601"/>
</branch>
<status status="FAIL" start="2026-10-16T01:24:08.870596" elapsed="0.008734">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:08.880120" elapsed="0.000054"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:08.880384" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:08.880311" elapsed="0.000155"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:24:08.880277" 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-10-16T01:24:08.880849" elapsed="0.000046"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:24:08.881017" 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-10-16T01:24:08.866756" elapsed="0.014475">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:08.881350" elapsed="0.000031"/>
</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-10-16T01:24:08.863164" elapsed="0.018375">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:08.882055" elapsed="0.000075"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:24:08.859991" elapsed="0.022247">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:24:08.859685" elapsed="0.022666">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:24:08.854832" elapsed="0.027702">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:09.891652" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:24:09.890845" elapsed="0.000898"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:09.892772" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:09.892115" elapsed="0.000714"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:24:09.892945" elapsed="0.000071"/>
</return>
<msg time="2026-10-16T01:24:09.893298" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:24:09.890016" elapsed="0.003337"/>
</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-10-16T01:24:09.899467" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:24:09.898835" elapsed="0.000688"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:24:09.899619" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:24:09.899949" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:24:09.898089" elapsed="0.001917"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:09.903053" 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-10-16T01:24:09.902140" elapsed="0.001012"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:09.904144" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:09.903581" elapsed="0.000656"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:24:09.910515" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:24:09.910628" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:24:09.910878" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:24:09.904958" elapsed="0.006667">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:24:09.904373" elapsed="0.007452">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:09.912319" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:09.911897" elapsed="0.000575"/>
</branch>
<status status="FAIL" start="2026-10-16T01:24:09.904336" elapsed="0.008193">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:09.913313" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:09.913580" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:09.913506" elapsed="0.000158"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:24:09.913471" elapsed="0.000270"/>
</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-10-16T01:24:09.914075" elapsed="0.000044"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:24:09.914215" elapsed="0.000031"/>
</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-10-16T01:24:09.900658" elapsed="0.013768">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:09.914544" 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-10-16T01:24:09.897112" elapsed="0.017649">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:09.915242" elapsed="0.000050"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:24:09.893835" elapsed="0.021561">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:24:09.893547" elapsed="0.021961">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:24:09.888837" elapsed="0.026852">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:10.925136" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:24:10.924265" elapsed="0.000935"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:10.926227" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:10.925540" elapsed="0.000743"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:24:10.926379" elapsed="0.000068"/>
</return>
<msg time="2026-10-16T01:24:10.926676" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:24:10.923398" elapsed="0.003362"/>
</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-10-16T01:24:10.932670" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:24:10.932061" elapsed="0.000699"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:24:10.932856" elapsed="0.000079"/>
</return>
<msg time="2026-10-16T01:24:10.933155" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:24:10.931282" elapsed="0.001923"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:10.940300" 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-10-16T01:24:10.935387" elapsed="0.005030"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:10.941476" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:10.940951" 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-10-16T01:24:10.948512" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:24:10.948637" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:24:10.948938" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:24:10.942344" elapsed="0.007412">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:24:10.941746" elapsed="0.008231">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:10.950387" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:10.950050" elapsed="0.000468"/>
</branch>
<status status="FAIL" start="2026-10-16T01:24:10.941673" elapsed="0.008893">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:10.951358" elapsed="0.000054"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:10.951630" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:10.951555" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:24:10.951520" 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-10-16T01:24:10.952124" elapsed="0.000045"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:24:10.952264" 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-10-16T01:24:10.933896" elapsed="0.018578">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:10.952697" elapsed="0.000067"/>
</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-10-16T01:24:10.930272" elapsed="0.022724">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:10.953467" elapsed="0.000048"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:24:10.927143" elapsed="0.026476">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:24:10.926872" elapsed="0.026894">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:24:10.922185" elapsed="0.031834">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:11.963292" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:24:11.962414" elapsed="0.000938"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:11.964368" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:11.963690" elapsed="0.000733"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:24:11.964515" elapsed="0.000063"/>
</return>
<msg time="2026-10-16T01:24:11.964842" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:24:11.961550" elapsed="0.003375"/>
</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-10-16T01:24:11.970769" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:24:11.970130" elapsed="0.000698"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:24:11.970947" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:24:11.971223" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:24:11.969362" elapsed="0.001913"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:11.973943" 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-10-16T01:24:11.973389" elapsed="0.000653"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:11.975042" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:11.974470" elapsed="0.000666"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:24:11.981795" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:24:11.981932" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:24:11.982142" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:24:11.975806" elapsed="0.007138">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:24:11.975270" elapsed="0.007838">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:11.983535" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:11.983179" elapsed="0.000503"/>
</branch>
<status status="FAIL" start="2026-10-16T01:24:11.975233" elapsed="0.008540">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:11.984575" elapsed="0.000186"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:11.985012" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:11.984935" elapsed="0.000164"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:24:11.984878" 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-10-16T01:24:11.985451" elapsed="0.000043"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:24:11.985590" elapsed="0.000030"/>
</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-10-16T01:24:11.971982" elapsed="0.013851">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:11.985978" 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-10-16T01:24:11.968395" elapsed="0.017775">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:11.986630" elapsed="0.000049"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:24:11.965284" elapsed="0.021538">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:24:11.965037" elapsed="0.021924">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:24:11.960361" elapsed="0.026786">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<msg time="2026-10-16T01:24:11.987334" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<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="FAIL" start="2026-10-16T01:24:06.787957" elapsed="5.199571">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${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="NOT RUN" start="2026-10-16T01:24:11.988095" elapsed="0.000047"/>
</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="FAIL" start="2026-10-16T01:24:06.307310" elapsed="5.681032">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<doc>Add port with OVS command and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-10-16T01:24:05.912063" elapsed="6.076566">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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-10-16T01:24:11.991876" elapsed="0.000481"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:24:11.991300" elapsed="0.001171"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:11.994551" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:11.994360" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:11.994321" elapsed="0.000371"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:11.998998" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:11.998788" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:11.998749" elapsed="0.000389"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:24:12.001206" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:24:12.000425" elapsed="0.000839"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:12.002259" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:12.001592" elapsed="0.000722"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:24:12.002477" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:24:12.002802" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:24:11.999579" elapsed="0.003276"/>
</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-10-16T01:24:12.008646" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:12.008456" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:12.008417" elapsed="0.000403"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:12.010737" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:12.010587" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:12.010564" elapsed="0.000264"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:12.011366" level="INFO">${karaf_connection_index} = 386</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:24:12.011045" elapsed="0.000356"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:12.011928" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:24:12.011623" elapsed="0.000341"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:24:12.046192" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:24:12.012791" elapsed="0.033585"/>
</kw>
<msg time="2026-10-16T01:24:12.046556" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:24:12.046599" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:12.012180" elapsed="0.034455"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:24:12.120444" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:12.047273" elapsed="0.073358"/>
</kw>
<msg time="2026-10-16T01:24:12.120823" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:24:12.120864" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:12.046826" elapsed="0.074085"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:12.121193" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:12.120987" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:12.120969" elapsed="0.000318"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:12.121823" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:12.121467" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:12.122181" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:12.121985" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:12.121970" elapsed="0.000305"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:24:12.122306" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:12.124850" 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-10-16T01:24:12.126620" elapsed="0.000541"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:12.128558" 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-10-16T01:24:12.123133" elapsed="0.005868"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:24:12.122585" elapsed="0.006532"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:24:12.010230" elapsed="0.119003"/>
</kw>
<msg time="2026-10-16T01:24:12.129317" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:12.129358" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:12.009177" elapsed="0.120217"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:24:12.129548" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:24:12.129462" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:12.129446" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:24:12.130059" 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-10-16T01:24:12.130357" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:24:12.130422" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:24:12.007786" elapsed="0.122719"/>
</kw>
<msg time="2026-10-16T01:24:12.130589" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:12.130629" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:12.003603" elapsed="0.127063"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:12.130989" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:12.130753" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:12.130736" elapsed="0.000326"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:24:12.003293" elapsed="0.127790"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:12.133677" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:12.133593" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:12.133576" elapsed="0.000183"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:12.134870" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:12.134784" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:12.134767" elapsed="0.000183"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:12.135316" level="INFO">${karaf_connection_index} = 388</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:24:12.135093" elapsed="0.000248"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:12.135677" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:24:12.135500" elapsed="0.000279"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:24:12.170775" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:24:12.136386" elapsed="0.034598"/>
</kw>
<msg time="2026-10-16T01:24:12.171144" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:24:12.171185" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:12.135968" elapsed="0.035254"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:24:12.236267" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:12.171843" elapsed="0.064603"/>
</kw>
<msg time="2026-10-16T01:24:12.236605" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:24:12.236647" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:12.171391" elapsed="0.065292"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:12.237006" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:12.236780" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:12.236761" elapsed="0.000379"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:12.237659" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:12.237321" elapsed="0.000436"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:12.238033" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:12.237819" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:12.237802" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:24:12.238159" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:12.240630" 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-10-16T01:24:12.242424" elapsed="0.000496"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:12.244492" 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-10-16T01:24:12.238974" elapsed="0.005907"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:24:12.238432" elapsed="0.006587"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:24:12.134501" elapsed="0.110596"/>
</kw>
<msg time="2026-10-16T01:24:12.245179" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:12.245218" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:12.133919" elapsed="0.111335"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:24:12.245408" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:24:12.245323" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:12.245306" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:24:12.245881" elapsed="0.000037"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:12.246200" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:24:12.246263" 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-10-16T01:24:12.133301" elapsed="0.113047"/>
</kw>
<msg time="2026-10-16T01:24:12.246431" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:12.246471" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:12.131330" elapsed="0.115177"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:12.246809" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:12.246574" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:12.246558" elapsed="0.000323"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:24:12.131194" elapsed="0.115722"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:12.249529" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:12.249444" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:12.249426" elapsed="0.000167"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:12.250744" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:12.250625" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:12.250607" elapsed="0.000203"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:12.251197" 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-10-16T01:24:12.250972" elapsed="0.000250"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:12.251558" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:24:12.251380" elapsed="0.000240"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:24:12.286782" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:24:12.252242" elapsed="0.034750"/>
</kw>
<msg time="2026-10-16T01:24:12.287153" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:24:12.287195" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:12.251800" elapsed="0.035430"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:24:12.353083" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:12.287844" elapsed="0.065426"/>
</kw>
<msg time="2026-10-16T01:24:12.353438" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:24:12.353482" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:12.287394" elapsed="0.066124"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:12.353840" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:12.353592" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:12.353574" elapsed="0.000380"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:12.354487" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:12.354134" elapsed="0.000431"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:12.354847" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:12.354626" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:12.354610" elapsed="0.000349"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:24:12.354990" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:12.357492" elapsed="0.000789"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:24:12.359556" elapsed="0.000590"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:12.361522" 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-10-16T01:24:12.355790" elapsed="0.006152"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:24:12.355260" elapsed="0.006801"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:24:12.250368" elapsed="0.111774"/>
</kw>
<msg time="2026-10-16T01:24:12.362226" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:12.362267" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:12.249762" elapsed="0.112542"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:24:12.362460" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:24:12.362373" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:12.362356" elapsed="0.000183"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:24:12.362970" 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-10-16T01:24:12.363274" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:24:12.363338" 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-10-16T01:24:12.249151" elapsed="0.114275"/>
</kw>
<msg time="2026-10-16T01:24:12.363551" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:12.363592" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:12.247164" elapsed="0.116465"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:12.363953" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:12.363715" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:12.363682" elapsed="0.000345"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:24:12.247028" elapsed="0.117022"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:24:12.002986" elapsed="0.361092"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:24:11.998104" elapsed="0.366026"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:24:11.993769" elapsed="0.370414"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:11.992833" elapsed="0.371394"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:24:11.990487" elapsed="0.373792"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:12.366752" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:12.366495" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:12.366286" elapsed="0.000544"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:12.367170" 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-10-16T01:24:12.367263" 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-10-16T01:24:12.367037" elapsed="0.000251"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:12.367783" level="INFO">Attempting to execute command "ip tuntap add mode tap vport1" on remote system "10.30.171.104" 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-10-16T01:24:12.367474" elapsed="0.000353"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:12.368324" level="INFO">${conn_id} = 529</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-10-16T01:24:12.368021" elapsed="0.000328"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:24:12.369255" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:24:12.369326" 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-10-16T01:24:12.368930" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:12.369498" elapsed="0.000307"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:24:12.370587" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:24:12.732714" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:24:00 UTC 2026

  System load:  0.01               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:24:06 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:24:12.370352" elapsed="0.362452"/>
</kw>
<msg time="2026-10-16T01:24:12.732862" 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-10-16T01:24:12.369985" elapsed="0.362953"/>
</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-10-16T01:24:12.368540" elapsed="0.364482"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:24:12.733456" level="INFO">Executing command 'ip tuntap add mode tap vport1'.</msg>
<msg time="2026-10-16T01:24:12.746394" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-10-16T01:24:12.746561" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:24:12.746632" 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-10-16T01:24:12.733284" elapsed="0.013386"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:12.746933" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:12.747902" 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-10-16T01:24:12.747526" elapsed="0.000437"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:24:12.748197" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:12.748057" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:12.748030" elapsed="0.000260"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:24:12.748472" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-10-16T01:24:12.748359" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:12.748338" elapsed="0.000242"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:24:12.748624" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:12.749732" elapsed="0.000435"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:24:12.750421" elapsed="0.000198"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:12.750833" elapsed="0.000143"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:24:12.749064" elapsed="0.001979"/>
</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-10-16T01:24:12.365867" elapsed="0.385272"/>
</kw>
<msg time="2026-10-16T01:24:12.751206" 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-10-16T01:24:12.365325" elapsed="0.385943"/>
</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-10-16T01:24:12.364907" elapsed="0.386459"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:12.754279" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:12.753951" elapsed="0.000400"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:12.753925" elapsed="0.000459"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:12.754840" 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-10-16T01:24:12.754987" 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-10-16T01:24:12.754648" elapsed="0.000375"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:12.755742" level="INFO">Attempting to execute command "ip tuntap add mode tap vport2" on remote system "10.30.171.104" 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-10-16T01:24:12.755280" elapsed="0.000528"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:12.756505" level="INFO">${conn_id} = 531</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-10-16T01:24:12.756072" elapsed="0.000474"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:24:12.757809" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:24:12.757933" 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-10-16T01:24:12.757374" elapsed="0.000591"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:12.758169" elapsed="0.000397"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:24:12.759657" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:24:13.145248" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:24:00 UTC 2026

  System load:  0.01               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:24:12 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:24:12.759338" elapsed="0.386068"/>
</kw>
<msg time="2026-10-16T01:24:13.145465" 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-10-16T01:24:12.758810" elapsed="0.386714"/>
</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-10-16T01:24:12.756857" elapsed="0.388749"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:24:13.146020" level="INFO">Executing command 'ip tuntap add mode tap vport2'.</msg>
<msg time="2026-10-16T01:24:13.158792" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-10-16T01:24:13.158949" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:24:13.159006" 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-10-16T01:24:13.145839" elapsed="0.013197"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:13.159254" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:13.160224" 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-10-16T01:24:13.159866" elapsed="0.000417"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:24:13.160515" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:13.160377" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:13.160350" elapsed="0.000259"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:24:13.160813" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-10-16T01:24:13.160676" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:13.160656" elapsed="0.000283"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:24:13.160983" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:13.161969" elapsed="0.000398"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:24:13.162622" elapsed="0.000227"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:13.163059" 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-10-16T01:24:13.161386" elapsed="0.001861"/>
</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-10-16T01:24:12.753320" elapsed="0.410025"/>
</kw>
<msg time="2026-10-16T01:24:13.163413" 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-10-16T01:24:12.752291" elapsed="0.411186"/>
</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-10-16T01:24:12.751663" elapsed="0.411912"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:13.166478" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:13.166151" elapsed="0.000401"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:13.166127" elapsed="0.000458"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:13.167066" 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-10-16T01:24:13.167193" 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-10-16T01:24:13.166874" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:13.167927" level="INFO">Attempting to execute command "ifconfig vport1 up" on remote system "10.30.171.104" 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-10-16T01:24:13.167487" elapsed="0.000501"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:13.168642" 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-10-16T01:24:13.168230" elapsed="0.000447"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:24:13.169842" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:24:13.169956" 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-10-16T01:24:13.169476" elapsed="0.000512"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:13.170246" elapsed="0.000407"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:24:13.171779" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:24:13.553630" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:24:00 UTC 2026

  System load:  0.01               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:24:13 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:24:13.171433" elapsed="0.382300"/>
</kw>
<msg time="2026-10-16T01:24:13.553792" 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-10-16T01:24:13.170924" elapsed="0.382926"/>
</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-10-16T01:24:13.168979" elapsed="0.384969"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:24:13.554314" level="INFO">Executing command 'ifconfig vport1 up'.</msg>
<msg time="2026-10-16T01:24:13.566965" level="INFO">Command exited with return code 255.</msg>
<msg time="2026-10-16T01:24:13.567106" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:24:13.567161" 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-10-16T01:24:13.554155" elapsed="0.013038"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:13.567406" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:13.568363" 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-10-16T01:24:13.568031" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:24:13.568650" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:13.568514" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:13.568487" elapsed="0.000280"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:24:13.568967" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-10-16T01:24:13.568835" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:13.568815" elapsed="0.000260"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:24:13.569118" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:13.570092" elapsed="0.000392"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:24:13.570755" elapsed="0.000439"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:13.571399" elapsed="0.000128"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:24:13.569508" elapsed="0.002087"/>
</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-10-16T01:24:13.165520" elapsed="0.406172"/>
</kw>
<msg time="2026-10-16T01:24:13.571783" 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-10-16T01:24:13.164440" elapsed="0.407407"/>
</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-10-16T01:24:13.163844" elapsed="0.408119"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:13.574541" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:13.574219" elapsed="0.000395"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:13.574193" elapsed="0.000454"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:13.575122" 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-10-16T01:24:13.575309" 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-10-16T01:24:13.574950" elapsed="0.000395"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:13.576051" level="INFO">Attempting to execute command "ifconfig vport2 up" on remote system "10.30.171.104" 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-10-16T01:24:13.575605" elapsed="0.000506"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:13.576796" 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-10-16T01:24:13.576360" elapsed="0.000471"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:24:13.577991" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:24:13.578089" 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-10-16T01:24:13.577610" elapsed="0.000510"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:13.578326" elapsed="0.000416"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:24:13.579831" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:24:13.958564" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:24:00 UTC 2026

  System load:  0.01               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:24:13 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:24:13.579490" elapsed="0.379234"/>
</kw>
<msg time="2026-10-16T01:24:13.958788" 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-10-16T01:24:13.578983" elapsed="0.379870"/>
</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-10-16T01:24:13.577115" elapsed="0.381841"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:24:13.959399" level="INFO">Executing command 'ifconfig vport2 up'.</msg>
<msg time="2026-10-16T01:24:13.972055" level="INFO">Command exited with return code 255.</msg>
<msg time="2026-10-16T01:24:13.972161" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:24:13.972203" 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-10-16T01:24:13.959225" elapsed="0.013001"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:13.972382" elapsed="0.000452"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:13.973363" 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-10-16T01:24:13.973078" elapsed="0.000327"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:24:13.973588" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:13.973481" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:13.973456" elapsed="0.000202"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:24:13.973808" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:24:13.973725" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:13.973693" elapsed="0.000212"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:24:13.973942" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:13.974642" 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-10-16T01:24:13.975145" elapsed="0.000144"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:13.975430" elapsed="0.000094"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:24:13.974243" elapsed="0.001329"/>
</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-10-16T01:24:13.573549" elapsed="0.402092"/>
</kw>
<msg time="2026-10-16T01:24:13.975758" 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-10-16T01:24:13.572814" elapsed="0.402992"/>
</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-10-16T01:24:13.572207" elapsed="0.403707"/>
</kw>
<doc>Create Tap Device vport1 and vport2 to add to the bridge br-s1 using OVS command.</doc>
<status status="PASS" start="2026-10-16T01:24:12.364479" elapsed="1.611495"/>
</kw>
<doc>Create tap devices to add to the bridge in ovs</doc>
<status status="PASS" start="2026-10-16T01:24:11.989384" elapsed="1.986698"/>
</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-10-16T01:24:13.977605" elapsed="0.000220"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:24:13.977358" 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-10-16T01:24:13.978796" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:13.978688" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:13.978671" elapsed="0.000189"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:13.980861" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:13.980778" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:13.980761" elapsed="0.000176"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:24:13.981840" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:24:13.981493" elapsed="0.000372"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:13.982296" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:13.982028" elapsed="0.000292"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:24:13.982360" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:24:13.982485" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:24:13.981141" elapsed="0.001367"/>
</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-10-16T01:24:13.985120" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:13.985035" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:13.985016" elapsed="0.000167"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:13.986365" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:13.986281" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:13.986264" elapsed="0.000164"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:13.986840" level="INFO">${karaf_connection_index} = 386</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:24:13.986572" elapsed="0.000293"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:13.987260" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:24:13.987064" elapsed="0.000220"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:24:14.022347" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:24:13.987897" elapsed="0.034638"/>
</kw>
<msg time="2026-10-16T01:24:14.022725" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:24:14.022769" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:13.987437" elapsed="0.035367"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:24:14.101620" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:14.023428" elapsed="0.078415"/>
</kw>
<msg time="2026-10-16T01:24:14.102032" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:24:14.102075" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:14.023004" elapsed="0.079108"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:14.102439" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:14.102226" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:14.102205" elapsed="0.000333"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:14.103105" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:14.102736" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:14.103450" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:14.103253" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:14.103236" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:24:14.103575" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:14.106098" 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-10-16T01:24:14.107827" elapsed="0.000468"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:14.109644" 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-10-16T01:24:14.104390" elapsed="0.005663"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:24:14.103890" elapsed="0.006280"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:24:13.986022" elapsed="0.124226"/>
</kw>
<msg time="2026-10-16T01:24:14.110332" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:14.110373" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:13.985330" elapsed="0.125080"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:24:14.110564" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:24:14.110479" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:14.110462" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:24:14.111040" 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-10-16T01:24:14.111342" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:24:14.111407" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:24:13.984727" elapsed="0.126767"/>
</kw>
<msg time="2026-10-16T01:24:14.111578" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:14.111620" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:13.982892" elapsed="0.128763"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:14.112004" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:14.111767" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:14.111750" elapsed="0.000328"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:24:13.982734" elapsed="0.129365"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:14.114730" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:14.114626" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:14.114609" elapsed="0.000185"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:14.115921" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:14.115806" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:14.115790" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:14.116392" level="INFO">${karaf_connection_index} = 388</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:24:14.116163" elapsed="0.000255"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:14.116781" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:24:14.116578" elapsed="0.000228"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:24:14.151318" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:24:14.117392" elapsed="0.034101"/>
</kw>
<msg time="2026-10-16T01:24:14.151673" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:24:14.151823" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:14.116975" elapsed="0.034903"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:24:14.242719" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:14.152479" elapsed="0.090436"/>
</kw>
<msg time="2026-10-16T01:24:14.243070" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:24:14.243111" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:14.152047" elapsed="0.091099"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:14.243418" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:14.243216" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:14.243199" elapsed="0.000317"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:14.244069" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:14.243692" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:14.244407" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:14.244213" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:14.244196" elapsed="0.000302"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:24:14.244529" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:14.247001" elapsed="0.000469"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:24:14.248676" elapsed="0.000499"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:14.250499" elapsed="0.000545"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:24:14.245322" elapsed="0.005788"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:24:14.244818" elapsed="0.006408"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:24:14.115524" elapsed="0.135779"/>
</kw>
<msg time="2026-10-16T01:24:14.251385" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:14.251423" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:14.114953" elapsed="0.136505"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:24:14.251609" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:24:14.251526" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:14.251509" elapsed="0.000176"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:24:14.252040" 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-10-16T01:24:14.252409" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:24:14.252475" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:24:14.114323" elapsed="0.138237"/>
</kw>
<msg time="2026-10-16T01:24:14.252643" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:14.252682" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:14.112347" elapsed="0.140460"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:14.253113" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:14.252893" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:14.252861" elapsed="0.000323"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:24:14.112212" elapsed="0.140994"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:14.258285" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:14.258197" elapsed="0.000131"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:14.258179" elapsed="0.000170"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:14.259450" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:14.259366" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:14.259349" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:14.259926" 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-10-16T01:24:14.259655" elapsed="0.000297"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:14.260294" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:24:14.260112" elapsed="0.000207"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:24:14.295775" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:24:14.260915" elapsed="0.035093"/>
</kw>
<msg time="2026-10-16T01:24:14.296167" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:24:14.296208" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:14.260471" elapsed="0.035773"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:24:14.377953" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:14.296849" elapsed="0.081295"/>
</kw>
<msg time="2026-10-16T01:24:14.378302" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:24:14.378343" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:14.296410" elapsed="0.081969"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:14.378654" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:14.378449" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:14.378431" elapsed="0.000346"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:14.379312" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:14.378973" elapsed="0.000423"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:14.379651" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:14.379455" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:14.379439" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:24:14.379799" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:14.382362" 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-10-16T01:24:14.384129" elapsed="0.000460"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:14.386023" elapsed="0.000308"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:24:14.380612" elapsed="0.005785"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:24:14.380118" elapsed="0.006396"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:24:14.259111" elapsed="0.127481"/>
</kw>
<msg time="2026-10-16T01:24:14.386674" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:14.386732" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:14.258497" elapsed="0.128273"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:24:14.386938" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:24:14.386838" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:14.386821" elapsed="0.000196"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:24:14.387327" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:14.387624" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:24:14.387688" elapsed="0.000113"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:24:14.257897" elapsed="0.129996"/>
</kw>
<msg time="2026-10-16T01:24:14.387978" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:14.388018" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:14.253447" elapsed="0.134607"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:14.388336" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:14.388120" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:14.388104" elapsed="0.000304"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:24:14.253313" elapsed="0.135117"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:24:13.982563" elapsed="0.405894"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:24:13.980474" elapsed="0.408041"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:24:13.978434" elapsed="0.410130"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:13.978038" elapsed="0.410566"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:24:13.977018" elapsed="0.411633"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:14.392295" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:14.392062" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:14.392044" elapsed="0.000325"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:14.392691" 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-10-16T01:24:14.392801" 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-10-16T01:24:14.392561" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:14.393314" 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.104" 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-10-16T01:24:14.393027" elapsed="0.000365"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:14.393902" level="INFO">${conn_id} = 540</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-10-16T01:24:14.393569" elapsed="0.000359"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:24:14.394740" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:24:14.394810" 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-10-16T01:24:14.394468" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:14.394994" elapsed="0.000282"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:24:14.396063" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:24:14.716503" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:24:00 UTC 2026

  System load:  0.01               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:24:13 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:24:14.395808" elapsed="0.320785"/>
</kw>
<msg time="2026-10-16T01:24:14.716650" 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-10-16T01:24:14.395436" elapsed="0.321295"/>
</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-10-16T01:24:14.394119" elapsed="0.322695"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:24:14.717201" level="INFO">Executing command 'sudo ovs-vsctl add-port br-s1 vport1 -- add-port br-s1 vport2'.</msg>
<msg time="2026-10-16T01:24:14.739830" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:24:14.739955" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:24:14.739996" 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-10-16T01:24:14.717039" elapsed="0.022981"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:14.740176" elapsed="0.000237"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:14.740905" 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-10-16T01:24:14.740624" elapsed="0.000325"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:24:14.741113" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:14.741015" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:14.740996" elapsed="0.000183"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:24:14.741307" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:24:14.741227" elapsed="0.000135"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:14.741213" elapsed="0.000171"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:24:14.741414" elapsed="0.000012"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:14.742114" elapsed="0.000275"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:24:14.742570" elapsed="0.000154"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:14.742878" elapsed="0.000090"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:24:14.741713" elapsed="0.001302"/>
</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-10-16T01:24:14.391605" elapsed="0.351477"/>
</kw>
<msg time="2026-10-16T01:24:14.743127" 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-10-16T01:24:14.391098" elapsed="0.352109"/>
</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-10-16T01:24:14.390647" elapsed="0.352631"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:24:14.743810" 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-10-16T01:24:14.743474" elapsed="0.000361"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:24:14.744390" 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-10-16T01:24:14.744083" elapsed="0.000332"/>
</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-10-16T01:24:14.748915" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:24:14.748558" elapsed="0.000383"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:14.749733" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:14.749437" elapsed="0.000322"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:24:14.749800" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:24:14.749947" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:24:14.748209" elapsed="0.001761"/>
</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-10-16T01:24:14.752595" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:24:14.752324" elapsed="0.000295"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:24:14.752660" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:24:14.752800" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:24:14.752004" elapsed="0.000818"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:14.753997" 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-10-16T01:24:14.753758" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:14.754443" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:14.754226" elapsed="0.000258"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:24:14.760622" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:24:14.760677" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:24:14.760817" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:24:14.754784" elapsed="0.006478">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:24:14.754543" elapsed="0.006799">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:14.761525" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:14.761373" elapsed="0.000211"/>
</branch>
<status status="FAIL" start="2026-10-16T01:24:14.754526" elapsed="0.007082">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:14.761994" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:14.762150" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:14.762083" elapsed="0.000108"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:24:14.762066" elapsed="0.000146"/>
</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-10-16T01:24:14.762351" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:24:14.762415" 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-10-16T01:24:14.753142" elapsed="0.009376">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:14.762575" 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-10-16T01:24:14.751553" elapsed="0.011106">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:14.762901" elapsed="0.000023"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:24:14.750142" elapsed="0.012831">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:24:14.750021" elapsed="0.013004">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:24:14.747721" elapsed="0.015387">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:15.772358" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:24:15.771499" elapsed="0.000921"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:15.773446" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:15.772799" elapsed="0.000703"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:24:15.773598" elapsed="0.000067"/>
</return>
<msg time="2026-10-16T01:24:15.773955" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:24:15.770638" elapsed="0.003370"/>
</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-10-16T01:24:15.779949" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:24:15.779276" elapsed="0.000730"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:24:15.780101" elapsed="0.000057"/>
</return>
<msg time="2026-10-16T01:24:15.780375" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:24:15.778505" elapsed="0.001923"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:15.783170" 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-10-16T01:24:15.782573" elapsed="0.000693"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:15.784238" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:15.783686" elapsed="0.000643"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:24:15.790479" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:24:15.790591" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:24:15.790840" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:24:15.785042" elapsed="0.006565">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:24:15.784468" elapsed="0.007460">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:15.792344" elapsed="0.000493"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:15.792004" elapsed="0.000959"/>
</branch>
<status status="FAIL" start="2026-10-16T01:24:15.784430" elapsed="0.008603">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:15.793869" elapsed="0.000057"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:15.794159" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:15.794085" elapsed="0.000159"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:24:15.794048" 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-10-16T01:24:15.794596" elapsed="0.000043"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:24:15.794768" 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-10-16T01:24:15.781149" elapsed="0.013864">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:15.795138" 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-10-16T01:24:15.777530" elapsed="0.017800">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:15.795819" elapsed="0.000070"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:24:15.774367" elapsed="0.021632">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:24:15.774118" elapsed="0.021995">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:24:15.769464" elapsed="0.026832">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:16.806877" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:24:16.805805" elapsed="0.001147"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:16.808014" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:16.807322" elapsed="0.000748"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:24:16.808182" elapsed="0.000094"/>
</return>
<msg time="2026-10-16T01:24:16.808525" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:24:16.804916" elapsed="0.003660"/>
</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-10-16T01:24:16.814573" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:24:16.813966" elapsed="0.000662"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:24:16.814752" elapsed="0.000059"/>
</return>
<msg time="2026-10-16T01:24:16.815047" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:24:16.813197" elapsed="0.001901"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:16.817829" 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-10-16T01:24:16.817274" elapsed="0.000672"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:16.818913" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:16.818369" elapsed="0.000635"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:24:16.826305" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:24:16.826426" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:24:16.826677" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:24:16.819927" elapsed="0.007701">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:24:16.819341" elapsed="0.008524">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:16.828287" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:16.827944" elapsed="0.000473"/>
</branch>
<status status="FAIL" start="2026-10-16T01:24:16.819292" elapsed="0.009179">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:16.829766" elapsed="0.000058"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:16.830068" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:16.829994" elapsed="0.000159"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:24:16.829957" 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-10-16T01:24:16.830511" elapsed="0.000044"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:24:16.830649" elapsed="0.000031"/>
</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-10-16T01:24:16.815851" elapsed="0.015074">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:16.831049" 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-10-16T01:24:16.812224" elapsed="0.019016">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:16.831739" elapsed="0.000052"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:24:16.809038" elapsed="0.022887">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:24:16.808735" elapsed="0.023309">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:24:16.803357" elapsed="0.028878">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:17.842522" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:24:17.841481" elapsed="0.001116"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:17.843672" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:17.843030" elapsed="0.000728"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:24:17.843885" elapsed="0.000095"/>
</return>
<msg time="2026-10-16T01:24:17.844236" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:24:17.840582" elapsed="0.003706"/>
</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-10-16T01:24:17.850518" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:24:17.849897" elapsed="0.000677"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:24:17.850671" elapsed="0.000091"/>
</return>
<msg time="2026-10-16T01:24:17.851011" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:24:17.849116" elapsed="0.001946"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:17.853844" 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-10-16T01:24:17.853275" elapsed="0.000668"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:17.854905" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:17.854362" 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-10-16T01:24:17.862461" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:24:17.862582" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:24:17.862911" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:24:17.855770" elapsed="0.008083">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:24:17.855152" elapsed="0.008883">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:17.864453" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:17.864114" elapsed="0.000471"/>
</branch>
<status status="FAIL" start="2026-10-16T01:24:17.855108" elapsed="0.009527">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:17.865464" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:17.865763" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:17.865658" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:24:17.865623" 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-10-16T01:24:17.866226" elapsed="0.000044"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:24:17.866365" elapsed="0.000031"/>
</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-10-16T01:24:17.851838" elapsed="0.014742">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:17.866728" 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-10-16T01:24:17.848116" elapsed="0.018835">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:17.867878" elapsed="0.000054"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:24:17.844935" elapsed="0.023108">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:24:17.844581" elapsed="0.023583">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:24:17.839153" elapsed="0.029201">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:18.879595" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:24:18.878535" elapsed="0.001134"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:18.880777" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:18.880105" elapsed="0.000754"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:24:18.880965" elapsed="0.000091"/>
</return>
<msg time="2026-10-16T01:24:18.881304" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:24:18.877605" elapsed="0.003752"/>
</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-10-16T01:24:18.887375" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:24:18.886738" elapsed="0.000694"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:24:18.887529" elapsed="0.000057"/>
</return>
<msg time="2026-10-16T01:24:18.887870" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:24:18.885992" elapsed="0.001933"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:18.890607" 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-10-16T01:24:18.890092" elapsed="0.000639"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:18.891661" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:18.891176" elapsed="0.000670"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:24:18.898634" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:24:18.898839" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:24:18.899101" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:24:18.892541" elapsed="0.007537">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:24:18.892015" elapsed="0.008244">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:18.900727" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:18.900335" elapsed="0.000572"/>
</branch>
<status status="FAIL" start="2026-10-16T01:24:18.891971" elapsed="0.008987">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:18.902399" elapsed="0.000056"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:18.902670" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:18.902598" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:24:18.902562" 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-10-16T01:24:18.903268" elapsed="0.000046"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:24:18.903409" elapsed="0.000031"/>
</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-10-16T01:24:18.888620" elapsed="0.015005">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:18.903927" 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-10-16T01:24:18.885016" elapsed="0.019114">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:18.904593" elapsed="0.000048"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:24:18.881791" elapsed="0.022988">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:24:18.881484" elapsed="0.023441">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:24:18.876027" elapsed="0.029088">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:19.917058" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:24:19.916022" elapsed="0.001114"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:19.918195" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:19.917506" elapsed="0.000744"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:24:19.918354" elapsed="0.000092"/>
</return>
<msg time="2026-10-16T01:24:19.918695" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:24:19.915139" elapsed="0.003641"/>
</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-10-16T01:24:19.924934" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:24:19.924277" elapsed="0.000722"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:24:19.925093" elapsed="0.000055"/>
</return>
<msg time="2026-10-16T01:24:19.925361" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:24:19.923515" elapsed="0.001896"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:19.928364" 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-10-16T01:24:19.927849" elapsed="0.000610"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:19.929427" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:19.928933" elapsed="0.000586"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:24:19.936930" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:24:19.937071" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:24:19.937373" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:24:19.930383" elapsed="0.007911">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:24:19.929673" elapsed="0.008797">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:19.938953" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:19.938545" elapsed="0.000542"/>
</branch>
<status status="FAIL" start="2026-10-16T01:24:19.929630" elapsed="0.009508">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:19.939944" elapsed="0.000189"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:19.940360" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:19.940286" elapsed="0.000157"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:24:19.940249" elapsed="0.000239"/>
</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-10-16T01:24:19.940846" elapsed="0.000045"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:24:19.940990" elapsed="0.000030"/>
</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-10-16T01:24:19.926376" elapsed="0.014827">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:19.941323" 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-10-16T01:24:19.922544" elapsed="0.018968">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:19.942098" elapsed="0.000051"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:24:19.919208" elapsed="0.023049">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:24:19.918932" elapsed="0.023443">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:24:19.913626" elapsed="0.028936">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<msg time="2026-10-16T01:24:19.942812" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<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="FAIL" start="2026-10-16T01:24:14.744619" elapsed="5.198400">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${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="NOT RUN" start="2026-10-16T01:24:19.943538" elapsed="0.000044"/>
</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="FAIL" start="2026-10-16T01:24:14.390279" elapsed="5.553558">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:24:13.976409" elapsed="5.967748">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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-10-16T01:24:19.948780" elapsed="0.000494"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:24:19.948163" elapsed="0.001226"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:19.951479" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:19.951284" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:19.951246" elapsed="0.000377"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:19.955919" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:19.955678" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:19.955642" elapsed="0.000419"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:24:19.958171" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:24:19.957398" elapsed="0.000830"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:19.959264" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:19.958587" elapsed="0.000733"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:24:19.959501" elapsed="0.000059"/>
</return>
<msg time="2026-10-16T01:24:19.959729" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:24:19.956503" elapsed="0.003260"/>
</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-10-16T01:24:19.963433" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:19.963293" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:19.963261" elapsed="0.000287"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:19.965330" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:19.965210" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:19.965187" elapsed="0.000234"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:19.966060" level="INFO">${karaf_connection_index} = 386</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:24:19.965623" elapsed="0.000473"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:19.966593" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:24:19.966323" elapsed="0.000304"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:24:19.999133" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:24:19.967522" elapsed="0.031792"/>
</kw>
<msg time="2026-10-16T01:24:19.999497" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:24:19.999539" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:19.966914" elapsed="0.032661"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:24:20.074993" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:20.000350" elapsed="0.074976"/>
</kw>
<msg time="2026-10-16T01:24:20.075586" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:24:20.075629" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:19.999764" elapsed="0.075913"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:20.076273" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:20.075866" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:20.075819" elapsed="0.000587"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:20.077165" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:20.076632" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:20.077516" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:20.077317" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:20.077300" elapsed="0.000310"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:24:20.077648" elapsed="0.000066"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:20.080494" 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-10-16T01:24:20.082284" elapsed="0.000596"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:20.084214" 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-10-16T01:24:20.078672" elapsed="0.005930"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:24:20.078091" elapsed="0.006646"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:24:19.964839" elapsed="0.120102"/>
</kw>
<msg time="2026-10-16T01:24:20.085030" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:20.085072" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:19.963843" elapsed="0.121265"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:24:20.085264" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:24:20.085180" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:20.085163" elapsed="0.000181"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:24:20.085689" elapsed="0.000131"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:20.086117" elapsed="0.000037"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:24:20.086197" 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-10-16T01:24:19.962865" elapsed="0.123420"/>
</kw>
<msg time="2026-10-16T01:24:20.086397" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:20.086439" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:19.960231" elapsed="0.126244"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:20.086807" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:20.086558" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:20.086541" elapsed="0.000340"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:24:19.960038" elapsed="0.126866"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:20.089434" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:20.089348" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:20.089331" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:20.090598" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:20.090512" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:20.090494" elapsed="0.000168"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:20.091079" level="INFO">${karaf_connection_index} = 388</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:24:20.090839" elapsed="0.000264"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:20.091461" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:24:20.091265" elapsed="0.000220"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:24:20.124338" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:24:20.092086" elapsed="0.032441"/>
</kw>
<msg time="2026-10-16T01:24:20.124681" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:24:20.124741" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:20.091636" elapsed="0.033140"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:24:20.204160" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:20.125382" elapsed="0.078970"/>
</kw>
<msg time="2026-10-16T01:24:20.204514" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:24:20.204557" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:20.124951" elapsed="0.079641"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:20.204967" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:20.204724" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:20.204682" elapsed="0.000388"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:20.205638" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:20.205265" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:20.206036" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:20.205832" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:20.205814" elapsed="0.000319"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:24:20.206165" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:20.208942" 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-10-16T01:24:20.210690" elapsed="0.000513"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:20.212611" 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-10-16T01:24:20.207183" elapsed="0.005876"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:24:20.206607" elapsed="0.006571"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:24:20.090251" elapsed="0.123006"/>
</kw>
<msg time="2026-10-16T01:24:20.213342" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:20.213381" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:20.089639" elapsed="0.123777"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:24:20.213575" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:24:20.213486" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:20.213469" elapsed="0.000183"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:24:20.214070" 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-10-16T01:24:20.214372" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:24:20.214442" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:24:20.089045" elapsed="0.125482"/>
</kw>
<msg time="2026-10-16T01:24:20.214611" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:20.214651" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:20.087180" elapsed="0.127506"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:20.215028" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:20.214785" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:20.214768" elapsed="0.000333"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:24:20.087039" elapsed="0.128084"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:20.217577" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:20.217493" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:20.217476" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:20.218753" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:20.218639" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:20.218623" elapsed="0.000219"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:20.219218" 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-10-16T01:24:20.218985" elapsed="0.000290"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:20.219623" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:24:20.219438" elapsed="0.000210"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:24:20.251109" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:24:20.220273" elapsed="0.031058"/>
</kw>
<msg time="2026-10-16T01:24:20.251517" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:24:20.251560" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:20.219848" elapsed="0.031747"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:24:20.335544" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:20.252327" elapsed="0.083432"/>
</kw>
<msg time="2026-10-16T01:24:20.335948" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:24:20.335991" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:20.251845" elapsed="0.084181"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:20.336348" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:20.336114" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:20.336087" elapsed="0.000359"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:20.337035" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:20.336628" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:20.337380" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:20.337185" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:20.337168" elapsed="0.000305"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:24:20.337506" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:20.340192" 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-10-16T01:24:20.341976" elapsed="0.000679"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:20.343920" 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-10-16T01:24:20.338381" elapsed="0.005925"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:24:20.337859" elapsed="0.006566"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:24:20.218384" elapsed="0.126119"/>
</kw>
<msg time="2026-10-16T01:24:20.344584" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:20.344624" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:20.217814" elapsed="0.126845"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:24:20.344877" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:24:20.344773" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:20.344752" 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-10-16T01:24:20.345283" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:20.345583" elapsed="0.000088"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:24:20.345859" 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-10-16T01:24:20.217199" elapsed="0.128751"/>
</kw>
<msg time="2026-10-16T01:24:20.346035" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:20.346074" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:20.215369" elapsed="0.130740"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:20.346393" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:20.346175" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:20.346159" elapsed="0.000305"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:24:20.215232" elapsed="0.131253"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:24:19.959842" elapsed="0.386675"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:24:19.955028" elapsed="0.391549"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:24:19.950662" elapsed="0.395973"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:19.949751" elapsed="0.396934"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:24:19.946636" elapsed="0.400123"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:20.350277" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:20.350047" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:20.350030" elapsed="0.000322"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:20.350686" 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-10-16T01:24:20.350991" 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-10-16T01:24:20.350546" elapsed="0.000470"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:20.351489" level="INFO">Attempting to execute command "sudo ovs-vsctl del-br br-s1" on remote system "10.30.171.104" 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-10-16T01:24:20.351203" elapsed="0.000328"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:20.352052" level="INFO">${conn_id} = 545</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-10-16T01:24:20.351719" elapsed="0.000357"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:24:20.352942" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:24:20.353011" 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-10-16T01:24:20.352625" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:20.353181" elapsed="0.000284"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:24:20.354259" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:24:20.747841" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:24:00 UTC 2026

  System load:  0.01               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:24:14 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:24:20.354023" elapsed="0.393936"/>
</kw>
<msg time="2026-10-16T01:24:20.748032" 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-10-16T01:24:20.353623" elapsed="0.394544"/>
</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-10-16T01:24:20.352271" elapsed="0.395990"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:24:20.748738" level="INFO">Executing command 'sudo ovs-vsctl del-br br-s1'.</msg>
<msg time="2026-10-16T01:24:20.812436" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:24:20.812668" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:24:20.812826" 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-10-16T01:24:20.748512" elapsed="0.064367"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:20.813223" elapsed="0.000440"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:20.814815" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:20.814201" elapsed="0.000703"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:24:20.815299" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:20.815060" elapsed="0.000347"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:20.815013" elapsed="0.000445"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:24:20.815802" elapsed="0.000056"/>
</return>
<status status="PASS" start="2026-10-16T01:24:20.815566" elapsed="0.000362"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:20.815535" elapsed="0.000443"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:24:20.816045" elapsed="0.000028"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:20.817619" elapsed="0.000693"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:24:20.818769" elapsed="0.000338"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:20.819419" elapsed="0.000195"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:24:20.816679" elapsed="0.003070"/>
</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-10-16T01:24:20.349569" elapsed="0.470356"/>
</kw>
<msg time="2026-10-16T01:24:20.820027" 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-10-16T01:24:20.349049" elapsed="0.471074"/>
</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-10-16T01:24:20.348587" elapsed="0.471687"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:24:20.821400" 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-10-16T01:24:20.820725" elapsed="0.000728"/>
</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-10-16T01:24:20.828979" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:24:20.828193" elapsed="0.000843"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:20.830031" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:20.829371" elapsed="0.000713"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:24:20.830176" elapsed="0.000059"/>
</return>
<msg time="2026-10-16T01:24:20.830459" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:24:20.827303" elapsed="0.003206"/>
</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-10-16T01:24:20.836508" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:24:20.835901" elapsed="0.000663"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:24:20.836654" elapsed="0.000088"/>
</return>
<msg time="2026-10-16T01:24:20.836983" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:24:20.835093" elapsed="0.001941"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:20.839668" 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-10-16T01:24:20.839170" elapsed="0.000721"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:20.840853" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:20.840312" elapsed="0.000634"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:24:20.846929" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:24:20.847005" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:24:20.847172" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:20.841994" elapsed="0.005961">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:24:20.841081" elapsed="0.007042">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:20.848528" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:20.848193" elapsed="0.000465"/>
</branch>
<status status="FAIL" start="2026-10-16T01:24:20.841045" elapsed="0.007697">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:20.849528" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:20.849906" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:20.849754" elapsed="0.000240"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:24:20.849687" elapsed="0.000353"/>
</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-10-16T01:24:20.850352" elapsed="0.000042"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:24:20.850492" 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-10-16T01:24:20.837735" elapsed="0.013007">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:20.850891" 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-10-16T01:24:20.834131" elapsed="0.016952">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:20.851544" elapsed="0.000053"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:24:20.830952" elapsed="0.020782">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:24:20.830622" elapsed="0.021278">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:24:20.826200" elapsed="0.025884">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:21.859010" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:24:21.858123" elapsed="0.000953"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:21.860090" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:21.859420" elapsed="0.000724"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:24:21.860239" elapsed="0.000070"/>
</return>
<msg time="2026-10-16T01:24:21.860665" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:24:21.857260" elapsed="0.003489"/>
</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-10-16T01:24:21.867106" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:24:21.866145" elapsed="0.001018"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:24:21.867261" elapsed="0.000060"/>
</return>
<msg time="2026-10-16T01:24:21.867537" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:24:21.865360" elapsed="0.002227"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:21.870341" 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-10-16T01:24:21.869823" elapsed="0.000613"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:21.871400" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:21.870904" elapsed="0.000587"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:24:21.878640" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:24:21.878825" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:24:21.879051" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:21.872330" elapsed="0.007602">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:24:21.871637" elapsed="0.008463">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:21.880516" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:21.880173" elapsed="0.000471"/>
</branch>
<status status="FAIL" start="2026-10-16T01:24:21.871596" elapsed="0.009098">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:21.881553" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:21.881922" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:21.881846" elapsed="0.000162"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:24:21.881805" 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-10-16T01:24:21.882363" elapsed="0.000044"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:24:21.882503" elapsed="0.000030"/>
</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-10-16T01:24:21.868323" elapsed="0.014425">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:21.882895" 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-10-16T01:24:21.864387" elapsed="0.018699">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:21.883544" elapsed="0.000049"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:24:21.861156" elapsed="0.022541">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:24:21.860892" elapsed="0.023054">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:24:21.856033" elapsed="0.028107">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:22.892166" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:24:22.891151" elapsed="0.001089"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:22.893304" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:22.892619" elapsed="0.000740"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:24:22.893461" elapsed="0.000091"/>
</return>
<msg time="2026-10-16T01:24:22.893856" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:24:22.890262" elapsed="0.003648"/>
</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-10-16T01:24:22.899942" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:24:22.899279" elapsed="0.000720"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:24:22.900094" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:24:22.900368" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:24:22.898508" elapsed="0.001912"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:22.903162" 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-10-16T01:24:22.902591" elapsed="0.000667"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:22.904265" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:22.903756" elapsed="0.000599"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:24:22.911263" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:24:22.911385" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:24:22.911628" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:22.905087" elapsed="0.007472">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:24:22.904510" elapsed="0.008281">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:22.913215" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:22.912875" elapsed="0.000470"/>
</branch>
<status status="FAIL" start="2026-10-16T01:24:22.904466" elapsed="0.008931">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:22.914670" elapsed="0.000085"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:22.914993" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:22.914919" elapsed="0.000158"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:24:22.914883" 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-10-16T01:24:22.915432" elapsed="0.000043"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:24:22.915682" elapsed="0.000067"/>
</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-10-16T01:24:22.901174" elapsed="0.014788">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:22.916082" 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-10-16T01:24:22.897533" elapsed="0.018739">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:22.916783" elapsed="0.000053"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:24:22.894311" elapsed="0.022633">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:24:22.894038" elapsed="0.023027">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:24:22.888687" elapsed="0.028567">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:23.924219" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:24:23.923309" elapsed="0.000975"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:23.925311" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:23.924633" elapsed="0.000733"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:24:23.925462" elapsed="0.000072"/>
</return>
<msg time="2026-10-16T01:24:23.925828" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:24:23.922392" elapsed="0.003492"/>
</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-10-16T01:24:23.931942" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:24:23.931270" elapsed="0.000728"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:24:23.932092" elapsed="0.000059"/>
</return>
<msg time="2026-10-16T01:24:23.932366" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:24:23.930498" elapsed="0.001919"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:23.935215" 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-10-16T01:24:23.934628" elapsed="0.000682"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:23.936270" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:23.935781" elapsed="0.000580"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:24:23.943256" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:24:23.943371" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:24:23.943589" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:23.937075" elapsed="0.007427">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:24:23.936504" elapsed="0.008184">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:23.945282" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:23.944938" elapsed="0.000477"/>
</branch>
<status status="FAIL" start="2026-10-16T01:24:23.936463" elapsed="0.009002">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:23.946276" elapsed="0.000052"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:23.946542" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:23.946469" elapsed="0.000157"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:24:23.946433" 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-10-16T01:24:23.947029" elapsed="0.000044"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:24:23.947172" elapsed="0.000030"/>
</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-10-16T01:24:23.933174" elapsed="0.014214">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:23.947508" 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-10-16T01:24:23.929519" elapsed="0.018210">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:23.948633" elapsed="0.000053"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:24:23.926260" elapsed="0.022590">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:24:23.926001" elapsed="0.022988">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:24:23.921166" elapsed="0.028014">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:24.958941" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:24:24.957269" elapsed="0.001746"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:24.960112" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:24.959413" elapsed="0.000756"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:24:24.960271" elapsed="0.000085"/>
</return>
<msg time="2026-10-16T01:24:24.960596" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:24:24.956372" elapsed="0.004276"/>
</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-10-16T01:24:24.966666" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:24:24.966052" elapsed="0.000722"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:24:24.966873" elapsed="0.000060"/>
</return>
<msg time="2026-10-16T01:24:24.967153" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:24:24.965284" elapsed="0.001921"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:24.969936" 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-10-16T01:24:24.969365" elapsed="0.000669"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:24.971000" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:24.970451" elapsed="0.000641"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:24:24.978069" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:24:24.979684" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:24:24.979995" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:24.971806" elapsed="0.009116">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:24:24.971239" elapsed="0.009862">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:24.981563" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:24.981182" elapsed="0.000550"/>
</branch>
<status status="FAIL" start="2026-10-16T01:24:24.971198" elapsed="0.010617">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:24.982634" elapsed="0.000054"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:24.982969" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:24.982889" elapsed="0.000173"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:24:24.982849" 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-10-16T01:24:24.983423" elapsed="0.000044"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:24:24.983568" 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-10-16T01:24:24.967955" elapsed="0.015893">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:24.983978" 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-10-16T01:24:24.964305" elapsed="0.019870">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:24.984652" elapsed="0.000101"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:24:24.961090" elapsed="0.023780">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:24:24.960821" elapsed="0.024171">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:24:24.954277" elapsed="0.030908">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:25.993161" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:24:25.992182" elapsed="0.001062"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:25.994369" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:25.993686" elapsed="0.000739"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:24:25.994522" elapsed="0.000075"/>
</return>
<msg time="2026-10-16T01:24:25.994892" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:24:25.991298" elapsed="0.003648"/>
</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-10-16T01:24:26.001554" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:24:26.000946" elapsed="0.000665"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:24:26.001909" elapsed="0.000064"/>
</return>
<msg time="2026-10-16T01:24:26.002198" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:24:26.000173" elapsed="0.002078"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:26.004979" 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-10-16T01:24:26.004413" elapsed="0.000663"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:26.006205" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:26.005523" elapsed="0.000776"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:24:26.013310" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:24:26.013414" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:24:26.013639" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:26.007086" elapsed="0.007463">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:24:26.006444" elapsed="0.008337">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:26.015212" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:26.014860" elapsed="0.000485"/>
</branch>
<status status="FAIL" start="2026-10-16T01:24:26.006405" elapsed="0.008991">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:26.016210" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:26.016481" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:26.016407" elapsed="0.000158"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:24:26.016372" 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-10-16T01:24:26.016966" elapsed="0.000045"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:24:26.017109" elapsed="0.000030"/>
</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-10-16T01:24:26.002984" elapsed="0.014340">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:26.017444" elapsed="0.000031"/>
</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-10-16T01:24:25.998987" elapsed="0.018645">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:26.018146" elapsed="0.000050"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:24:25.995312" elapsed="0.022989">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:24:25.995059" elapsed="0.023355">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:24:25.990018" elapsed="0.028580">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<msg time="2026-10-16T01:24:26.018845" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</msg>
<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="FAIL" start="2026-10-16T01:24:20.822050" elapsed="5.197078">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<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-10-16T01:24:20.348217" elapsed="5.671136">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<doc>Delete bridge with OVS command and verify it gets deleted from all instances.</doc>
<status status="FAIL" start="2026-10-16T01:24:19.945081" elapsed="6.075303">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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-10-16T01:24:26.024215" elapsed="0.000565"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:24:26.022978" elapsed="0.001924"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:26.027038" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:26.026828" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:26.026786" elapsed="0.000397"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:26.031560" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:26.031374" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:26.031336" elapsed="0.000469"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:24:26.033894" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:24:26.033103" elapsed="0.000849"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:26.034943" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:26.034282" elapsed="0.000715"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:24:26.035091" elapsed="0.000060"/>
</return>
<msg time="2026-10-16T01:24:26.035376" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:24:26.032259" elapsed="0.003168"/>
</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-10-16T01:24:26.040075" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:26.039956" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:26.039932" 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-10-16T01:24:26.041798" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:26.041634" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:26.041611" elapsed="0.000275"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:26.042415" level="INFO">${karaf_connection_index} = 386</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:24:26.042089" elapsed="0.000361"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:26.042998" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:24:26.042678" elapsed="0.000354"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:24:26.075015" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:24:26.043904" elapsed="0.031374"/>
</kw>
<msg time="2026-10-16T01:24:26.075500" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:24:26.075558" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:26.043257" elapsed="0.032350"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:24:26.140071" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:26.076478" elapsed="0.063826"/>
</kw>
<msg time="2026-10-16T01:24:26.141170" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:24:26.141218" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:26.075881" elapsed="0.065375"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:26.142354" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:26.141934" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:26.141885" elapsed="0.000592"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:26.143888" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:26.142665" elapsed="0.001335"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:26.144682" elapsed="0.000062"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:26.144067" elapsed="0.000743"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:26.144049" elapsed="0.000786"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:24:26.144873" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:26.147770" 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-10-16T01:24:26.149628" elapsed="0.000603"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:26.151713" 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-10-16T01:24:26.145914" elapsed="0.006234"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:24:26.145281" elapsed="0.006986"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:24:26.041274" elapsed="0.111071"/>
</kw>
<msg time="2026-10-16T01:24:26.152437" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:26.152479" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:26.040369" elapsed="0.112146"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:24:26.152669" elapsed="0.000117"/>
</return>
<status status="PASS" start="2026-10-16T01:24:26.152584" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:26.152568" elapsed="0.000279"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:24:26.153199" 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-10-16T01:24:26.153514" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:24:26.153586" 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-10-16T01:24:26.039518" elapsed="0.114174"/>
</kw>
<msg time="2026-10-16T01:24:26.153828" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:26.153869" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:26.036219" elapsed="0.117688"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:26.154196" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:26.153976" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:26.153959" elapsed="0.000307"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:24:26.035905" elapsed="0.118384"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:26.156970" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:26.156884" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:26.156866" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:26.158265" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:26.158180" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:26.158163" elapsed="0.000165"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:26.158752" level="INFO">${karaf_connection_index} = 388</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:24:26.158472" elapsed="0.000306"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:26.159135" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:24:26.158940" elapsed="0.000219"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:24:26.197121" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:24:26.159771" elapsed="0.037525"/>
</kw>
<msg time="2026-10-16T01:24:26.197467" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:24:26.197509" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:26.159313" elapsed="0.038231"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:24:26.266567" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:26.198298" elapsed="0.068483"/>
</kw>
<msg time="2026-10-16T01:24:26.266936" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:24:26.266977" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:26.197871" elapsed="0.069140"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:26.267278" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:26.267081" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:26.267063" elapsed="0.000306"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:26.267954" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:26.267548" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:26.268284" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:26.268090" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:26.268074" elapsed="0.000302"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:24:26.268406" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:26.271071" elapsed="0.000478"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:24:26.272852" elapsed="0.000449"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:26.274642" 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-10-16T01:24:26.269244" elapsed="0.005801"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:24:26.268748" elapsed="0.006415"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:24:26.157821" elapsed="0.117418"/>
</kw>
<msg time="2026-10-16T01:24:26.275320" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:26.275360" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:26.157179" elapsed="0.118215"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:24:26.275547" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:24:26.275463" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:26.275446" elapsed="0.000183"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:24:26.276005" 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-10-16T01:24:26.276349" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:24:26.276414" 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-10-16T01:24:26.156518" elapsed="0.119981"/>
</kw>
<msg time="2026-10-16T01:24:26.276581" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:26.276620" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:26.154560" elapsed="0.122094"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:26.276998" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:26.276780" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:26.276763" elapsed="0.000306"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:24:26.154418" elapsed="0.122672"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:26.279535" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:26.279452" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:26.279435" elapsed="0.000162"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:26.280978" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:26.280891" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:26.280873" elapsed="0.000168"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:26.281443" 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-10-16T01:24:26.281182" elapsed="0.000286"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:26.281865" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:24:26.281631" elapsed="0.000258"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:24:26.312393" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:24:26.282462" elapsed="0.030135"/>
</kw>
<msg time="2026-10-16T01:24:26.312793" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:24:26.312835" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:26.282042" elapsed="0.030827"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:24:26.376659" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:26.313457" elapsed="0.063436"/>
</kw>
<msg time="2026-10-16T01:24:26.377051" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:24:26.377092" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:26.313033" elapsed="0.064093"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:26.377403" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:26.377197" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:26.377178" elapsed="0.000318"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:26.378036" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:26.377673" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:26.378367" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:26.378172" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:26.378156" elapsed="0.000302"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:24:26.378488" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:26.381041" 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-10-16T01:24:26.382787" elapsed="0.000760"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:26.384935" elapsed="0.000307"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:24:26.379359" elapsed="0.005950"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:24:26.378834" elapsed="0.006590"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:24:26.280363" elapsed="0.105137"/>
</kw>
<msg time="2026-10-16T01:24:26.385581" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:26.385625" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:26.279786" elapsed="0.105890"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:24:26.385929" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:24:26.385843" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:26.385816" elapsed="0.000191"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:24:26.386319" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:26.386618" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:24:26.386682" 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-10-16T01:24:26.279162" elapsed="0.107638"/>
</kw>
<msg time="2026-10-16T01:24:26.386883" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:26.386921" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:26.277330" elapsed="0.109625"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:26.387234" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:26.387021" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:26.387005" elapsed="0.000301"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:24:26.277196" elapsed="0.110130"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:24:26.035534" elapsed="0.351820"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:24:26.030668" elapsed="0.356743"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:24:26.026199" elapsed="0.361263"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:26.025245" elapsed="0.362261"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:24:26.022132" elapsed="0.365429"/>
</kw>
<kw name="Verify Sample Port Is Modified" owner="ClusterOvsdb">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:24:26.390126" 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-10-16T01:24:26.389785" elapsed="0.000366"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:24:26.394652" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:24:26.393360" elapsed="0.001329">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:24:27.405137" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:24:27.402100" elapsed="0.003147">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:24:28.415084" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:24:28.412060" elapsed="0.003117">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:24:29.426502" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:24:29.423465" elapsed="0.003143">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:24:30.436549" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:24:30.433496" elapsed="0.003162">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:24:31.446782" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:24:31.443738" elapsed="0.003149">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<msg time="2026-10-16T01:24:31.447132" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: Variable '${ovsdb_uuid}' not found.</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-10-16T01:24:26.390359" elapsed="5.057077">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: Variable '${ovsdb_uuid}' not found.</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-10-16T01:24:26.389377" elapsed="5.058381">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: Variable '${ovsdb_uuid}' not found.</status>
</kw>
<doc>Verify modified port exists in all instances.</doc>
<status status="FAIL" start="2026-10-16T01:24:26.021085" elapsed="5.426996">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: Variable '${ovsdb_uuid}' not found.</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-10-16T01:24:31.451256" elapsed="0.000639"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:24:31.450626" elapsed="0.001385"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:31.454322" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:31.454057" elapsed="0.000478"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:31.454006" elapsed="0.000590"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:31.459029" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:31.458840" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:31.458802" elapsed="0.000370"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:24:31.461311" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:24:31.460484" elapsed="0.000887"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:31.462383" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:31.461757" elapsed="0.000681"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:24:31.462528" elapsed="0.000073"/>
</return>
<msg time="2026-10-16T01:24:31.462886" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:24:31.459630" elapsed="0.003309"/>
</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-10-16T01:24:31.469016" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:31.468823" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:31.468783" elapsed="0.000375"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:31.471826" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:31.471575" elapsed="0.000460"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:31.471537" elapsed="0.000550"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:31.473085" level="INFO">${karaf_connection_index} = 386</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:24:31.472431" elapsed="0.000711"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:31.474169" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:24:31.473547" elapsed="0.000686"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:24:31.510330" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:24:31.475995" elapsed="0.034647"/>
</kw>
<msg time="2026-10-16T01:24:31.511005" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:24:31.511067" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:31.474697" elapsed="0.036418"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:24:31.576963" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:31.512181" elapsed="0.065007"/>
</kw>
<msg time="2026-10-16T01:24:31.577354" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:24:31.577396" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:31.511417" elapsed="0.066014"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:31.577866" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:31.577536" elapsed="0.000403"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:31.577503" elapsed="0.000468"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:31.578527" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:31.578156" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:31.578909" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:31.578692" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:31.578673" elapsed="0.000331"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:24:31.579045" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:31.581859" 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-10-16T01:24:31.583638" elapsed="0.000544"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:31.585386" 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-10-16T01:24:31.580047" elapsed="0.005761"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:24:31.579450" elapsed="0.006476"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:24:31.471001" elapsed="0.115005"/>
</kw>
<msg time="2026-10-16T01:24:31.586097" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:31.586138" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:31.469487" elapsed="0.116701"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:24:31.586347" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:24:31.586260" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:31.586243" elapsed="0.000183"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:24:31.586836" 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-10-16T01:24:31.587265" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:24:31.587330" 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-10-16T01:24:31.468112" elapsed="0.119311"/>
</kw>
<msg time="2026-10-16T01:24:31.587516" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:31.587558" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:31.463782" elapsed="0.123811"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:31.588060" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:31.587681" elapsed="0.000430"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:31.587648" elapsed="0.000485"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:24:31.463386" elapsed="0.124770"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:31.593779" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:31.593655" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:31.593637" 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-10-16T01:24:31.594950" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:31.594864" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:31.594847" elapsed="0.000167"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:31.595393" level="INFO">${karaf_connection_index} = 388</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:24:31.595156" elapsed="0.000262"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:31.595802" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:24:31.595579" elapsed="0.000247"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:24:31.635460" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:24:31.596389" elapsed="0.039245"/>
</kw>
<msg time="2026-10-16T01:24:31.635882" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:24:31.635923" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:31.595978" elapsed="0.039979"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:24:31.721925" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:31.636545" elapsed="0.085641"/>
</kw>
<msg time="2026-10-16T01:24:31.722396" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:24:31.722440" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:31.636120" elapsed="0.086354"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:31.722956" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:31.722589" elapsed="0.000445"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:31.722552" elapsed="0.000514"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:31.723718" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:31.723256" elapsed="0.000548"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:31.724070" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:31.723865" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:31.723849" elapsed="0.000315"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:24:31.724198" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:31.727092" elapsed="0.000495"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:24:31.728966" elapsed="0.000511"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:31.730759" 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-10-16T01:24:31.725279" elapsed="0.005892"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:24:31.724688" elapsed="0.006607"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:24:31.594563" elapsed="0.136814"/>
</kw>
<msg time="2026-10-16T01:24:31.731466" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:31.731508" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:31.593989" elapsed="0.137556"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:24:31.731750" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-10-16T01:24:31.731617" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:31.731600" 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 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-10-16T01:24:31.732194" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:31.732533" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:24:31.732601" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:24:31.593347" elapsed="0.139395"/>
</kw>
<msg time="2026-10-16T01:24:31.732843" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:31.732884" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:31.588435" elapsed="0.144485"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:31.733220" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:31.732992" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:31.732976" elapsed="0.000317"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:24:31.588293" elapsed="0.145022"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:31.736154" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:31.736065" elapsed="0.000133"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:31.736047" elapsed="0.000172"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:31.737628" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:31.737543" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:31.737526" elapsed="0.000205"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:31.738138" 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-10-16T01:24:31.737892" elapsed="0.000272"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:31.738525" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:24:31.738330" elapsed="0.000221"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:24:31.770842" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:24:31.739177" elapsed="0.031838"/>
</kw>
<msg time="2026-10-16T01:24:31.771196" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:24:31.771239" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:31.738747" elapsed="0.032527"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:24:31.839133" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:31.771929" elapsed="0.067496"/>
</kw>
<msg time="2026-10-16T01:24:31.839593" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:24:31.839635" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:31.771444" elapsed="0.068243"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:31.840007" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:31.839791" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:31.839769" elapsed="0.000334"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:31.840632" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:31.840283" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:31.841023" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:31.840826" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:31.840809" elapsed="0.000315"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:24:31.841156" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:31.843642" 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-10-16T01:24:31.845378" elapsed="0.000489"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:31.847037" 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-10-16T01:24:31.841979" elapsed="0.005438"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:24:31.841443" elapsed="0.006093"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:24:31.737284" elapsed="0.110332"/>
</kw>
<msg time="2026-10-16T01:24:31.848062" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:31.848111" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:31.736369" elapsed="0.111779"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:24:31.848305" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:24:31.848220" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:31.848203" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:24:31.848738" 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-10-16T01:24:31.849046" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:24:31.849110" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:24:31.735749" elapsed="0.113445"/>
</kw>
<msg time="2026-10-16T01:24:31.849277" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:31.849317" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:31.733600" elapsed="0.115752"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:31.849638" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:31.849421" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:31.849405" elapsed="0.000370"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:24:31.733455" elapsed="0.116342"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:24:31.463057" elapsed="0.386772"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:24:31.458132" elapsed="0.391760"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:24:31.453361" elapsed="0.396622"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:31.452364" elapsed="0.397668"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:24:31.449815" elapsed="0.400269"/>
</kw>
<kw name="Delete Sample Port And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:24:31.854175" 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-10-16T01:24:31.852959" elapsed="0.001254">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-10-16T01:24:31.448573" elapsed="0.405797">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-10-16T01:24:31.855796" elapsed="0.000203"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:24:31.855520" 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-10-16T01:24:31.856959" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:31.856875" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:31.856858" elapsed="0.000165"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:31.858923" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:31.858822" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:31.858793" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:24:31.859897" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:24:31.859542" elapsed="0.000381"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:31.860339" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:31.860072" elapsed="0.000291"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:24:31.860403" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:24:31.860527" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:24:31.859190" elapsed="0.001360"/>
</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-10-16T01:24:31.863152" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:31.863067" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:31.863050" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:31.864337" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:31.864252" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:31.864235" elapsed="0.000165"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:31.864822" level="INFO">${karaf_connection_index} = 386</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:24:31.864542" elapsed="0.000305"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:31.865198" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:24:31.865008" elapsed="0.000215"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:24:31.900093" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:24:31.865823" elapsed="0.034515"/>
</kw>
<msg time="2026-10-16T01:24:31.900545" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:24:31.900588" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:31.865377" elapsed="0.035247"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:24:31.983493" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:31.901362" elapsed="0.082361"/>
</kw>
<msg time="2026-10-16T01:24:31.983883" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:24:31.984009" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:31.900860" elapsed="0.083186"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:31.984392" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:31.984144" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:31.984114" elapsed="0.000381"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:31.985081" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:31.984729" elapsed="0.000439"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:31.985429" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:31.985230" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:31.985213" elapsed="0.000310"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:24:31.985559" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:31.988262" 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-10-16T01:24:31.990047" elapsed="0.000493"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:31.991814" 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-10-16T01:24:31.986493" elapsed="0.005713"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:24:31.985959" elapsed="0.006363"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:24:31.863969" elapsed="0.128432"/>
</kw>
<msg time="2026-10-16T01:24:31.992493" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:31.992535" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:31.863360" elapsed="0.129210"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:24:31.992783" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-16T01:24:31.992642" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:31.992624" 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-10-16T01:24:31.993215" 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-10-16T01:24:31.993533" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:24:31.993596" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:24:31.862773" elapsed="0.131064"/>
</kw>
<msg time="2026-10-16T01:24:31.993936" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:31.993977" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:31.860921" elapsed="0.133097"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:31.994314" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:31.994091" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:31.994074" elapsed="0.000312"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:24:31.860782" elapsed="0.133627"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:31.997213" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:31.997128" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:31.997111" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:31.998587" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:31.998467" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:31.998450" elapsed="0.000218"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:31.999087" level="INFO">${karaf_connection_index} = 388</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:24:31.998845" elapsed="0.000267"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:31.999462" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:24:31.999275" elapsed="0.000212"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:24:32.033558" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:24:32.000104" elapsed="0.033664"/>
</kw>
<msg time="2026-10-16T01:24:32.033929" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:24:32.033971" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:31.999640" elapsed="0.034367"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:24:32.113236" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:32.034592" elapsed="0.079234"/>
</kw>
<msg time="2026-10-16T01:24:32.114226" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:24:32.114292" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:32.034170" elapsed="0.080173"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:32.115109" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:32.114531" elapsed="0.000695"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:32.114467" elapsed="0.000805"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:32.116369" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:32.115540" elapsed="0.000985"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:32.117044" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:32.116618" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:32.116593" elapsed="0.000610"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:24:32.117256" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:32.121431" elapsed="0.000866"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:24:32.124057" elapsed="0.000545"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:32.125958" 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-10-16T01:24:32.118769" elapsed="0.007586"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:24:32.117832" elapsed="0.008646"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:24:31.998208" elapsed="0.128354"/>
</kw>
<msg time="2026-10-16T01:24:32.126674" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:32.126957" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:31.997419" elapsed="0.129579"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:24:32.127164" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:24:32.127075" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:32.127057" elapsed="0.000188"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:24:32.127613" 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-10-16T01:24:32.128064" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:24:32.128131" 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-10-16T01:24:31.996821" elapsed="0.131404"/>
</kw>
<msg time="2026-10-16T01:24:32.128319" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:32.128362" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:31.994715" elapsed="0.133684"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:32.128780" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:32.128473" elapsed="0.000361"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:32.128456" elapsed="0.000402"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:24:31.994542" elapsed="0.134340"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:32.131806" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:32.131712" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:32.131681" 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-10-16T01:24:32.132990" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:32.132906" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:32.132889" elapsed="0.000165"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:32.133439" 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-10-16T01:24:32.133199" elapsed="0.000265"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:32.133851" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:24:32.133627" elapsed="0.000249"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:24:32.167554" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:24:32.134441" elapsed="0.033363"/>
</kw>
<msg time="2026-10-16T01:24:32.167992" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:24:32.168042" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:32.134028" elapsed="0.034058"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:24:32.262101" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:32.168742" elapsed="0.093553"/>
</kw>
<msg time="2026-10-16T01:24:32.262457" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:24:32.262499" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:32.168260" elapsed="0.094275"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:32.262863" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:32.262608" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:32.262590" elapsed="0.000371"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:32.263497" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:32.263144" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:32.263883" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:32.263647" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:32.263630" elapsed="0.000348"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:24:32.264010" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:32.266648" 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-10-16T01:24:32.268483" elapsed="0.000550"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:32.270381" 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-10-16T01:24:32.264881" elapsed="0.005913"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:24:32.264334" elapsed="0.006578"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:24:32.132606" elapsed="0.138386"/>
</kw>
<msg time="2026-10-16T01:24:32.271076" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:32.271117" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:32.132020" elapsed="0.139133"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:24:32.271310" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:24:32.271223" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:32.271206" elapsed="0.000181"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:24:32.271808" 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-10-16T01:24:32.272117" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:24:32.272182" 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-10-16T01:24:32.131367" elapsed="0.140901"/>
</kw>
<msg time="2026-10-16T01:24:32.272352" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:32.272391" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:32.129166" elapsed="0.143260"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:32.272752" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:32.272494" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:32.272478" elapsed="0.000348"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:24:32.129023" elapsed="0.143825"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:24:31.860602" elapsed="0.412274"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:24:31.858492" elapsed="0.414443"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:24:31.856581" elapsed="0.416410"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:31.856194" elapsed="0.416844"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:24:31.855182" elapsed="0.417912"/>
</kw>
<kw name="Delete Sample Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:24:32.277236" 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-10-16T01:24:32.276058" elapsed="0.001215">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-10-16T01:24:31.854619" elapsed="0.422804">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-10-16T01:24:32.278850" elapsed="0.000210"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:24:32.278562" 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-10-16T01:24:32.280072" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:32.279979" elapsed="0.000135"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:32.279962" elapsed="0.000173"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:32.282089" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:32.282001" elapsed="0.000131"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:32.281984" elapsed="0.000168"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:24:32.283078" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:24:32.282748" elapsed="0.000355"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:32.283738" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:32.283432" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:24:32.283805" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:24:32.283933" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:24:32.282357" elapsed="0.001599"/>
</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-10-16T01:24:32.286504" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:32.286421" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:32.286404" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:32.287731" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:32.287600" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:32.287583" elapsed="0.000213"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:32.288167" level="INFO">${karaf_connection_index} = 386</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:24:32.287939" elapsed="0.000253"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:32.288599" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:24:32.288380" elapsed="0.000251"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:24:32.321277" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:24:32.289281" elapsed="0.032176"/>
</kw>
<msg time="2026-10-16T01:24:32.321632" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:24:32.321746" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:32.288851" elapsed="0.032935"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:24:32.406118" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:32.322389" elapsed="0.083925"/>
</kw>
<msg time="2026-10-16T01:24:32.406476" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:24:32.406518" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:32.321955" elapsed="0.084599"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:32.406874" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:32.406627" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:32.406609" elapsed="0.000360"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:32.407492" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:32.407149" elapsed="0.000435"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:32.407878" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:32.407644" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:32.407628" elapsed="0.000344"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:24:32.408003" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:32.410549" 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-10-16T01:24:32.412351" elapsed="0.000509"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:32.414256" 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-10-16T01:24:32.408808" elapsed="0.005914"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:24:32.408273" elapsed="0.006571"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:24:32.287342" elapsed="0.127582"/>
</kw>
<msg time="2026-10-16T01:24:32.415008" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:32.415047" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:32.286754" elapsed="0.128329"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:24:32.415240" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:24:32.415153" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:32.415135" elapsed="0.000184"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:24:32.415636" elapsed="0.000424"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:32.416519" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:24:32.416585" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:24:32.286130" elapsed="0.130581"/>
</kw>
<msg time="2026-10-16T01:24:32.416812" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:32.416914" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:32.284302" elapsed="0.132653"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:32.417270" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:32.417033" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:32.417016" elapsed="0.000326"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:24:32.284164" elapsed="0.133199"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:32.420175" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:32.420090" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:32.420072" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:32.421355" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:32.421273" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:32.421256" elapsed="0.000161"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:32.421823" level="INFO">${karaf_connection_index} = 388</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:24:32.421558" elapsed="0.000290"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:32.422183" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:24:32.422005" elapsed="0.000203"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:24:32.453951" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:24:32.422798" elapsed="0.031334"/>
</kw>
<msg time="2026-10-16T01:24:32.454293" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:24:32.454334" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:32.422357" elapsed="0.032013"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:24:32.538266" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:32.455031" elapsed="0.083559"/>
</kw>
<msg time="2026-10-16T01:24:32.538808" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:24:32.538851" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:32.454534" elapsed="0.084353"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:32.539197" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:32.538978" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:32.538951" elapsed="0.000343"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:32.539890" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:32.539472" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:32.540253" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:32.540042" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:32.540026" elapsed="0.000324"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:24:32.540382" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:32.543047" 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-10-16T01:24:32.544927" elapsed="0.000472"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:32.546636" elapsed="0.000548"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:24:32.541230" elapsed="0.006022"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:24:32.540715" elapsed="0.006655"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:24:32.421016" elapsed="0.126432"/>
</kw>
<msg time="2026-10-16T01:24:32.547533" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:32.547573" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:32.420382" elapsed="0.127226"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:24:32.547795" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:24:32.547691" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:32.547674" elapsed="0.000199"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:24:32.548211" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:32.548511" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:24:32.548575" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:24:32.419793" elapsed="0.128888"/>
</kw>
<msg time="2026-10-16T01:24:32.548870" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:32.548910" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:32.417614" elapsed="0.131333"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:32.549239" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:32.549017" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:32.549001" elapsed="0.000309"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:24:32.417473" elapsed="0.131858"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:32.551937" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:32.551852" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:32.551835" 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-10-16T01:24:32.553177" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:32.553094" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:32.553078" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:32.553607" 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-10-16T01:24:32.553382" elapsed="0.000249"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:32.554010" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:24:32.553827" elapsed="0.000207"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:24:32.588832" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:24:32.554597" elapsed="0.034424"/>
</kw>
<msg time="2026-10-16T01:24:32.589195" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:24:32.589238" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:32.554186" elapsed="0.035089"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:24:32.674863" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:32.589946" elapsed="0.085187"/>
</kw>
<msg time="2026-10-16T01:24:32.675320" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:24:32.675364" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:32.589446" elapsed="0.085954"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:32.675781" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:32.675489" elapsed="0.000370"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:32.675466" elapsed="0.000420"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:32.676447" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:32.676085" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:32.676831" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:32.676597" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:32.676581" elapsed="0.000344"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:24:32.676958" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:32.679485" 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-10-16T01:24:32.681227" elapsed="0.000501"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:32.683106" elapsed="0.000309"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:24:32.677802" elapsed="0.005681"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:24:32.677255" elapsed="0.006344"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:24:32.552820" elapsed="0.130873"/>
</kw>
<msg time="2026-10-16T01:24:32.683797" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:32.683838" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:32.552197" elapsed="0.131683"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:24:32.684039" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:24:32.683952" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:32.683935" elapsed="0.000255"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:24:32.684523" 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-10-16T01:24:32.684945" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:24:32.685012" 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-10-16T01:24:32.551519" elapsed="0.133583"/>
</kw>
<msg time="2026-10-16T01:24:32.685187" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:32.685227" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:32.549582" elapsed="0.135681"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:32.685553" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:32.685331" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:32.685315" elapsed="0.000309"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:24:32.549446" elapsed="0.136214"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:24:32.284016" elapsed="0.401677"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:24:32.281635" elapsed="0.404134"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:24:32.279722" elapsed="0.406105"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:32.279290" elapsed="0.406599"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:24:32.278223" elapsed="0.407727"/>
</kw>
<kw name="Create Sample Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:24:32.690255" 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-10-16T01:24:32.688966" elapsed="0.001328">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-10-16T01:24:32.277674" elapsed="0.412760">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-10-16T01:24:32.691871" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:24:32.691581" 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-10-16T01:24:32.693068" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:32.692965" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:32.692948" elapsed="0.000184"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:32.695026" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:32.694943" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:32.694927" elapsed="0.000163"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:24:32.696013" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:24:32.695662" elapsed="0.000377"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:32.696461" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:32.696189" elapsed="0.000296"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:24:32.696526" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:24:32.696681" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:24:32.695294" elapsed="0.001436"/>
</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-10-16T01:24:32.699334" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:32.699250" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:32.699232" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:32.700541" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:32.700457" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:32.700440" elapsed="0.000164"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:32.701024" level="INFO">${karaf_connection_index} = 386</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:24:32.700789" elapsed="0.000260"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:32.701390" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:24:32.701209" elapsed="0.000206"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:24:32.728265" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:24:32.702024" elapsed="0.026454"/>
</kw>
<msg time="2026-10-16T01:24:32.728689" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:24:32.728806" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:32.701568" elapsed="0.027276"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:24:32.797629" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:32.729575" elapsed="0.068477"/>
</kw>
<msg time="2026-10-16T01:24:32.798288" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:24:32.798332" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:32.729065" elapsed="0.069304"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:32.798872" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:32.798510" elapsed="0.000440"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:32.798464" elapsed="0.000521"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:32.799670" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:32.799185" elapsed="0.000603"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:32.800057" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:32.799852" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:32.799834" elapsed="0.000323"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:24:32.800197" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:32.803262" 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-10-16T01:24:32.805175" elapsed="0.000716"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:32.807087" 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-10-16T01:24:32.801244" elapsed="0.006245"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:24:32.800634" elapsed="0.007287"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:24:32.700160" elapsed="0.107849"/>
</kw>
<msg time="2026-10-16T01:24:32.808102" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:32.808144" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:32.699545" elapsed="0.108636"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:24:32.808342" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:24:32.808254" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:32.808237" elapsed="0.000185"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:24:32.808816" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:32.809228" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:24:32.809294" 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-10-16T01:24:32.698958" elapsed="0.110428"/>
</kw>
<msg time="2026-10-16T01:24:32.809480" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:32.809522" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:32.697088" elapsed="0.112471"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:32.809908" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:32.809631" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:32.809614" elapsed="0.000367"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:24:32.696946" elapsed="0.113059"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:32.814780" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:32.814677" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:32.814659" elapsed="0.000186"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:32.815957" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:32.815874" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:32.815858" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:32.816406" level="INFO">${karaf_connection_index} = 388</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:24:32.816169" elapsed="0.000261"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:32.816813" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:24:32.816591" elapsed="0.000247"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:24:32.848215" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:24:32.817424" elapsed="0.030990"/>
</kw>
<msg time="2026-10-16T01:24:32.848574" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:24:32.848615" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:32.816990" elapsed="0.031673"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:24:32.926140" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:32.849320" elapsed="0.077005"/>
</kw>
<msg time="2026-10-16T01:24:32.926481" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:24:32.926527" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:32.848854" elapsed="0.077719"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:32.926918" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:32.926673" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:32.926635" elapsed="0.000380"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:32.927534" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:32.927194" elapsed="0.000422"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:32.927908" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:32.927691" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:32.927675" elapsed="0.000368"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:24:32.928074" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:32.930620" elapsed="0.000583"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:24:32.932487" elapsed="0.000552"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:32.934506" 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-10-16T01:24:32.928890" elapsed="0.006033"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:24:32.928349" elapsed="0.006692"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:24:32.815580" elapsed="0.119544"/>
</kw>
<msg time="2026-10-16T01:24:32.935205" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:32.935245" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:32.814993" elapsed="0.120287"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:24:32.935431" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:24:32.935347" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:32.935330" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:24:32.935966" 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-10-16T01:24:32.936284" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:24:32.936352" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:24:32.814348" elapsed="0.122097"/>
</kw>
<msg time="2026-10-16T01:24:32.936559" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:32.936603" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:32.810288" elapsed="0.126372"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:32.937028" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:32.936775" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:32.936752" elapsed="0.000349"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:24:32.810147" elapsed="0.126976"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:32.940064" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:32.939979" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:32.939961" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:32.941252" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:32.941168" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:32.941152" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:32.941736" 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-10-16T01:24:32.941459" elapsed="0.000303"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:32.942119" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:24:32.941925" elapsed="0.000218"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:24:32.977066" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:24:32.942761" elapsed="0.034500"/>
</kw>
<msg time="2026-10-16T01:24:32.977441" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:24:32.977497" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:32.942297" elapsed="0.035240"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:24:33.057938" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:32.978495" elapsed="0.079672"/>
</kw>
<msg time="2026-10-16T01:24:33.058327" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:24:33.058369" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:32.978055" elapsed="0.080351"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:33.058735" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:33.058477" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:33.058459" elapsed="0.000375"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:33.059372" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:33.059022" elapsed="0.000436"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:33.059752" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:33.059517" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:33.059500" elapsed="0.000348"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:24:33.059881" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:33.062514" 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-10-16T01:24:33.064333" elapsed="0.000522"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:33.066081" 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-10-16T01:24:33.060760" elapsed="0.005729"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:24:33.060185" elapsed="0.006442"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:24:32.940910" elapsed="0.125835"/>
</kw>
<msg time="2026-10-16T01:24:33.066830" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:33.066880" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:32.940273" elapsed="0.126645"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:24:33.067077" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:24:33.066989" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:33.066972" elapsed="0.000183"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:24:33.067490" 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-10-16T01:24:33.067865" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:24:33.067947" 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-10-16T01:24:32.939628" elapsed="0.128415"/>
</kw>
<msg time="2026-10-16T01:24:33.068130" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:33.068172" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:32.937395" elapsed="0.130821"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:33.068538" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:33.068286" elapsed="0.000368"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:33.068270" elapsed="0.000412"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:24:32.937253" elapsed="0.131478"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:24:32.696785" elapsed="0.371976"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:24:32.694625" elapsed="0.374196"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:24:32.692682" elapsed="0.376197"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:32.692275" elapsed="0.376649"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:24:32.691219" elapsed="0.377760"/>
</kw>
<kw name="Create Sample Port And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:24:33.073560" 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-10-16T01:24:33.072009" elapsed="0.001589">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-10-16T01:24:32.690674" elapsed="0.383121">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-10-16T01:24:33.075169" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:24:33.074922" elapsed="0.000504"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:33.076334" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:33.076249" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:33.076232" elapsed="0.000166"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:33.078287" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:33.078202" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:33.078185" elapsed="0.000165"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:24:33.079268" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:24:33.078942" elapsed="0.000351"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:33.079778" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:33.079444" elapsed="0.000359"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:24:33.079845" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:24:33.079970" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:24:33.078555" elapsed="0.001437"/>
</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-10-16T01:24:33.082587" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:33.082503" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:33.082486" elapsed="0.000180"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:33.083787" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:33.083678" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:33.083660" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:33.084262" level="INFO">${karaf_connection_index} = 386</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:24:33.084015" elapsed="0.000272"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:33.084677" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:24:33.084450" elapsed="0.000270"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:24:33.117077" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:24:33.085294" elapsed="0.031962"/>
</kw>
<msg time="2026-10-16T01:24:33.117418" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:24:33.117460" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:33.084878" elapsed="0.032617"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:24:33.211328" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:33.118210" elapsed="0.093382"/>
</kw>
<msg time="2026-10-16T01:24:33.211836" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:24:33.211880" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:33.117774" elapsed="0.094143"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:33.212313" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:33.212027" elapsed="0.000362"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:33.211991" elapsed="0.000426"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:33.213070" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:33.212604" elapsed="0.000560"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:33.213426" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:33.213225" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:33.213209" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:24:33.213556" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:33.216250" 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-10-16T01:24:33.218045" elapsed="0.000494"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:33.219998" 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-10-16T01:24:33.214474" elapsed="0.005917"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:24:33.213933" elapsed="0.006576"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:24:33.083404" elapsed="0.137185"/>
</kw>
<msg time="2026-10-16T01:24:33.220711" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:33.220755" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:33.082832" elapsed="0.137960"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:24:33.220949" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:24:33.220864" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:33.220847" elapsed="0.000181"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:24:33.221375" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:33.221803" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:24:33.221873" 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-10-16T01:24:33.082210" elapsed="0.139756"/>
</kw>
<msg time="2026-10-16T01:24:33.222052" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:33.222097" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:33.080330" elapsed="0.141809"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:33.222433" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:33.222209" elapsed="0.000374"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:33.222193" elapsed="0.000419"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:24:33.080191" elapsed="0.142445"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:33.225358" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:33.225256" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:33.225238" elapsed="0.000185"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:33.226523" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:33.226438" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:33.226421" elapsed="0.000165"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:33.227018" level="INFO">${karaf_connection_index} = 388</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:24:33.226781" elapsed="0.000263"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:33.227391" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:24:33.227204" elapsed="0.000211"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:24:33.259408" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:24:33.228022" elapsed="0.031562"/>
</kw>
<msg time="2026-10-16T01:24:33.259804" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:24:33.259848" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:33.227569" elapsed="0.032315"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:24:33.346062" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:33.260474" elapsed="0.085777"/>
</kw>
<msg time="2026-10-16T01:24:33.346408" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:24:33.346450" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:33.260050" elapsed="0.086435"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:33.346793" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:33.346555" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:33.346538" elapsed="0.000352"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:33.347414" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:33.347078" elapsed="0.000426"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:33.347790" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:33.347565" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:33.347548" elapsed="0.000337"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:24:33.347916" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:33.350364" 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-10-16T01:24:33.352127" elapsed="0.000490"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:33.354091" 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-10-16T01:24:33.348679" elapsed="0.005799"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:24:33.348180" elapsed="0.006419"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:24:33.226182" elapsed="0.128534"/>
</kw>
<msg time="2026-10-16T01:24:33.354809" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:33.354911" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:33.225570" elapsed="0.129380"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:24:33.355124" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-10-16T01:24:33.355031" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:33.355012" elapsed="0.000195"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:24:33.355544" 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-10-16T01:24:33.355965" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:24:33.356033" 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-10-16T01:24:33.224952" elapsed="0.131169"/>
</kw>
<msg time="2026-10-16T01:24:33.356207" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:33.356249" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:33.222941" elapsed="0.133344"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:33.356578" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:33.356356" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:33.356340" elapsed="0.000325"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:24:33.222798" elapsed="0.133891"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:33.359431" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:33.359346" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:33.359328" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:33.360596" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:33.360513" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:33.360496" elapsed="0.000250"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:33.361126" 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-10-16T01:24:33.360891" elapsed="0.000259"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:33.361493" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:24:33.361309" elapsed="0.000208"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:24:33.395925" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:24:33.362112" elapsed="0.033998"/>
</kw>
<msg time="2026-10-16T01:24:33.396275" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:24:33.396316" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:33.361683" elapsed="0.034669"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:24:33.496687" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:33.396997" elapsed="0.099899"/>
</kw>
<msg time="2026-10-16T01:24:33.497057" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:24:33.497098" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:33.396517" elapsed="0.100617"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:33.497413" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:33.497207" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:33.497187" elapsed="0.000320"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:33.498120" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:33.497767" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:33.498470" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:33.498273" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:33.498256" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:24:33.498594" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:33.501140" elapsed="0.000479"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:24:33.502906" elapsed="0.000455"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:33.504560" elapsed="0.000358"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:24:33.499423" elapsed="0.005563"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:24:33.498920" elapsed="0.006184"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:24:33.360255" elapsed="0.144926"/>
</kw>
<msg time="2026-10-16T01:24:33.505263" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:33.505302" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:33.359653" elapsed="0.145687"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:24:33.505493" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:24:33.505409" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:33.505392" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:24:33.506194" 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-10-16T01:24:33.506503" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:24:33.506569" 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-10-16T01:24:33.359030" elapsed="0.147641"/>
</kw>
<msg time="2026-10-16T01:24:33.506774" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:33.506814" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:33.356967" elapsed="0.149882"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:33.507135" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:33.506917" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:33.506901" elapsed="0.000304"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:24:33.356826" elapsed="0.150401"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:24:33.080045" elapsed="0.427212"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:24:33.077908" elapsed="0.429412"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:24:33.075997" elapsed="0.431385"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:33.075568" elapsed="0.431861"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:24:33.074550" elapsed="0.432937"/>
</kw>
<kw name="Modify the destination IP of Sample Port" owner="ClusterOvsdb">
<msg time="2026-10-16T01:24:33.510590" 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-10-16T01:24:33.509317" elapsed="0.001311">Variable '${original_owner}' not found.</status>
</kw>
<doc>Modify the dst ip of existing port in Owner.</doc>
<status status="FAIL" start="2026-10-16T01:24:33.074033" elapsed="0.436844">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-10-16T01:24:33.512307" elapsed="0.000204"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:24:33.512061" elapsed="0.000500"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:33.513473" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:33.513386" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:33.513370" elapsed="0.000167"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:33.515433" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:33.515349" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:33.515332" elapsed="0.000165"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:24:33.516565" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:24:33.516093" elapsed="0.000497"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:33.517051" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:33.516774" elapsed="0.000301"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:24:33.517116" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:24:33.517241" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:24:33.515733" elapsed="0.001531"/>
</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-10-16T01:24:33.519857" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:33.519772" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:33.519754" elapsed="0.000167"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:33.521036" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:33.520952" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:33.520934" elapsed="0.000166"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:33.521474" level="INFO">${karaf_connection_index} = 386</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:24:33.521243" elapsed="0.000256"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:33.521881" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:24:33.521683" elapsed="0.000222"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:24:33.554693" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:24:33.522469" elapsed="0.032427"/>
</kw>
<msg time="2026-10-16T01:24:33.555055" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:24:33.555097" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:33.522058" elapsed="0.033074"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:24:33.639890" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:33.555774" elapsed="0.084481"/>
</kw>
<msg time="2026-10-16T01:24:33.640519" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:24:33.640561" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:33.555294" elapsed="0.085306"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:33.641180" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:33.640793" elapsed="0.000468"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:33.640736" elapsed="0.000560"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:33.642052" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:33.641492" elapsed="0.000756"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:33.642515" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:33.642312" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:33.642294" elapsed="0.000319"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:24:33.642664" elapsed="0.000073"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:33.645548" 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-10-16T01:24:33.647374" elapsed="0.000584"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:33.649184" 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-10-16T01:24:33.643736" elapsed="0.005852"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:24:33.643098" elapsed="0.006860"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:24:33.520667" elapsed="0.129377"/>
</kw>
<msg time="2026-10-16T01:24:33.650138" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:33.650180" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:33.520069" elapsed="0.130149"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:24:33.650380" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-16T01:24:33.650293" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:33.650275" elapsed="0.000188"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:24:33.650888" 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-10-16T01:24:33.651215" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:24:33.651282" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:24:33.519450" elapsed="0.131923"/>
</kw>
<msg time="2026-10-16T01:24:33.651467" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:33.651510" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:33.517602" elapsed="0.133945"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:33.651990" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:33.651620" elapsed="0.000420"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:33.651603" elapsed="0.000460"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:24:33.517466" elapsed="0.134620"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:33.654942" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:33.654858" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:33.654840" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:33.656101" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:33.656017" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:33.656000" elapsed="0.000165"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:33.656548" level="INFO">${karaf_connection_index} = 388</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:24:33.656308" elapsed="0.000264"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:33.656956" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:24:33.656764" elapsed="0.000216"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:24:33.688621" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:24:33.657536" elapsed="0.031304"/>
</kw>
<msg time="2026-10-16T01:24:33.689066" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:24:33.689109" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:33.657130" elapsed="0.032015"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:24:33.753750" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:33.689767" elapsed="0.064171"/>
</kw>
<msg time="2026-10-16T01:24:33.754100" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:24:33.754142" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:33.689309" elapsed="0.064868"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:33.754453" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:33.754249" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:33.754231" elapsed="0.000317"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:33.755116" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:33.754769" elapsed="0.000427"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:33.755454" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:33.755257" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:33.755241" elapsed="0.000306"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:24:33.755577" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:33.758065" 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-10-16T01:24:33.759794" elapsed="0.000458"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:33.761448" 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-10-16T01:24:33.756382" elapsed="0.005477"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:24:33.755895" elapsed="0.006084"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:24:33.655760" elapsed="0.106297"/>
</kw>
<msg time="2026-10-16T01:24:33.762138" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:33.762178" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:33.655149" elapsed="0.107066"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:24:33.762367" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:24:33.762283" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:33.762266" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:24:33.762787" 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-10-16T01:24:33.763091" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:24:33.763156" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:24:33.654504" elapsed="0.108737"/>
</kw>
<msg time="2026-10-16T01:24:33.763323" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:33.763363" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:33.652376" elapsed="0.111022"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:33.763753" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:33.763506" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:33.763488" elapsed="0.000339"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:24:33.652233" elapsed="0.111617"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:33.766341" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:33.766257" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:33.766240" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:33.767504" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:33.767422" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:33.767406" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:33.767971" 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-10-16T01:24:33.767743" elapsed="0.000253"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:33.768332" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:24:33.768154" elapsed="0.000202"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:24:33.803770" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:24:33.769330" elapsed="0.034628"/>
</kw>
<msg time="2026-10-16T01:24:33.804125" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:24:33.804166" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:33.768508" elapsed="0.035694"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:24:33.868418" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:33.804827" elapsed="0.063787"/>
</kw>
<msg time="2026-10-16T01:24:33.868818" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:24:33.868860" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:33.804366" elapsed="0.064530"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:33.869208" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:33.868979" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:33.868956" elapsed="0.000350"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:33.869879" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:33.869494" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:33.870220" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:33.870023" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:33.870006" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:24:33.870347" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:33.872903" 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-10-16T01:24:33.874619" elapsed="0.000509"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:33.876316" 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-10-16T01:24:33.871199" elapsed="0.005526"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:24:33.870673" elapsed="0.006173"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:24:33.767167" elapsed="0.109757"/>
</kw>
<msg time="2026-10-16T01:24:33.877298" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:33.877340" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:33.766551" elapsed="0.110831"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:24:33.877543" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:24:33.877457" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:33.877440" elapsed="0.000182"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:24:33.877983" 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-10-16T01:24:33.878304" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:24:33.878400" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:24:33.765965" elapsed="0.112531"/>
</kw>
<msg time="2026-10-16T01:24:33.878582" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:33.878623" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:33.764098" elapsed="0.114574"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:33.878993" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:33.878768" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:33.878752" elapsed="0.000312"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:24:33.763961" elapsed="0.115125"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:24:33.517317" elapsed="0.361801"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:24:33.515057" elapsed="0.364126"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:24:33.513133" elapsed="0.366113"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:33.512739" elapsed="0.366556"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:24:33.511719" elapsed="0.367635"/>
</kw>
<kw name="Verify Sample Port Is Modified" owner="ClusterOvsdb">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:24:33.881803" 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-10-16T01:24:33.881408" elapsed="0.000421"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:24:33.886641" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:24:33.885342" elapsed="0.001338">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:24:34.897048" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:24:34.893959" elapsed="0.003198">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:24:35.907162" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:24:35.904126" elapsed="0.003143">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:24:36.917296" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:24:36.914248" elapsed="0.003150">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:24:37.927619" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:24:37.924360" elapsed="0.003389">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:24:38.938365" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:24:38.935291" elapsed="0.003180">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<msg time="2026-10-16T01:24:38.938749" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: Variable '${ovsdb_uuid}' not found.</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-10-16T01:24:33.882040" elapsed="5.057017">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: Variable '${ovsdb_uuid}' not found.</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-10-16T01:24:33.881035" elapsed="5.058289">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: Variable '${ovsdb_uuid}' not found.</status>
</kw>
<doc>Verify port is modified in all instances.</doc>
<status status="FAIL" start="2026-10-16T01:24:33.511200" elapsed="5.428457">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: Variable '${ovsdb_uuid}' not found.</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-10-16T01:24:38.942844" elapsed="0.000567"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:24:38.942220" elapsed="0.001307"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:38.945831" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:38.945525" elapsed="0.000415"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:38.945476" elapsed="0.000516"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:38.950336" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:38.950144" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:38.950104" elapsed="0.000374"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:24:38.952621" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:24:38.951841" elapsed="0.000839"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:38.953685" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:38.953048" elapsed="0.000719"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:24:38.953860" elapsed="0.000065"/>
</return>
<msg time="2026-10-16T01:24:38.954151" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:24:38.950993" elapsed="0.003207"/>
</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-10-16T01:24:38.962791" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:38.962539" elapsed="0.000348"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:38.962500" elapsed="0.000434"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:38.965570" elapsed="0.000053"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:38.965384" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:38.965346" elapsed="0.000424"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:38.966640" level="INFO">${karaf_connection_index} = 386</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:24:38.966095" elapsed="0.000646"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:38.967565" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:24:38.967108" elapsed="0.000535"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:24:39.006209" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:24:38.969133" elapsed="0.037335"/>
</kw>
<msg time="2026-10-16T01:24:39.006860" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:24:39.006919" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:38.968037" elapsed="0.038931"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:24:39.078950" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:39.007842" elapsed="0.071292"/>
</kw>
<msg time="2026-10-16T01:24:39.079298" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:24:39.079339" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:39.007199" elapsed="0.072179"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:39.079678" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:39.079449" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:39.079431" elapsed="0.000369"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:39.080326" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:39.079982" elapsed="0.000427"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:39.080679" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:39.080470" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:39.080453" elapsed="0.000338"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:24:39.080822" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:39.083593" 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-10-16T01:24:39.085419" elapsed="0.000569"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:39.087227" 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-10-16T01:24:39.081661" elapsed="0.005979"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:24:39.081131" elapsed="0.006823"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:24:38.964811" elapsed="0.123223"/>
</kw>
<msg time="2026-10-16T01:24:39.088116" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:39.088155" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:38.963276" elapsed="0.124915"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:24:39.088345" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:24:39.088259" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:39.088242" elapsed="0.000182"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:24:39.088791" 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-10-16T01:24:39.089089" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:24:39.089154" 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-10-16T01:24:38.961887" elapsed="0.127353"/>
</kw>
<msg time="2026-10-16T01:24:39.089323" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:39.089362" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:38.955126" elapsed="0.134271"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:39.089874" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:39.089504" elapsed="0.000422"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:39.089486" elapsed="0.000464"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:24:38.954667" elapsed="0.135305"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:39.092482" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:39.092397" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:39.092380" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:39.093693" elapsed="0.000039"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:39.093598" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:39.093567" elapsed="0.000217"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:39.094155" level="INFO">${karaf_connection_index} = 388</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:24:39.093928" elapsed="0.000251"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:39.094520" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:24:39.094339" elapsed="0.000206"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:24:39.136428" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:24:39.095145" elapsed="0.041481"/>
</kw>
<msg time="2026-10-16T01:24:39.136826" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:24:39.136870" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:39.094731" elapsed="0.042175"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:24:39.205109" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:39.137518" elapsed="0.067774"/>
</kw>
<msg time="2026-10-16T01:24:39.205455" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:24:39.205497" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:39.137078" elapsed="0.068455"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:39.205861" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:39.205619" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:39.205600" elapsed="0.000357"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:39.206498" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:39.206144" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:39.206871" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:39.206654" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:39.206637" elapsed="0.000329"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:24:39.206998" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:39.209481" 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-10-16T01:24:39.211219" elapsed="0.000469"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:39.212895" 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-10-16T01:24:39.207805" elapsed="0.005473"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:24:39.207275" elapsed="0.006122"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:24:39.093327" elapsed="0.120193"/>
</kw>
<msg time="2026-10-16T01:24:39.213620" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:39.213664" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:39.092732" elapsed="0.120995"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:24:39.213889" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:24:39.213801" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:39.213783" elapsed="0.000185"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:24:39.214288" 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-10-16T01:24:39.214602" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:24:39.214669" 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-10-16T01:24:39.092100" elapsed="0.122681"/>
</kw>
<msg time="2026-10-16T01:24:39.214868" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:39.214909" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:39.090226" elapsed="0.124718"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:39.215233" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:39.215013" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:39.214997" elapsed="0.000309"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:24:39.090089" elapsed="0.125239"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:39.218177" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:39.218090" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:39.218072" elapsed="0.000171"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:39.219351" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:39.219267" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:39.219251" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:39.219818" 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-10-16T01:24:39.219555" elapsed="0.000288"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:39.220180" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:24:39.220002" elapsed="0.000203"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:24:39.255959" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:24:39.220807" elapsed="0.035337"/>
</kw>
<msg time="2026-10-16T01:24:39.256306" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:24:39.256349" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:39.220358" elapsed="0.036027"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:24:39.327960" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:39.257026" elapsed="0.071119"/>
</kw>
<msg time="2026-10-16T01:24:39.328304" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:24:39.328346" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:39.256553" elapsed="0.071829"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:39.328677" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:39.328454" elapsed="0.000372"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:39.328436" elapsed="0.000416"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:39.329385" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:39.329037" elapsed="0.000429"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:39.329764" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:39.329527" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:39.329510" elapsed="0.000350"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:24:39.329891" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:39.332398" 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-10-16T01:24:39.334304" elapsed="0.000506"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:39.336239" elapsed="0.000310"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:24:39.330680" elapsed="0.005950"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:24:39.330168" elapsed="0.006600"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:24:39.219008" elapsed="0.117840"/>
</kw>
<msg time="2026-10-16T01:24:39.336932" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:39.336974" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:39.218397" elapsed="0.118613"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:24:39.337165" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:24:39.337080" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:39.337063" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:24:39.337568" 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-10-16T01:24:39.337982" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:24:39.338049" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:24:39.217794" elapsed="0.120342"/>
</kw>
<msg time="2026-10-16T01:24:39.338222" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:39.338265" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:39.215587" elapsed="0.122716"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:39.338607" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:39.338371" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:39.338355" elapsed="0.000325"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:24:39.215438" elapsed="0.123280"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:24:38.954319" elapsed="0.384428"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:24:38.949354" elapsed="0.389448"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:24:38.944927" elapsed="0.393927"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:38.943920" elapsed="0.394978"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:24:38.941349" elapsed="0.397596"/>
</kw>
<kw name="Delete Sample Port And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:24:39.343153" 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-10-16T01:24:39.341894" elapsed="0.001341">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-10-16T01:24:38.940179" elapsed="0.403193">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-10-16T01:24:39.344941" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:24:39.344649" 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-10-16T01:24:39.346110" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:39.346024" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:39.346006" elapsed="0.000168"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:39.348048" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:39.347964" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:39.347947" elapsed="0.000165"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:24:39.349035" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:24:39.348688" elapsed="0.000372"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:39.349484" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:39.349212" elapsed="0.000297"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:24:39.349551" elapsed="0.000043"/>
</return>
<msg time="2026-10-16T01:24:39.349714" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:24:39.348314" elapsed="0.001424"/>
</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-10-16T01:24:39.352257" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:39.352172" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:39.352155" elapsed="0.000167"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:39.353424" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:39.353340" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:39.353324" elapsed="0.000164"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:39.353897" level="INFO">${karaf_connection_index} = 386</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:24:39.353645" elapsed="0.000277"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:39.354266" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:24:39.354085" elapsed="0.000205"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:24:39.389986" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:24:39.354895" elapsed="0.035296"/>
</kw>
<msg time="2026-10-16T01:24:39.390352" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:24:39.390394" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:39.354445" elapsed="0.035986"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:24:39.471421" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:39.391061" elapsed="0.080573"/>
</kw>
<msg time="2026-10-16T01:24:39.471829" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:24:39.471872" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:39.390611" elapsed="0.081297"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:39.472200" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:39.471984" elapsed="0.000344"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:39.471964" elapsed="0.000391"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:39.472956" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:39.472538" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:39.473322" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:39.473117" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:39.473099" elapsed="0.000323"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:24:39.473456" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:39.476054" elapsed="0.000485"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:24:39.477825" elapsed="0.000496"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:39.479516" 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-10-16T01:24:39.474309" elapsed="0.005618"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:24:39.473790" elapsed="0.006258"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:24:39.353084" elapsed="0.127044"/>
</kw>
<msg time="2026-10-16T01:24:39.480214" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:39.480255" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:39.352471" elapsed="0.127822"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:24:39.480449" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:24:39.480362" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:39.480345" elapsed="0.000183"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:24:39.480900" 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-10-16T01:24:39.481205" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:24:39.481271" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:24:39.351880" elapsed="0.129479"/>
</kw>
<msg time="2026-10-16T01:24:39.481449" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:39.481491" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:39.350069" elapsed="0.131460"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:39.481863" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:39.481613" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:39.481596" elapsed="0.000340"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:24:39.349929" elapsed="0.132029"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:39.484540" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:39.484455" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:39.484438" elapsed="0.000181"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:39.486052" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:39.485657" elapsed="0.000438"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:39.485641" elapsed="0.000476"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:39.486489" level="INFO">${karaf_connection_index} = 388</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:24:39.486259" elapsed="0.000255"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:39.486895" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:24:39.486692" elapsed="0.000271"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:24:39.525047" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:24:39.487537" elapsed="0.037709"/>
</kw>
<msg time="2026-10-16T01:24:39.525417" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:24:39.525460" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:39.487122" elapsed="0.038374"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:24:39.621686" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:39.526167" elapsed="0.095739"/>
</kw>
<msg time="2026-10-16T01:24:39.622079" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:24:39.622122" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:39.525688" elapsed="0.096470"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:39.622446" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:39.622236" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:39.622215" elapsed="0.000331"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:39.623177" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:39.622783" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:39.623624" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:39.623373" elapsed="0.000363"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:39.623351" elapsed="0.000417"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:24:39.623812" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:39.626885" 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-10-16T01:24:39.628767" elapsed="0.000476"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:39.630668" 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-10-16T01:24:39.624872" elapsed="0.006214"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:24:39.624170" elapsed="0.007033"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:24:39.485387" elapsed="0.145895"/>
</kw>
<msg time="2026-10-16T01:24:39.631366" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:39.631412" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:39.484812" elapsed="0.146645"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:24:39.631634" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:24:39.631528" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:39.631511" 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 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-10-16T01:24:39.632123" 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-10-16T01:24:39.632460" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:24:39.632529" 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-10-16T01:24:39.484156" elapsed="0.148629"/>
</kw>
<msg time="2026-10-16T01:24:39.632873" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:39.632913" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:39.482214" elapsed="0.150743"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:39.633261" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:39.633037" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:39.633019" elapsed="0.000316"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:24:39.482075" elapsed="0.151282"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:39.636125" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:39.636038" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:39.636020" elapsed="0.000170"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:39.637351" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:39.637260" elapsed="0.000134"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:39.637242" elapsed="0.000175"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:39.638107" 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-10-16T01:24:39.637560" elapsed="0.000573"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:39.638501" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:24:39.638312" elapsed="0.000214"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:24:39.671601" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:24:39.639263" elapsed="0.032550"/>
</kw>
<msg time="2026-10-16T01:24:39.671980" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:24:39.672022" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:39.638815" elapsed="0.033242"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:24:39.763654" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:39.672748" elapsed="0.091151"/>
</kw>
<msg time="2026-10-16T01:24:39.764073" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:24:39.764115" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:39.672229" elapsed="0.091925"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:39.764514" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:39.764255" elapsed="0.000350"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:39.764227" elapsed="0.000405"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:39.765227" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:39.764837" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:39.765677" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:39.765380" elapsed="0.000401"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:39.765363" elapsed="0.000441"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:24:39.765840" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:39.768547" 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-10-16T01:24:39.770464" elapsed="0.000598"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:39.772444" elapsed="0.000370"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:24:39.766750" elapsed="0.006146"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:24:39.766166" elapsed="0.006854"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:24:39.636996" elapsed="0.136104"/>
</kw>
<msg time="2026-10-16T01:24:39.773189" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:39.773230" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:39.636351" elapsed="0.136916"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:24:39.773426" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:24:39.773338" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:39.773321" elapsed="0.000194"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:24:39.773961" 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-10-16T01:24:39.774298" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:24:39.774365" 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-10-16T01:24:39.635720" elapsed="0.138737"/>
</kw>
<msg time="2026-10-16T01:24:39.774545" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:39.774603" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:39.633633" elapsed="0.141008"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:39.775063" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:39.774821" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:39.774802" elapsed="0.000335"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:24:39.633474" elapsed="0.141686"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:24:39.349787" elapsed="0.425406"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:24:39.347651" elapsed="0.427606"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:24:39.345767" elapsed="0.429551"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:39.345342" elapsed="0.430024"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:24:39.344296" elapsed="0.431130"/>
</kw>
<kw name="Delete Sample Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:24:39.780936" 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-10-16T01:24:39.779360" elapsed="0.001621">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-10-16T01:24:39.343784" elapsed="0.437371">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-10-16T01:24:39.782631" elapsed="0.000256"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:24:39.782312" elapsed="0.000627"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:39.783886" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:39.783796" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:39.783778" 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-10-16T01:24:39.785968" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:39.785867" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:39.785850" elapsed="0.000184"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:24:39.787107" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:24:39.786645" elapsed="0.000536"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:39.787659" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:39.787358" elapsed="0.000326"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:24:39.787743" elapsed="0.000028"/>
</return>
<msg time="2026-10-16T01:24:39.787874" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:24:39.786246" elapsed="0.001651"/>
</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-10-16T01:24:39.790563" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:39.790476" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:39.790458" elapsed="0.000184"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:39.791830" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:39.791735" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:39.791692" elapsed="0.000212"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:39.792292" level="INFO">${karaf_connection_index} = 386</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:24:39.792052" elapsed="0.000266"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:39.792740" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:24:39.792494" elapsed="0.000272"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:24:39.825247" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:24:39.793367" elapsed="0.032071"/>
</kw>
<msg time="2026-10-16T01:24:39.825638" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:24:39.825684" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:39.792926" elapsed="0.032826"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:24:39.899551" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:39.826391" elapsed="0.073392"/>
</kw>
<msg time="2026-10-16T01:24:39.899950" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:24:39.899993" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:39.825931" elapsed="0.074110"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:39.900349" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:39.900128" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:39.900103" elapsed="0.000355"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:39.901070" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:39.900662" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:39.901414" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:39.901216" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:39.901200" elapsed="0.000313"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:24:39.901556" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:39.904206" elapsed="0.000577"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:24:39.906126" elapsed="0.000513"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:39.908021" 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-10-16T01:24:39.902426" elapsed="0.006025"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:24:39.901903" elapsed="0.006688"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:24:39.791430" elapsed="0.117246"/>
</kw>
<msg time="2026-10-16T01:24:39.908807" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:39.908849" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:39.790811" elapsed="0.118077"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:24:39.909051" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:24:39.908962" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:39.908944" elapsed="0.000188"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:24:39.909467" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:39.909939" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:24:39.910008" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:24:39.790165" elapsed="0.119933"/>
</kw>
<msg time="2026-10-16T01:24:39.910183" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:39.910223" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:39.788269" elapsed="0.122001"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:39.910587" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:39.910346" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:39.910330" elapsed="0.000332"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:24:39.788128" elapsed="0.122556"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:39.913329" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:39.913242" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:39.913224" elapsed="0.000174"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:39.914859" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:39.914771" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:39.914753" elapsed="0.000169"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:39.915319" level="INFO">${karaf_connection_index} = 388</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:24:39.915078" elapsed="0.000267"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:39.915732" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:24:39.915503" elapsed="0.000258"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:24:39.954135" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:24:39.916335" elapsed="0.038119"/>
</kw>
<msg time="2026-10-16T01:24:39.954761" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:24:39.954807" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:39.915916" elapsed="0.038929"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:24:40.036835" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:39.955829" elapsed="0.081212"/>
</kw>
<msg time="2026-10-16T01:24:40.037205" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:24:40.037247" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:39.955148" elapsed="0.082238"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:40.037807" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:40.037507" elapsed="0.000376"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:40.037464" elapsed="0.000450"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:40.038517" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:40.038103" elapsed="0.000536"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:40.038971" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:40.038745" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:40.038719" elapsed="0.000356"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:24:40.039114" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:40.042072" 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-10-16T01:24:40.043895" elapsed="0.000750"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:40.046046" 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-10-16T01:24:40.040144" elapsed="0.006308"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:24:40.039522" elapsed="0.007070"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:24:39.914450" elapsed="0.132229"/>
</kw>
<msg time="2026-10-16T01:24:40.046793" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:40.046835" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:39.913560" elapsed="0.133313"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:24:40.047035" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-16T01:24:40.046948" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:40.046930" elapsed="0.000187"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:24:40.047479" 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-10-16T01:24:40.047854" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:24:40.047921" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:24:39.912934" elapsed="0.135080"/>
</kw>
<msg time="2026-10-16T01:24:40.048107" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:40.048148" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:39.910959" elapsed="0.137226"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:40.048493" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:40.048257" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:40.048241" elapsed="0.000341"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:24:39.910819" elapsed="0.137787"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:40.051729" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:40.051623" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:40.051604" 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-10-16T01:24:40.052972" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:40.052873" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:40.052852" elapsed="0.000232"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:40.053481" 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-10-16T01:24:40.053232" elapsed="0.000274"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:40.054016" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:24:40.053811" elapsed="0.000231"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:24:40.086775" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:24:40.054683" elapsed="0.032314"/>
</kw>
<msg time="2026-10-16T01:24:40.087167" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:24:40.087209" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:40.054215" elapsed="0.033029"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:24:40.155300" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:40.087914" elapsed="0.067581"/>
</kw>
<msg time="2026-10-16T01:24:40.155677" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:24:40.155748" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:40.087426" elapsed="0.068361"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:40.156084" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:40.155867" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:40.155844" elapsed="0.000337"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:40.156759" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "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-10-16T01:24:40.156363" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:40.157100" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:40.156904" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:40.156888" elapsed="0.000305"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:24:40.157227" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:40.159825" elapsed="0.000489"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:24:40.161585" elapsed="0.000490"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:40.163251" 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-10-16T01:24:40.158079" elapsed="0.005572"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:24:40.157538" elapsed="0.006260"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:24:40.052559" elapsed="0.111317"/>
</kw>
<msg time="2026-10-16T01:24:40.163963" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:40.164018" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:40.051941" elapsed="0.112115"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:24:40.164217" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:24:40.164130" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:40.164112" elapsed="0.000186"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:24:40.164663" 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-10-16T01:24:40.165054" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:24:40.165118" 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-10-16T01:24:40.051276" elapsed="0.113930"/>
</kw>
<msg time="2026-10-16T01:24:40.165292" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:40.165333" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:40.048935" elapsed="0.116432"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:40.165669" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:40.165437" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:40.165421" elapsed="0.000344"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:24:40.048790" elapsed="0.116998"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:24:39.787956" elapsed="0.377865"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:24:39.785530" elapsed="0.380356"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:24:39.783488" elapsed="0.382459"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:39.783088" elapsed="0.382908"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:24:39.781963" elapsed="0.384092"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:40.169494" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:40.169259" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:40.169242" elapsed="0.000344"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:40.169937" 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-10-16T01:24:40.170031" 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-10-16T01:24:40.169797" elapsed="0.000259"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:40.170532" level="INFO">Attempting to execute command "sudo mn -c" on remote system "10.30.171.104" 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-10-16T01:24:40.170242" elapsed="0.000349"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:40.171093" level="INFO">${conn_id} = 577</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-10-16T01:24:40.170781" elapsed="0.000336"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:24:40.171981" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:24:40.172051" 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-10-16T01:24:40.171684" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:40.172218" elapsed="0.000281"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:24:40.173298" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:24:40.548763" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:24:00 UTC 2026

  System load:  0.01               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:24:20 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:24:40.173057" elapsed="0.375870"/>
</kw>
<msg time="2026-10-16T01:24:40.549107" 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-10-16T01:24:40.172677" elapsed="0.376533"/>
</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-10-16T01:24:40.171312" elapsed="0.378023"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:24:40.549971" level="INFO">Executing command 'sudo mn -c'.</msg>
<msg time="2026-10-16T01:24:41.718784" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:24:41.719111" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:24:41.719207" 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-10-16T01:24:40.549682" elapsed="1.169579"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:41.719743" elapsed="0.000551"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:41.721481" 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-10-16T01:24:41.720875" 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-10-16T01:24:41.722066" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:41.721815" elapsed="0.000355"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:41.721766" elapsed="0.000456"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:24:41.722510" elapsed="0.000090"/>
</return>
<status status="PASS" start="2026-10-16T01:24:41.722329" elapsed="0.000343"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:41.722298" elapsed="0.000456"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:24:41.722828" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:41.724535" elapsed="0.000717"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:24:41.725679" elapsed="0.003128"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:41.729146" elapsed="0.000207"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:24:41.723545" elapsed="0.005924"/>
</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-10-16T01:24:40.168836" elapsed="1.560838"/>
</kw>
<msg time="2026-10-16T01:24:41.729825" 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-10-16T01:24:40.168073" elapsed="1.561864"/>
</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-10-16T01:24:40.167347" elapsed="1.562748"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:41.734388" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:41.733690" elapsed="0.000818"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:41.733652" elapsed="0.000932"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:41.735345" 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-10-16T01:24:41.735575" 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-10-16T01:24:41.735045" elapsed="0.000588"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:41.736783" 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.104" 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-10-16T01:24:41.736079" elapsed="0.001021"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:41.738246" level="INFO">${conn_id} = 579</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-10-16T01:24:41.737514" elapsed="0.000787"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:24:41.740207" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:24:41.740361" 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-10-16T01:24:41.739597" elapsed="0.000812"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:41.740790" elapsed="0.000636"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:24:41.743217" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:24:42.146313" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:24:00 UTC 2026

  System load:  0.01               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%

 * Canonical Workshop gives developers fast, composable, reproducible, and
   secure developer environments that are perfect for agentic workflows.

   https://ubuntu.com/workshop

Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:24:40 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:24:41.742674" elapsed="0.403746"/>
</kw>
<msg time="2026-10-16T01:24:42.146487" 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-10-16T01:24:41.741837" elapsed="0.404732"/>
</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-10-16T01:24:41.738790" elapsed="0.407865"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:24:42.147108" 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-10-16T01:24:42.190605" level="INFO">Command exited with return code -1.</msg>
<msg time="2026-10-16T01:24:42.190875" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:24:42.190965" 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-10-16T01:24:42.146896" elapsed="0.044118"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:42.191359" elapsed="0.000573"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:42.193013" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:42.192412" elapsed="0.000687"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:24:42.193463" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:42.193248" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:42.193204" elapsed="0.000430"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:24:42.193958" elapsed="0.000052"/>
</return>
<status status="PASS" start="2026-10-16T01:24:42.193773" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:42.193739" elapsed="0.000389"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:24:42.194196" elapsed="0.000028"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:42.196216" elapsed="0.000683"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:24:42.197302" elapsed="0.000334"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:42.197980" elapsed="0.000197"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:24:42.195292" elapsed="0.002992"/>
</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-10-16T01:24:41.732692" elapsed="0.465746"/>
</kw>
<msg time="2026-10-16T01:24:42.198542" 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-10-16T01:24:41.731457" elapsed="0.467213"/>
</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-10-16T01:24:41.730446" elapsed="0.468504"/>
</kw>
<arg>${tools_system}</arg>
<status status="PASS" start="2026-10-16T01:24:40.167034" elapsed="2.032030"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:42.203199" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:42.202646" elapsed="0.000669"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:42.202608" elapsed="0.000761"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:42.204119" 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-10-16T01:24:42.204321" 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-10-16T01:24:42.203843" elapsed="0.000532"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:42.205479" level="INFO">Attempting to execute command "sudo ovs-vsctl del-manager" on remote system "10.30.171.104" 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-10-16T01:24:42.204836" elapsed="0.000762"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:42.206733" 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-10-16T01:24:42.206024" elapsed="0.000765"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:24:42.208729" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:24:42.208890" 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-10-16T01:24:42.208124" elapsed="0.000814"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:42.209270" elapsed="0.000706"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:24:42.211862" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:24:42.610094" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:24:00 UTC 2026

  System load:  0.01               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%

 * Canonical Workshop gives developers fast, composable, reproducible, and
   secure developer environments that are perfect for agentic workflows.

   https://ubuntu.com/workshop

Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:24:42 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:24:42.211267" elapsed="0.399034"/>
</kw>
<msg time="2026-10-16T01:24:42.610399" 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-10-16T01:24:42.210337" elapsed="0.400170"/>
</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-10-16T01:24:42.207215" elapsed="0.403446"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:24:42.611359" level="INFO">Executing command 'sudo ovs-vsctl del-manager'.</msg>
<msg time="2026-10-16T01:24:42.655752" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:24:42.656040" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:24:42.656130" 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-10-16T01:24:42.611043" elapsed="0.045136"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:42.656561" elapsed="0.000538"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:42.658317" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:42.657675" 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-10-16T01:24:42.658925" elapsed="0.000043"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:42.658619" elapsed="0.000428"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:42.658532" elapsed="0.000557"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:24:42.659288" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-10-16T01:24:42.659169" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:42.659149" elapsed="0.000254"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:24:42.659448" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:42.660762" elapsed="0.000426"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:24:42.661447" elapsed="0.000235"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:42.661901" elapsed="0.000128"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:24:42.659955" elapsed="0.002146"/>
</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-10-16T01:24:42.201658" elapsed="0.460545"/>
</kw>
<msg time="2026-10-16T01:24:42.662277" 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-10-16T01:24:42.200429" elapsed="0.461920"/>
</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-10-16T01:24:42.199444" elapsed="0.463021"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:42.665160" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:42.664822" elapsed="0.000431"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:42.664793" elapsed="0.000509"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:42.665829" 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-10-16T01:24:42.665963" 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-10-16T01:24:42.665606" elapsed="0.000392"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:42.666688" level="INFO">Attempting to execute command "sudo /usr/share/openvswitch/scripts/ovs-ctl stop" on remote system "10.30.171.104" 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-10-16T01:24:42.666263" elapsed="0.000507"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:42.667444" 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-10-16T01:24:42.667016" elapsed="0.000461"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:24:42.668748" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:24:42.668849" 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-10-16T01:24:42.668333" elapsed="0.000546"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:42.669087" elapsed="0.000400"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:24:42.670611" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:24:43.064433" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:24:00 UTC 2026

  System load:  0.01               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%

 * Canonical Workshop gives developers fast, composable, reproducible, and
   secure developer environments that are perfect for agentic workflows.

   https://ubuntu.com/workshop

Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:24:42 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:24:42.670265" elapsed="0.394302"/>
</kw>
<msg time="2026-10-16T01:24:43.064638" 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-10-16T01:24:42.669749" elapsed="0.394979"/>
</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-10-16T01:24:42.667790" elapsed="0.397039"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:24:43.065248" level="INFO">Executing command 'sudo /usr/share/openvswitch/scripts/ovs-ctl stop'.</msg>
<msg time="2026-10-16T01:24:43.240364" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:24:43.240621" level="INFO">${stdout} =  * Exiting ovs-vswitchd (5700)
 * Exiting ovsdb-server (5683)</msg>
<msg time="2026-10-16T01:24:43.240757" 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-10-16T01:24:43.065064" elapsed="0.175746"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:43.241166" elapsed="0.000488"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:43.242758" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:43.242170" elapsed="0.000681"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:24:43.243223" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:43.243003" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:43.242960" elapsed="0.000407"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:24:43.243688" elapsed="0.000086"/>
</return>
<status status="PASS" start="2026-10-16T01:24:43.243474" elapsed="0.000370"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:43.243442" elapsed="0.000453"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:24:43.243965" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:43.245618" elapsed="0.000673"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:24:43.246755" elapsed="0.000319"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:43.247389" elapsed="0.000225"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:24:43.244663" elapsed="0.003088"/>
</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-10-16T01:24:42.664179" elapsed="0.583735"/>
</kw>
<msg time="2026-10-16T01:24:43.248063" 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-10-16T01:24:42.663369" elapsed="0.584806"/>
</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-10-16T01:24:42.662763" elapsed="0.585608"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:43.252911" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:43.252340" elapsed="0.000689"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:43.252299" elapsed="0.000785"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:43.253875" 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-10-16T01:24:43.254082" 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-10-16T01:24:43.253509" elapsed="0.000626"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:43.255251" level="INFO">Attempting to execute command "sudo rm -rf /etc/openvswitch/conf.db" on remote system "10.30.171.104" 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-10-16T01:24:43.254573" elapsed="0.000772"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:43.256447" 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-10-16T01:24:43.255788" elapsed="0.000712"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:24:43.258367" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:24:43.258519" 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-10-16T01:24:43.257828" elapsed="0.000763"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:43.258951" elapsed="0.000658"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:24:43.261372" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:24:43.705737" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:24:00 UTC 2026

  System load:  0.01               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%

 * Canonical Workshop gives developers fast, composable, reproducible, and
   secure developer environments that are perfect for agentic workflows.

   https://ubuntu.com/workshop

Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:24:42 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:24:43.260861" elapsed="0.445061"/>
</kw>
<msg time="2026-10-16T01:24:43.705989" 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-10-16T01:24:43.260001" elapsed="0.446053"/>
</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-10-16T01:24:43.256983" elapsed="0.449163"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:24:43.706555" level="INFO">Executing command 'sudo rm -rf /etc/openvswitch/conf.db'.</msg>
<msg time="2026-10-16T01:24:43.729787" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:24:43.729932" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:24:43.729987" 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-10-16T01:24:43.706369" elapsed="0.023647"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:43.730238" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:43.731221" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:43.730889" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:24:43.731517" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:43.731371" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:43.731343" elapsed="0.000284"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:24:43.731832" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-10-16T01:24:43.731695" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:43.731674" elapsed="0.000266"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:24:43.731983" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:43.732981" 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-10-16T01:24:43.733664" elapsed="0.000216"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:43.734073" 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-10-16T01:24:43.732383" elapsed="0.001878"/>
</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-10-16T01:24:43.251348" elapsed="0.483011"/>
</kw>
<msg time="2026-10-16T01:24:43.734428" 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-10-16T01:24:43.250112" elapsed="0.484384"/>
</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-10-16T01:24:43.248836" elapsed="0.485787"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:43.737191" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:43.736859" elapsed="0.000405"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:43.736834" elapsed="0.000462"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:43.737781" 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-10-16T01:24:43.737910" 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-10-16T01:24:43.737583" elapsed="0.000360"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:43.738619" level="INFO">Attempting to execute command "sudo /usr/share/openvswitch/scripts/ovs-ctl start" on remote system "10.30.171.104" 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-10-16T01:24:43.738203" elapsed="0.000477"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:43.739351" 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-10-16T01:24:43.738945" elapsed="0.000441"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:24:43.740524" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:24:43.740640" 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-10-16T01:24:43.740183" elapsed="0.000488"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:43.740952" elapsed="0.000402"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:24:43.742460" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:24:44.128115" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:24:00 UTC 2026

  System load:  0.01               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%

 * Canonical Workshop gives developers fast, composable, reproducible, and
   secure developer environments that are perfect for agentic workflows.

   https://ubuntu.com/workshop

Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:24:43 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:24:43.742139" elapsed="0.386070"/>
</kw>
<msg time="2026-10-16T01:24:44.128272" 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-10-16T01:24:43.741600" elapsed="0.386730"/>
</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-10-16T01:24:43.739669" elapsed="0.388743"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:24:44.128830" level="INFO">Executing command 'sudo /usr/share/openvswitch/scripts/ovs-ctl start'.</msg>
<msg time="2026-10-16T01:24:44.273985" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:24:44.274223" 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-10-16T01:24:44.274318" 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-10-16T01:24:44.128645" elapsed="0.145722"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:44.274785" elapsed="0.000433"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:44.276269" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:44.275730" elapsed="0.000627"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:24:44.276766" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:44.276499" elapsed="0.000366"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:44.276459" 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-10-16T01:24:44.277198" elapsed="0.000053"/>
</return>
<status status="PASS" start="2026-10-16T01:24:44.277019" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:44.276988" elapsed="0.000379"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:24:44.277435" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:44.279014" elapsed="0.000643"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:24:44.280135" elapsed="0.000300"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:44.280795" elapsed="0.000193"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:24:44.278100" elapsed="0.002989"/>
</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-10-16T01:24:43.736230" elapsed="0.545010"/>
</kw>
<msg time="2026-10-16T01:24:44.281348" 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-10-16T01:24:43.735476" elapsed="0.545972"/>
</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-10-16T01:24:43.734890" elapsed="0.546737"/>
</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-10-16T01:24:40.166662" elapsed="4.115121"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:24:44.282903" 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-10-16T01:24:44.282205" elapsed="0.000754"/>
</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-10-16T01:24:44.290244" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:24:44.289466" elapsed="0.000834"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:44.291273" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:44.290650" elapsed="0.000675"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:24:44.291414" elapsed="0.000057"/>
</return>
<msg time="2026-10-16T01:24:44.291743" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:24:44.288668" elapsed="0.003127"/>
</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-10-16T01:24:44.298035" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:24:44.297382" elapsed="0.000708"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:24:44.298183" elapsed="0.000057"/>
</return>
<msg time="2026-10-16T01:24:44.298451" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:24:44.296646" elapsed="0.001855"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:44.301137" 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-10-16T01:24:44.300615" elapsed="0.000613"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:44.302173" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:44.301665" elapsed="0.000595"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:24:44.310518" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:24:44.310656" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:24:44.310914" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:44.302937" elapsed="0.008889">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:24:44.302390" elapsed="0.009601">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:44.312420" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:44.312084" elapsed="0.000508"/>
</branch>
<status status="FAIL" start="2026-10-16T01:24:44.302354" elapsed="0.010290">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:44.313439" elapsed="0.000050"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:44.313803" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:44.313654" elapsed="0.000239"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:24:44.313620" elapsed="0.000319"/>
</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-10-16T01:24:44.314242" elapsed="0.000043"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:24:44.314379" elapsed="0.000030"/>
</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-10-16T01:24:44.299205" elapsed="0.015408">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:44.314762" elapsed="0.000112"/>
</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-10-16T01:24:44.295686" elapsed="0.019358">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:44.315502" elapsed="0.000071"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:24:44.292157" elapsed="0.023521">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:24:44.291906" elapsed="0.023919">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:24:44.287582" elapsed="0.028425">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:45.323078" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:24:45.322178" elapsed="0.000967"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:45.324456" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:45.323491" elapsed="0.001048"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:24:45.324639" elapsed="0.000111"/>
</return>
<msg time="2026-10-16T01:24:45.324988" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:24:45.321312" elapsed="0.003728"/>
</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-10-16T01:24:45.331472" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:24:45.330848" elapsed="0.000709"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:24:45.331655" elapsed="0.000089"/>
</return>
<msg time="2026-10-16T01:24:45.331968" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:24:45.330073" elapsed="0.001947"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:45.334882" 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-10-16T01:24:45.334276" elapsed="0.000702"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:45.335995" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:45.335394" 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-10-16T01:24:45.342361" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:24:45.342476" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:24:45.342758" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:45.336800" elapsed="0.006779">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:24:45.336229" elapsed="0.007550">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:45.344189" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:45.343855" elapsed="0.000464"/>
</branch>
<status status="FAIL" start="2026-10-16T01:24:45.336189" elapsed="0.008178">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:45.345289" elapsed="0.000055"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:45.345585" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:45.345486" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:24:45.345451" elapsed="0.000294"/>
</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-10-16T01:24:45.346053" elapsed="0.000044"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:24:45.346193" elapsed="0.000031"/>
</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-10-16T01:24:45.332745" elapsed="0.013660">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:45.346590" elapsed="0.000036"/>
</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-10-16T01:24:45.329091" elapsed="0.017730">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:45.347283" elapsed="0.000049"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:24:45.325405" elapsed="0.022030">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:24:45.325152" elapsed="0.022424">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:24:45.320019" elapsed="0.027776">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:46.355786" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:24:46.354782" elapsed="0.001080"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:46.357022" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:46.356227" elapsed="0.000864"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:24:46.357197" elapsed="0.000092"/>
</return>
<msg time="2026-10-16T01:24:46.357568" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:24:46.353893" elapsed="0.003730"/>
</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-10-16T01:24:46.364622" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:24:46.363945" elapsed="0.000794"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:24:46.364866" elapsed="0.000076"/>
</return>
<msg time="2026-10-16T01:24:46.365197" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:24:46.363103" elapsed="0.002146"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:46.368068" 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-10-16T01:24:46.367421" elapsed="0.000746"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:46.369251" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:46.368637" 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-10-16T01:24:46.376349" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:24:46.376467" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:24:46.376946" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:46.370141" elapsed="0.007732">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:24:46.369531" elapsed="0.008514">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:46.378452" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:46.378117" elapsed="0.000496"/>
</branch>
<status status="FAIL" start="2026-10-16T01:24:46.369453" elapsed="0.009212">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:46.379442" elapsed="0.000052"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:46.379762" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:46.379657" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:24:46.379621" 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-10-16T01:24:46.380232" elapsed="0.000044"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:24:46.380372" elapsed="0.000030"/>
</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-10-16T01:24:46.365996" elapsed="0.014638">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:46.380837" elapsed="0.000043"/>
</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-10-16T01:24:46.362076" elapsed="0.019012">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:46.381596" elapsed="0.000063"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:24:46.358058" elapsed="0.023773">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:24:46.357779" elapsed="0.024174">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:24:46.352268" elapsed="0.029872">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:47.389514" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:24:47.388592" elapsed="0.000991"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:47.390613" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:47.389962" elapsed="0.000705"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:24:47.390793" elapsed="0.000078"/>
</return>
<msg time="2026-10-16T01:24:47.391107" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:24:47.387753" elapsed="0.003404"/>
</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-10-16T01:24:47.397100" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:24:47.396437" elapsed="0.000718"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:24:47.397247" elapsed="0.000057"/>
</return>
<msg time="2026-10-16T01:24:47.397545" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:24:47.395729" elapsed="0.001869"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:47.400243" 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-10-16T01:24:47.399736" elapsed="0.000599"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:47.401411" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:47.400918" elapsed="0.000610"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:24:47.408234" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:24:47.408350" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:24:47.408598" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:47.402213" elapsed="0.007223">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:24:47.401678" elapsed="0.007956">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:47.410072" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:47.409736" elapsed="0.000465"/>
</branch>
<status status="FAIL" start="2026-10-16T01:24:47.401637" elapsed="0.008614">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:47.411037" elapsed="0.000052"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:47.411302" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:47.411229" elapsed="0.000156"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:24:47.411195" 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-10-16T01:24:47.411789" elapsed="0.000045"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:24:47.411931" elapsed="0.000031"/>
</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-10-16T01:24:47.398297" elapsed="0.013846">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:47.412261" 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-10-16T01:24:47.394760" elapsed="0.017685">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:47.412953" elapsed="0.000050"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:24:47.391546" elapsed="0.021561">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:24:47.391269" elapsed="0.021954">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:24:47.386455" elapsed="0.026950">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:48.421471" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:24:48.420480" elapsed="0.001086"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:48.422621" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:48.421950" elapsed="0.000735"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:24:48.422826" elapsed="0.000084"/>
</return>
<msg time="2026-10-16T01:24:48.423151" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:24:48.419627" elapsed="0.003700"/>
</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-10-16T01:24:48.429387" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:24:48.428782" elapsed="0.000660"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:24:48.429563" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:24:48.429874" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:24:48.428033" elapsed="0.001893"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:48.432905" 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-10-16T01:24:48.432264" elapsed="0.000738"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:48.433975" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:48.433420" elapsed="0.000644"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:24:48.441298" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:24:48.441415" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:24:48.441754" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:48.434864" elapsed="0.007751">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:24:48.434216" elapsed="0.008629">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:48.443266" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:48.442932" elapsed="0.000462"/>
</branch>
<status status="FAIL" start="2026-10-16T01:24:48.434173" elapsed="0.009271">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:48.444255" elapsed="0.000052"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:48.444547" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:48.444448" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:24:48.444413" elapsed="0.000264"/>
</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-10-16T01:24:48.445014" elapsed="0.000043"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:24:48.445151" 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-10-16T01:24:48.430631" elapsed="0.014735">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:48.445553" elapsed="0.000043"/>
</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-10-16T01:24:48.427057" elapsed="0.018757">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:48.446277" elapsed="0.000049"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:24:48.423877" elapsed="0.022553">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:24:48.423451" elapsed="0.023120">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:24:48.418174" elapsed="0.028699">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:49.455021" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:24:49.454064" elapsed="0.001028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:49.456126" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:49.455445" elapsed="0.000737"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:24:49.456280" elapsed="0.000081"/>
</return>
<msg time="2026-10-16T01:24:49.456627" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:24:49.453107" elapsed="0.003571"/>
</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-10-16T01:24:49.462745" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:24:49.462058" elapsed="0.000746"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:24:49.462900" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:24:49.463176" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:24:49.461278" elapsed="0.001950"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:49.466011" 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-10-16T01:24:49.465442" elapsed="0.000663"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:49.467102" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:49.466544" elapsed="0.000648"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:24:49.474015" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:24:49.474132" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:24:49.474380" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:49.467903" elapsed="0.007410">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:24:49.467339" elapsed="0.008174">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:49.475957" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:49.475588" elapsed="0.000499"/>
</branch>
<status status="FAIL" start="2026-10-16T01:24:49.467298" elapsed="0.008840">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:49.476933" elapsed="0.000052"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:49.477196" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:49.477124" elapsed="0.000154"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:24:49.477089" 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-10-16T01:24:49.477649" elapsed="0.000044"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:24:49.477820" 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-10-16T01:24:49.463980" elapsed="0.014178">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:49.478277" 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-10-16T01:24:49.460282" elapsed="0.018184">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:24:49.478980" elapsed="0.000051"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:24:49.457096" elapsed="0.022041">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:24:49.456829" elapsed="0.022423">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:24:49.451665" elapsed="0.027769">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<msg time="2026-10-16T01:24:49.479657" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</msg>
<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="FAIL" start="2026-10-16T01:24:44.283477" elapsed="5.196412">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<doc>Cleans up test environment, close existing sessions.</doc>
<status status="FAIL" start="2026-10-16T01:24:40.166273" elapsed="9.313839">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<doc>Cleans up test environment, close existing sessions in teardown.</doc>
<status status="FAIL" start="2026-10-16T01:24:39.781408" elapsed="9.699006">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</test>
<kw name="Delete All Sessions" owner="RequestsLibrary" type="TEARDOWN">
<msg time="2026-10-16T01:24:49.481914" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects </doc>
<status status="PASS" start="2026-10-16T01:24:49.481744" elapsed="0.000406"/>
</kw>
<doc>Test suite for Ovsdb Southbound Cluster - Owner failover and recover</doc>
<status status="FAIL" start="2026-10-16T01:21:08.689657" elapsed="220.792567"/>
</suite>
<suite id="s1-s2-s2" name="Southbound Cluster Extension" source="/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:24:49.527153" level="INFO">${SuiteFastFail} = False</msg>
<arg>${SuiteFastFail}</arg>
<arg>False</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-16T01:24:49.524863" elapsed="0.002337"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-10-16T01:24:49.524509" elapsed="0.002803"/>
</kw>
<kw name="Setup_Karaf_Keywords" owner="KarafKeywords">
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-10-16T01:24:49.529600" 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-10-16T01:24:49.528313" elapsed="0.001313"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-10-16T01:24:49.529796" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:49.529711" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:49.529680" elapsed="0.000176"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-16T01:24:49.530356" level="INFO">${ClusterManagement__has_setup_run} = True</msg>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-16T01:24:49.530030" elapsed="0.000366"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-10-16T01:24:49.530871" 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-10-16T01:24:49.530571" elapsed="0.000325"/>
</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-10-16T01:24:49.531401" elapsed="0.000284"/>
</kw>
<msg time="2026-10-16T01:24:49.531793" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:49.531835" 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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:49.531057" elapsed="0.000800"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:24:49.532347" 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-10-16T01:24:49.532028" elapsed="0.000343"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:49.533291" level="INFO">@{member_index_list} = [ ]</msg>
<var>@{member_index_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:49.533045" elapsed="0.000272"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:49.533729" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:49.533456" elapsed="0.000298"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:24:49.534198" 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-10-16T01:24:49.533926" elapsed="0.000297"/>
</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-10-16T01:24:49.535144" elapsed="0.000183"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:24:49.535794" level="INFO">${member_ip} = 10.30.170.180</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:24:49.535498" elapsed="0.000320"/>
</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-10-16T01:24:49.535982" elapsed="0.000178"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:24:49.537035" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:24:49.536606" elapsed="0.000454"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:24:49.537102" elapsed="0.000029"/>
</return>
<msg time="2026-10-16T01:24:49.537232" 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-10-16T01:24:49.536328" elapsed="0.000927"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:24:49.537808" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.180:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a8996109710&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-10-16T01:24:49.537427" elapsed="0.000512"/>
</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-10-16T01:24:49.538099" elapsed="0.000148"/>
</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-10-16T01:24:49.534683" elapsed="0.003619"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:24:49.534467" elapsed="0.003873"/>
</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-10-16T01:24:49.539086" elapsed="0.000149"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:24:49.539682" level="INFO">${member_ip} = 10.30.170.14</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:24:49.539387" elapsed="0.000338"/>
</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-10-16T01:24:49.539889" elapsed="0.000165"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:24:49.540858" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:24:49.540497" elapsed="0.000387"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:24:49.540926" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:24:49.541052" 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-10-16T01:24:49.540221" elapsed="0.000854"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:24:49.541561" level="INFO">Creating Session using : alias=ClusterManagement__session_2, url=http://10.30.170.14:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a89965dc990&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-10-16T01:24:49.541241" elapsed="0.000417"/>
</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-10-16T01:24:49.541834" elapsed="0.000147"/>
</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-10-16T01:24:49.538593" elapsed="0.003441"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:24:49.538416" elapsed="0.003657"/>
</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-10-16T01:24:49.542779" elapsed="0.000148"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:24:49.543358" level="INFO">${member_ip} = 10.30.170.84</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:24:49.543078" 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-10-16T01:24:49.543618" elapsed="0.000188"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:24:49.544853" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:24:49.544558" elapsed="0.000320"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:24:49.544920" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:24:49.545046" 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-10-16T01:24:49.543976" elapsed="0.001094"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:24:49.545579" level="INFO">Creating Session using : alias=ClusterManagement__session_3, url=http://10.30.170.84:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7a89965f9510&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-10-16T01:24:49.545237" elapsed="0.000440"/>
</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-10-16T01:24:49.545855" elapsed="0.000150"/>
</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-10-16T01:24:49.542309" elapsed="0.003750"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:24:49.542148" elapsed="0.003951"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-10-16T01:24:49.534274" elapsed="0.011852"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-16T01:24:49.546680" level="INFO">${ClusterManagement__member_index_list} = [1, 2, 3]</msg>
<arg>\${ClusterManagement__member_index_list}</arg>
<arg>${member_index_list}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-16T01:24:49.546308" elapsed="0.000428"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-16T01:24:49.547271" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.180', 2: '10.30.170.14', 3: '10.30.170.84'}</msg>
<arg>\${ClusterManagement__index_to_ip_mapping}</arg>
<arg>${index_to_ip_mapping}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-16T01:24:49.546918" elapsed="0.000393"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-10-16T01:24:49.547885" 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 the variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-10-16T01:24:49.547521" elapsed="0.000404"/>
</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-10-16T01:24:49.532658" elapsed="0.015319"/>
</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-10-16T01:24:49.528007" elapsed="0.020020"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:49.548177" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:49.548086" elapsed="0.000132"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:49.548069" elapsed="0.000170"/>
</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-10-16T01:24:49.549620" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:24:49.549273" elapsed="0.000374"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:49.550088" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:49.549813" elapsed="0.000299"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:24:49.550154" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:24:49.550283" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:24:49.548799" elapsed="0.001506"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:49.551164" level="INFO">${member_ip} = 10.30.170.180</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-10-16T01:24:49.550952" elapsed="0.000236"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:49.551950" 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-10-16T01:24:49.552043" 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-10-16T01:24:49.551767" elapsed="0.000300"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:49.555355" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:49.554655" elapsed="0.000803"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:49.554613" elapsed="0.000942"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:49.556276" 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-10-16T01:24:49.556580" 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-10-16T01:24:49.555886" elapsed="0.000829"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:49.557591" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.180" 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-10-16T01:24:49.557033" elapsed="0.000729"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:49.558805" 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-10-16T01:24:49.558064" elapsed="0.000857"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:24:49.560293" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:24:49.560363" 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-10-16T01:24:49.560020" elapsed="0.000365"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:49.560594" elapsed="0.000341"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:24:49.561913" level="INFO">Logging into '10.30.170.180:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:24:50.181280" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-194-generic x86_64)

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

 System information as of Fri Oct 16 01:24:49 UTC 2026

  System load:  0.03               Processes:             122
  Usage of /:   13.9% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.180
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:21:09 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:24:49.561529" elapsed="0.620010"/>
</kw>
<msg time="2026-10-16T01:24:50.181658" 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-10-16T01:24:49.561141" elapsed="0.620665"/>
</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-10-16T01:24:49.559286" elapsed="0.622883"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:24:50.183579" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-10-16T01:24:50.197128" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-10-16T01:24:50.197675" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:24:50.197977" 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-10-16T01:24:50.182837" elapsed="0.015335"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:50.198621" elapsed="0.000886"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:50.201813" 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-10-16T01:24:50.200590" elapsed="0.001471"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:24:50.202874" elapsed="0.000049"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:50.202305" elapsed="0.000684"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:50.202233" elapsed="0.000874"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:24:50.203733" elapsed="0.000096"/>
</return>
<status status="PASS" start="2026-10-16T01:24:50.203305" elapsed="0.000592"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:50.203247" elapsed="0.000774"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:24:50.204158" elapsed="0.000022"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:50.206352" elapsed="0.000684"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:24:50.207442" elapsed="0.000357"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:50.208152" elapsed="0.000226"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:24:50.205109" elapsed="0.003392"/>
</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-10-16T01:24:49.553823" elapsed="0.655110"/>
</kw>
<msg time="2026-10-16T01:24:50.209093" 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-10-16T01:24:49.553130" elapsed="0.656036"/>
</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-10-16T01:24:49.552747" elapsed="0.656526"/>
</kw>
<msg time="2026-10-16T01:24:50.209331" 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-10-16T01:24:49.552257" elapsed="0.657136"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:50.210288" 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-10-16T01:24:50.211069" elapsed="0.000193"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:50.211456" elapsed="0.000145"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:24:50.209824" elapsed="0.001843"/>
</kw>
<msg time="2026-10-16T01:24:50.211810" 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-10-16T01:24:49.551386" elapsed="0.660459"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:50.212449" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:50.212136" elapsed="0.000385"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-10-16T01:24:50.212576" elapsed="0.000037"/>
</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-10-16T01:24:49.550626" elapsed="0.662127"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:24:49.550455" elapsed="0.662349"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:50.213943" level="INFO">${member_ip} = 10.30.170.14</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-10-16T01:24:50.213621" elapsed="0.000358"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:50.214972" 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-10-16T01:24:50.215097" 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-10-16T01:24:50.214790" elapsed="0.000342"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:50.220126" elapsed="0.000068"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:50.219116" elapsed="0.001161"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:50.219053" elapsed="0.001345"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:50.221541" 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-10-16T01:24:50.221982" 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-10-16T01:24:50.220924" elapsed="0.001246"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:50.223781" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.14" 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-10-16T01:24:50.222655" elapsed="0.001369"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:50.225775" level="INFO">${conn_id} = 592</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-10-16T01:24:50.224532" elapsed="0.001429"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:24:50.227876" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:24:50.227947" 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-10-16T01:24:50.227595" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:50.228168" elapsed="0.000288"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:24:50.229406" level="INFO">Logging into '10.30.170.14:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:24:50.876569" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-194-generic x86_64)

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

 System information as of Fri Oct 16 01:24:50 UTC 2026

  System load:  0.11               Processes:             121
  Usage of /:   14.0% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.14
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:21:09 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:24:50.229167" elapsed="0.647624"/>
</kw>
<msg time="2026-10-16T01:24:50.876898" 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-10-16T01:24:50.228683" elapsed="0.648327"/>
</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-10-16T01:24:50.226533" elapsed="0.650790"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:24:50.878588" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-10-16T01:24:50.891514" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-10-16T01:24:50.891927" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:24:50.892145" 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-10-16T01:24:50.877932" elapsed="0.014372"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:50.892765" elapsed="0.000733"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:50.895246" 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-10-16T01:24:50.894455" elapsed="0.001027"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:24:50.896131" elapsed="0.000044"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:50.895741" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:50.895644" elapsed="0.000699"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:24:50.897065" elapsed="0.000084"/>
</return>
<status status="PASS" start="2026-10-16T01:24:50.896541" elapsed="0.000671"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:50.896486" elapsed="0.000834"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:24:50.897439" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:50.899724" 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-10-16T01:24:50.900646" elapsed="0.000404"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:50.901384" elapsed="0.000234"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:24:50.898221" elapsed="0.003531"/>
</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-10-16T01:24:50.217829" elapsed="0.684205"/>
</kw>
<msg time="2026-10-16T01:24:50.902179" 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-10-16T01:24:50.216911" elapsed="0.685339"/>
</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-10-16T01:24:50.216015" elapsed="0.686336"/>
</kw>
<msg time="2026-10-16T01:24:50.902693" 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-10-16T01:24:50.215340" elapsed="0.687481"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:50.903695" 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-10-16T01:24:50.904389" elapsed="0.000204"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:50.904848" elapsed="0.000127"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:24:50.903207" elapsed="0.001834"/>
</kw>
<msg time="2026-10-16T01:24:50.905158" 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-10-16T01:24:50.214249" elapsed="0.690941"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:50.905882" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:50.905519" elapsed="0.000418"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-10-16T01:24:50.905991" elapsed="0.000037"/>
</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-10-16T01:24:50.213161" elapsed="0.692973"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:24:50.212932" elapsed="0.693248"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:50.907370" level="INFO">${member_ip} = 10.30.170.84</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-10-16T01:24:50.907072" elapsed="0.000332"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:50.908412" 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-10-16T01:24:50.908610" 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-10-16T01:24:50.908236" elapsed="0.000411"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:50.913319" elapsed="0.000062"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:50.912403" elapsed="0.001072"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:50.912346" elapsed="0.001242"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:50.914615" 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-10-16T01:24:50.915033" 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-10-16T01:24:50.914059" elapsed="0.001138"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:50.916545" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.84" 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-10-16T01:24:50.915646" elapsed="0.001182"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:50.918288" level="INFO">${conn_id} = 595</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-10-16T01:24:50.917243" elapsed="0.001209"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:24:50.920567" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:24:50.920666" 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-10-16T01:24:50.920187" elapsed="0.000595"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:50.921054" elapsed="0.000424"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:24:50.922935" level="INFO">Logging into '10.30.170.84:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:24:51.537860" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-194-generic x86_64)

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

 System information as of Fri Oct 16 01:24:51 UTC 2026

  System load:  0.08               Processes:             121
  Usage of /:   14.2% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.84
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:21:10 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:24:50.922566" elapsed="0.615631"/>
</kw>
<msg time="2026-10-16T01:24:51.538305" 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-10-16T01:24:50.921819" elapsed="0.616600"/>
</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-10-16T01:24:50.919108" elapsed="0.619714"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:24:51.540181" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-10-16T01:24:51.553418" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-10-16T01:24:51.553777" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:24:51.553966" 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-10-16T01:24:51.539415" elapsed="0.014694"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:51.554422" elapsed="0.000673"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:51.556493" 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-10-16T01:24:51.555876" elapsed="0.000794"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:24:51.557198" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:51.556869" elapsed="0.000415"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:51.556815" 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-10-16T01:24:51.557826" elapsed="0.000071"/>
</return>
<status status="PASS" start="2026-10-16T01:24:51.557529" elapsed="0.000418"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:51.557485" elapsed="0.000547"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:24:51.558134" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:51.559578" elapsed="0.000493"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:24:51.560354" elapsed="0.000242"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:51.560858" 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-10-16T01:24:51.558756" elapsed="0.002333"/>
</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-10-16T01:24:50.911214" elapsed="0.650088"/>
</kw>
<msg time="2026-10-16T01:24:51.561414" 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-10-16T01:24:50.910216" elapsed="0.651270"/>
</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-10-16T01:24:50.909648" elapsed="0.651917"/>
</kw>
<msg time="2026-10-16T01:24:51.561604" 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-10-16T01:24:50.908961" elapsed="0.652688"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:51.562274" elapsed="0.000305"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:24:51.562796" elapsed="0.000140"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:51.563076" elapsed="0.000087"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:24:51.561940" elapsed="0.001269"/>
</kw>
<msg time="2026-10-16T01:24:51.563291" 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-10-16T01:24:50.907688" elapsed="0.655627"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:51.564038" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:51.563585" elapsed="0.000492"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-10-16T01:24:51.564116" elapsed="0.000026"/>
</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-10-16T01:24:50.906548" elapsed="0.657670"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:24:50.906305" elapsed="0.657999"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:24:49.550352" elapsed="2.013994"/>
</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-10-16T01:24:49.548435" elapsed="2.015973"/>
</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-10-16T01:24:51.564583" elapsed="0.000233"/>
</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-10-16T01:24:51.570423" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:51.570335" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:51.570317" elapsed="0.000184"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:51.570846" 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-10-16T01:24:51.570940" 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-10-16T01:24:51.570713" elapsed="0.000252"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:51.571388" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:51.571150" elapsed="0.000278"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:51.571862" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:51.571628" elapsed="0.000274"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:51.572610" 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-10-16T01:24:51.572401" elapsed="0.000358">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-10-16T01:24:51.572857" level="INFO">${status} = FAIL</msg>
<msg time="2026-10-16T01:24:51.572898" 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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:51.572055" elapsed="0.000864"/>
</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-10-16T01:24:51.573199" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:51.572987" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:51.572970" elapsed="0.000320"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:51.573977" level="INFO">${ip_address} = 10.30.170.180</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_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-10-16T01:24:51.573767" elapsed="0.000235"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-10-16T01:24:51.574044" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:24:51.574167" level="INFO">${odl_ip} = 10.30.170.180</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-10-16T01:24:51.573509" elapsed="0.000681"/>
</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-10-16T01:24:51.574361" elapsed="0.000355"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:51.575074" level="INFO">index=598
host=10.30.170.180
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-10-16T01:24:51.575164" level="INFO">${karaf_connection_object} = index=598
host=10.30.170.180
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-10-16T01:24:51.574932" elapsed="0.000256"/>
</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-10-16T01:24:51.575347" elapsed="0.000257"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-10-16T01:24:51.576009" level="INFO">Logging into '10.30.170.180:8101' as 'karaf'.</msg>
<msg time="2026-10-16T01:24:51.831261" 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-10-16T01:24:51.575804" elapsed="0.255600"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:51.833286" elapsed="0.000354"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:24:51.833858" elapsed="0.000169"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:51.834184" 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-10-16T01:24:51.832590" elapsed="0.001743"/>
</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-10-16T01:24:51.831903" elapsed="0.002476"/>
</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-10-16T01:24:51.570090" elapsed="0.264338"/>
</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-10-16T01:24:51.565547" elapsed="0.268951"/>
</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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:51.565156" elapsed="0.269396"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:24:51.565011" elapsed="0.269583"/>
</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-10-16T01:24:51.839978" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:51.839876" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:51.839850" elapsed="0.000200"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:51.840385" 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-10-16T01:24:51.840500" 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-10-16T01:24:51.840254" elapsed="0.000274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:51.840999" level="INFO">{1: 598}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:51.840747" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:51.841473" level="INFO">2</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:51.841228" elapsed="0.000290"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:51.842245" 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-10-16T01:24:51.842048" elapsed="0.000312">Dictionary does not contain key '2'.</status>
</kw>
<msg time="2026-10-16T01:24:51.842478" level="INFO">${status} = FAIL</msg>
<msg time="2026-10-16T01:24:51.842522" 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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:51.841672" elapsed="0.000872"/>
</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-10-16T01:24:51.842844" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:51.842615" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:51.842597" elapsed="0.000338"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:51.843623" level="INFO">${ip_address} = 10.30.170.14</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_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-10-16T01:24:51.843360" elapsed="0.000288"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-10-16T01:24:51.843692" elapsed="0.000048"/>
</return>
<msg time="2026-10-16T01:24:51.843844" level="INFO">${odl_ip} = 10.30.170.14</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-10-16T01:24:51.843116" elapsed="0.000751"/>
</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-10-16T01:24:51.844039" elapsed="0.000346"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:51.844799" level="INFO">index=600
host=10.30.170.14
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-10-16T01:24:51.844893" level="INFO">${karaf_connection_object} = index=600
host=10.30.170.14
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-10-16T01:24:51.844627" elapsed="0.000291"/>
</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-10-16T01:24:51.845132" elapsed="0.000256"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-10-16T01:24:51.845831" level="INFO">Logging into '10.30.170.14:8101' as 'karaf'.</msg>
<msg time="2026-10-16T01:24:52.105923" 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-10-16T01:24:51.845587" elapsed="0.260461"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:52.107461" 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-10-16T01:24:52.107991" elapsed="0.000154"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:52.108282" elapsed="0.000093"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:24:52.107078" elapsed="0.001344"/>
</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-10-16T01:24:52.106419" elapsed="0.002068"/>
</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-10-16T01:24:51.839589" elapsed="0.268950"/>
</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-10-16T01:24:51.835253" elapsed="0.273339"/>
</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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:51.834870" elapsed="0.273786"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:24:51.834726" elapsed="0.274000"/>
</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-10-16T01:24:52.114010" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:52.113891" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:52.113864" elapsed="0.000241"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:52.114506" 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-10-16T01:24:52.114605" 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-10-16T01:24:52.114328" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:52.115080" level="INFO">{1: 598, 2: 600}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:52.114839" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:52.115567" level="INFO">3</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:52.115304" elapsed="0.000303"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:52.116311" 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-10-16T01:24:52.116123" elapsed="0.000295">Dictionary does not contain key '3'.</status>
</kw>
<msg time="2026-10-16T01:24:52.116535" level="INFO">${status} = FAIL</msg>
<msg time="2026-10-16T01:24:52.116580" 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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:52.115777" elapsed="0.000833"/>
</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-10-16T01:24:52.116909" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:52.116682" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:52.116665" elapsed="0.000333"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:52.117722" level="INFO">${ip_address} = 10.30.170.84</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_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-10-16T01:24:52.117418" elapsed="0.000330"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-10-16T01:24:52.117792" elapsed="0.000031"/>
</return>
<msg time="2026-10-16T01:24:52.117922" level="INFO">${odl_ip} = 10.30.170.84</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-10-16T01:24:52.117174" elapsed="0.000770"/>
</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-10-16T01:24:52.118115" elapsed="0.000320"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:52.118817" level="INFO">index=602
host=10.30.170.84
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-10-16T01:24:52.118906" level="INFO">${karaf_connection_object} = index=602
host=10.30.170.84
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-10-16T01:24:52.118661" elapsed="0.000268"/>
</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-10-16T01:24:52.119085" elapsed="0.000236"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-10-16T01:24:52.119730" level="INFO">Logging into '10.30.170.84:8101' as 'karaf'.</msg>
<msg time="2026-10-16T01:24:52.433674" 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-10-16T01:24:52.119514" elapsed="0.314287"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:52.435152" elapsed="0.000324"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:24:52.435659" elapsed="0.000174"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:52.435972" elapsed="0.000094"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:24:52.434790" elapsed="0.001323"/>
</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-10-16T01:24:52.434141" elapsed="0.002014"/>
</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-10-16T01:24:52.113607" elapsed="0.322594"/>
</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-10-16T01:24:52.109344" elapsed="0.326899"/>
</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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:52.108972" elapsed="0.327317"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:24:52.108831" elapsed="0.327492"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-10-16T01:24:51.564877" elapsed="0.871481"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-10-16T01:24:49.527582" elapsed="2.908836"/>
</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-10-16T01:24:52.437289" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:52.437196" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:52.437175" elapsed="0.000183"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:52.439243" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:52.439160" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:52.439144" elapsed="0.000161"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:24:52.440189" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:24:52.439853" elapsed="0.000362"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:52.440753" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:52.440433" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:24:52.440820" elapsed="0.000030"/>
</return>
<msg time="2026-10-16T01:24:52.440953" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:24:52.439528" elapsed="0.001448"/>
</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-10-16T01:24:52.443358" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:52.443273" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:52.443256" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:52.444506" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:52.444385" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:52.444369" elapsed="0.000278"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:52.445192" level="INFO">${karaf_connection_index} = 598</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:24:52.444819" elapsed="0.000412"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:52.445868" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:24:52.445613" elapsed="0.000293"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:24:52.598135" 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-10-16T01:24:52.564472" elapsed="0.033871"/>
</kw>
<msg time="2026-10-16T01:24:52.598540" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:24:52.598609" 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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:52.446127" elapsed="0.152533"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:24:52.661141" 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 "- "m "a "n "g "a "n "e "s "e "/ "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 "[78Cn "[A[78Cd
 "_ "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-10-16T01:24:52.600380" elapsed="0.060945"/>
</kw>
<msg time="2026-10-16T01:24:52.661488" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:24:52.661556" 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 "- "m "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:52.598961" elapsed="0.062643"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:52.662115" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:52.661817" elapsed="0.000435"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:52.661784" elapsed="0.000502"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:52.663022" 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 "- "m "a "n "g "a "n "e "s "e "/ "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 "[78Cn "[A[78Cd
 "_ "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-10-16T01:24:52.662495" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:52.663524" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:52.663263" elapsed="0.000402"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:52.663245" elapsed="0.000446"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:24:52.663756" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:52.665951" elapsed="0.000285"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:24:52.666505" elapsed="0.000171"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:52.666936" elapsed="0.000102"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:24:52.665235" 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-10-16T01:24:52.664125" elapsed="0.003203"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:24:52.444184" elapsed="0.223223"/>
</kw>
<msg time="2026-10-16T01:24:52.667511" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:52.667552" 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 "- "m "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:52.443588" elapsed="0.223998"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:24:52.667831" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-10-16T01:24:52.667657" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:52.667640" elapsed="0.000274"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:24:52.668299" 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-10-16T01:24:52.668670" elapsed="0.000049"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:24:52.668764" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:24:52.443040" elapsed="0.225813"/>
</kw>
<msg time="2026-10-16T01:24:52.668942" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:52.668983" 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 "- "m "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:52.441322" elapsed="0.227697"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:52.669309" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:52.669088" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:52.669072" elapsed="0.000309"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:24:52.441182" elapsed="0.228222"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:52.671989" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:52.671906" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:52.671889" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:52.673099" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:52.672996" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:52.672980" elapsed="0.000252"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:52.673785" level="INFO">${karaf_connection_index} = 600</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:24:52.673379" elapsed="0.000445"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:52.674282" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:24:52.674064" elapsed="0.000256"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:24:52.711936" 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-10-16T01:24:52.675883" elapsed="0.036277"/>
</kw>
<msg time="2026-10-16T01:24:52.712345" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:24:52.712411" 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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:52.674550" elapsed="0.037922"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:24:52.771235" 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 "- "m "a "n "g "a "n "e "s "e "/ "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 "[78Cn "[A[78Cd
 "_ "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-10-16T01:24:52.714045" elapsed="0.057362"/>
</kw>
<msg time="2026-10-16T01:24:52.771564" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:24:52.771631" 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 "- "m "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:52.712743" elapsed="0.058999"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:52.772160" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:52.771909" elapsed="0.000386"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:52.771888" elapsed="0.000432"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:52.773014" 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 "- "m "a "n "g "a "n "e "s "e "/ "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 "[78Cn "[A[78Cd
 "_ "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-10-16T01:24:52.772515" elapsed="0.000619"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:52.773505" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:52.773250" elapsed="0.000392"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:52.773232" elapsed="0.000435"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:24:52.773725" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:52.775691" 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-10-16T01:24:52.776224" elapsed="0.000138"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:52.776586" 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-10-16T01:24:52.775048" elapsed="0.001822"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:24:52.774002" elapsed="0.002965"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:24:52.672792" elapsed="0.104250"/>
</kw>
<msg time="2026-10-16T01:24:52.777124" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:52.777163" 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 "- "m "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:52.672199" elapsed="0.104997"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:24:52.777347" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:24:52.777264" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:52.777248" elapsed="0.000175"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:24:52.777834" 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-10-16T01:24:52.778181" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:24:52.778246" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:24:52.671633" elapsed="0.106696"/>
</kw>
<msg time="2026-10-16T01:24:52.778411" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:52.778465" 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 "- "m "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:52.669726" elapsed="0.108773"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:52.778832" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:52.778567" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:52.778551" elapsed="0.000354"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:24:52.669560" elapsed="0.109366"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:52.781357" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:52.781273" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:52.781256" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:52.782493" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:52.782373" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:52.782357" elapsed="0.000312"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:52.783195" 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-10-16T01:24:52.782839" elapsed="0.000395"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:52.783717" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:24:52.783482" elapsed="0.000275"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:24:52.819226" 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-10-16T01:24:52.785269" elapsed="0.034125"/>
</kw>
<msg time="2026-10-16T01:24:52.819556" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:24:52.819621" 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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:52.783977" elapsed="0.035691"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:24:52.890596" 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 "- "m "a "n "g "a "n "e "s "e "/ "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 "[78Cn "[A[78Cd
 "_ "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-10-16T01:24:52.821247" elapsed="0.069560"/>
</kw>
<msg time="2026-10-16T01:24:52.890953" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:24:52.891019" 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 "- "m "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:52.819945" elapsed="0.071120"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:52.891487" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:52.891220" elapsed="0.000404"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:52.891201" elapsed="0.000448"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:52.892334" 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 "- "m "a "n "g "a "n "e "s "e "/ "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 "[78Cn "[A[78Cd
 "_ "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-10-16T01:24:52.891854" elapsed="0.000617"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:52.892858" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:52.892590" elapsed="0.000403"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:52.892572" elapsed="0.000446"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:24:52.893050" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:52.895098" elapsed="0.000274"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:24:52.895616" elapsed="0.000305"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:52.896108" elapsed="0.000092"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:24:52.894429" elapsed="0.001870"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:24:52.893316" elapsed="0.003078"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:24:52.782172" elapsed="0.114322"/>
</kw>
<msg time="2026-10-16T01:24:52.896575" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:52.896615" 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 "- "m "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:52.781605" elapsed="0.115044"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:24:52.896831" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:24:52.896744" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:52.896727" elapsed="0.000181"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:24:52.897259" 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-10-16T01:24:52.897680" elapsed="0.000060"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:24:52.897789" 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-10-16T01:24:52.781037" elapsed="0.116840"/>
</kw>
<msg time="2026-10-16T01:24:52.897960" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:52.898000" 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 "- "m "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:52.779173" elapsed="0.118860"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:52.898316" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:52.898099" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:52.898083" elapsed="0.000303"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:24:52.779035" elapsed="0.119372"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:24:52.441032" elapsed="0.457404"/>
</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-10-16T01:24:52.438930" elapsed="0.459614"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-10-16T01:24:52.437015" elapsed="0.461589"/>
</kw>
<arg>KarafKeywords.Log_Test_Suite_Start_To_Controller_Karaf</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:52.436582" elapsed="0.462065"/>
</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-10-16T01:24:49.524129" elapsed="3.374585"/>
</kw>
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-10-16T01:24:52.899553" 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-10-16T01:24:52.899236" elapsed="0.000341"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="PASS" start="2026-10-16T01:24:52.899744" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:24:52.899641" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:52.899625" elapsed="0.000194"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:52.900001" elapsed="0.000019"/>
</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-10-16T01:24:52.900168" elapsed="0.000018"/>
</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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:52.900333" elapsed="0.000018"/>
</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-10-16T01:24:52.900536" elapsed="0.000018"/>
</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-10-16T01:24:52.900828" elapsed="0.000022"/>
</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-10-16T01:24:52.898965" elapsed="0.001941"/>
</kw>
<status status="PASS" start="2026-10-16T01:24:49.523779" elapsed="3.377175"/>
</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-10-16T01:24:52.902391" elapsed="0.000217"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:24:52.902143" 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-10-16T01:24:52.903584" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:52.903499" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:52.903481" elapsed="0.000166"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:52.905727" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:52.905627" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:52.905610" elapsed="0.000180"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:24:52.906679" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:24:52.906341" elapsed="0.000388"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:52.907152" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:52.906882" elapsed="0.000293"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:24:52.907251" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:24:52.907378" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:24:52.905992" elapsed="0.001408"/>
</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-10-16T01:24:52.909856" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:52.909772" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:52.909755" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:52.911017" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:52.910931" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:52.910914" elapsed="0.000166"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:52.911458" level="INFO">${karaf_connection_index} = 598</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:24:52.911220" elapsed="0.000264"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:52.911843" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:24:52.911643" elapsed="0.000225"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:24:52.945935" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:24:52.912431" elapsed="0.033685"/>
</kw>
<msg time="2026-10-16T01:24:52.946300" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:24:52.946342" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:52.912021" elapsed="0.034354"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:24:53.017598" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:24:52.947006" elapsed="0.070804"/>
</kw>
<msg time="2026-10-16T01:24:53.017972" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:24:53.018013" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:52.946558" elapsed="0.071488"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:53.018336" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:53.018123" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:53.018102" elapsed="0.000327"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:53.019006" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:24:53.018642" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:53.019340" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:53.019144" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:53.019128" elapsed="0.000304"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:24:53.019483" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:53.022012" 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-10-16T01:24:53.023779" elapsed="0.000466"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:53.025637" 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-10-16T01:24:53.020288" elapsed="0.005749"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:24:53.019795" elapsed="0.006358"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:24:52.910645" elapsed="0.115634"/>
</kw>
<msg time="2026-10-16T01:24:53.026364" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:53.026403" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:52.910064" elapsed="0.116393"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:24:53.026616" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:24:53.026528" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:53.026511" elapsed="0.000182"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:24:53.027091" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:53.027388" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:24:53.027466" 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-10-16T01:24:52.909472" elapsed="0.118081"/>
</kw>
<msg time="2026-10-16T01:24:53.027638" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:53.027677" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:52.907777" elapsed="0.119951"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:53.028014" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:53.027799" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:53.027783" elapsed="0.000302"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:24:52.907619" elapsed="0.120488"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:53.030601" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:53.030517" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:53.030500" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:53.031784" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:53.031673" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:53.031655" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:53.032212" level="INFO">${karaf_connection_index} = 600</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:24:53.031988" elapsed="0.000249"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:53.032593" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:24:53.032394" elapsed="0.000223"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:24:53.069091" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:24:53.033195" elapsed="0.036320"/>
</kw>
<msg time="2026-10-16T01:24:53.069802" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:24:53.069846" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:53.032788" elapsed="0.037093"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:24:53.134956" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:24:53.070924" elapsed="0.064224"/>
</kw>
<msg time="2026-10-16T01:24:53.135308" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:24:53.135348" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:53.070218" elapsed="0.065164"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:53.135814" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:53.135512" elapsed="0.000486"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:53.135477" elapsed="0.000556"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:53.136987" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:24:53.136223" elapsed="0.000843"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:53.137364" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:53.137127" elapsed="0.000343"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:53.137110" elapsed="0.000384"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:24:53.137533" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:53.141041" elapsed="0.001127"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:24:53.144495" elapsed="0.000735"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:53.146582" 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-10-16T01:24:53.138510" elapsed="0.008510"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:24:53.137939" elapsed="0.009218"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:24:53.031399" elapsed="0.115882"/>
</kw>
<msg time="2026-10-16T01:24:53.147397" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:53.147458" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:53.030826" elapsed="0.116670"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:24:53.147850" elapsed="0.000053"/>
</return>
<status status="PASS" start="2026-10-16T01:24:53.147606" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:53.147577" elapsed="0.000395"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:24:53.148453" elapsed="0.000030"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:53.148847" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:24:53.148916" 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-10-16T01:24:53.030209" elapsed="0.118800"/>
</kw>
<msg time="2026-10-16T01:24:53.149101" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:53.149142" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:53.028356" elapsed="0.120822"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:53.149501" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:53.149251" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:53.149234" elapsed="0.000340"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:24:53.028219" elapsed="0.121377"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:53.152630" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:53.152526" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:53.152508" 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-10-16T01:24:53.153909" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:53.153823" elapsed="0.000133"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:53.153806" elapsed="0.000170"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:53.154370" 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-10-16T01:24:53.154125" elapsed="0.000271"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:53.154872" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:24:53.154656" elapsed="0.000240"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:24:53.188401" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:24:53.155536" elapsed="0.033072"/>
</kw>
<msg time="2026-10-16T01:24:53.188825" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:24:53.188869" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:53.155100" elapsed="0.033804"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:24:53.250663" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:24:53.189531" elapsed="0.061346"/>
</kw>
<msg time="2026-10-16T01:24:53.251051" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:24:53.251095" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:53.189073" elapsed="0.062056"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:53.251429" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:53.251217" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:53.251193" elapsed="0.000354"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:53.252117" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:24:53.251764" elapsed="0.000431"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:53.252471" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:53.252256" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:53.252240" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:24:53.252604" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:53.255330" 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-10-16T01:24:53.257084" elapsed="0.000477"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:53.258788" 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-10-16T01:24:53.253664" elapsed="0.005516"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:24:53.252952" elapsed="0.006350"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:24:53.153539" elapsed="0.105839"/>
</kw>
<msg time="2026-10-16T01:24:53.259481" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:53.259525" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:53.152917" elapsed="0.106642"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:24:53.259742" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-16T01:24:53.259629" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:53.259611" 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-10-16T01:24:53.260132" 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-10-16T01:24:53.260427" elapsed="0.000041"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:24:53.260511" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:24:53.152145" elapsed="0.108502"/>
</kw>
<msg time="2026-10-16T01:24:53.260857" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:53.260898" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:53.150021" elapsed="0.110910"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:53.261216" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:53.260999" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:53.260983" elapsed="0.000303"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:24:53.149859" elapsed="0.111448"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:24:52.907473" elapsed="0.353862"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:24:52.905321" elapsed="0.356074"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:24:52.903226" elapsed="0.358267"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:52.902833" elapsed="0.358713"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:24:52.901592" elapsed="0.360010"/>
</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-10-16T01:24:53.269624" elapsed="0.000215"/>
</kw>
<msg time="2026-10-16T01:24:53.269884" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:53.269074" elapsed="0.000861"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:24:53.268671" elapsed="0.001331"/>
</kw>
<msg time="2026-10-16T01:24:53.270042" 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-10-16T01:24:53.265834" elapsed="0.004247"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:24:53.265455" elapsed="0.004689"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:53.270657" 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-10-16T01:24:53.270384" elapsed="0.000330"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:24:53.273939" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:24:53.273385" elapsed="0.000581"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:53.274400" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:53.274120" elapsed="0.000304"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:24:53.274483" elapsed="0.000028"/>
</return>
<msg time="2026-10-16T01:24:53.274614" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:24:53.273028" elapsed="0.001609"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:24:53.274805" elapsed="0.000132"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:24:53.275408" 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-10-16T01:24:53.275102" elapsed="0.000348"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:53.275847" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:53.275599" elapsed="0.000273"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:53.276241" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:53.276012" elapsed="0.000254"/>
</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-10-16T01:24:53.278406" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:24:53.278137" elapsed="0.000294"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:24:53.278488" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:24:53.278624" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:24:53.277823" elapsed="0.000834"/>
</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-10-16T01:24:53.296870" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:24:53.296523" elapsed="0.000373"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:24:53.297669" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:24:53.297370" elapsed="0.000418">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:24:53.297875" 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-10-16T01:24:53.297053" elapsed="0.000844"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:24:53.298370" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:24:53.298065" elapsed="0.000330"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:24:53.298689" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:24:53.299010" 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-10-16T01:24:53.298576" elapsed="0.000458"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:53.299466" 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-10-16T01:24:53.299225" 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-10-16T01:24:53.300472" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:53.300223" elapsed="0.000291"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:24:53.300982" 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-10-16T01:24:53.300718" 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-10-16T01:24:53.301286" elapsed="0.000020"/>
</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-10-16T01:24:53.301488" 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-10-16T01:24:53.301668" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:24:53.301158" elapsed="0.000576"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:24:53.301048" elapsed="0.000713"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:24:53.301800" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:24:53.301927" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:24:53.299848" elapsed="0.002102"/>
</kw>
<status status="PASS" start="2026-10-16T01:24:53.299569" elapsed="0.002409"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:53.302142" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:53.302001" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:53.299552" elapsed="0.002660"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:24:53.302809" 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-10-16T01:24:53.302367" elapsed="0.000467"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:24:53.302876" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:24:53.296012" elapsed="0.006963"/>
</kw>
<msg time="2026-10-16T01:24:53.303057" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:53.291628" elapsed="0.011517"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:53.307413" elapsed="0.000085"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:53.311628" elapsed="0.000115"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:53.315979" elapsed="0.000065"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:53.316367" 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-10-16T01:24:53.316843" 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-10-16T01:24:53.317349" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:53.317202" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:24:53.317188" 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-10-16T01:24:53.317592" 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-10-16T01:24:53.317788" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:53.317948" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:24:53.317160" elapsed="0.000836"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:24:53.317036" elapsed="0.000993"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:53.318340" elapsed="0.000051"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:53.318503" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:24:53.318682" 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-10-16T01:24:53.289370" elapsed="0.029377"/>
</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-10-16T01:24:53.321102" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:24:53.320892" elapsed="0.000271">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:24:53.321346" 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-10-16T01:24:53.320447" elapsed="0.000940"/>
</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-10-16T01:24:53.322057" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:53.321537" elapsed="0.000650"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:24:53.322785" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:24:53.322480" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-10-16T01:24:53.322246" elapsed="0.000619"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:53.321498" elapsed="0.001419"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:24:53.323887" 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-10-16T01:24:53.323226" elapsed="0.000705"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:24:53.324019" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:24:53.324265" 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-manganese/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-10-16T01:24:53.319530" elapsed="0.004781"/>
</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-10-16T01:24:53.326521" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:24:53.326288" elapsed="0.000293">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:24:53.326812" 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-10-16T01:24:53.325893" elapsed="0.000963"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:24:53.327180" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-16T01:24:53.326987" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:53.326949" elapsed="0.000381"/>
</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-10-16T01:24:53.327675" elapsed="0.000133"/>
</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-10-16T01:24:53.328140" elapsed="0.000052"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:24:53.328278" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:24:53.328526" 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-manganese/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-10-16T01:24:53.325050" elapsed="0.003523"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:53.332286" 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-10-16T01:24:53.331945" elapsed="0.000448"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:53.333171" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:53.332845" 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-10-16T01:24:53.341073" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:24:53.341133" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:24:53.341362" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:24:53.333754" elapsed="0.008070">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:24:53.333390" elapsed="0.008594">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:24:53.342316" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:53.342049" elapsed="0.000350"/>
</branch>
<status status="FAIL" start="2026-10-16T01:24:53.333349" elapsed="0.009117">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:24:53.343217" elapsed="0.000067"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:53.343565" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:53.343471" elapsed="0.000153"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:24:53.343417" elapsed="0.000259"/>
</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-10-16T01:24:53.344021" elapsed="0.000051"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:24:53.344160" elapsed="0.000026"/>
</return>
<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="FAIL" start="2026-10-16T01:24:53.329299" elapsed="0.014993">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:53.344531" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:24:53.280843" elapsed="0.063846">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:24:53.344977" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:53.344818" elapsed="0.000539"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:24:53.344802" elapsed="0.000581"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:24:53.345414" elapsed="0.000013"/>
</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="FAIL" start="2026-10-16T01:24:53.280163" elapsed="0.065356">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:24:53.278744" elapsed="0.066837">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:24:53.278726" elapsed="0.066883">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:53.345892" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:24:53.346097" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:53.346267" elapsed="0.000018"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:24:53.346483" elapsed="0.000021"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:24:53.346687" elapsed="0.000037"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:24:53.346869" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:24:53.347029" elapsed="0.000018"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:24:53.347086" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:24:53.277302" elapsed="0.069878">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:24:53.347239" elapsed="0.000014"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:24:53.276660" elapsed="0.070665">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:53.347554" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:53.347401" elapsed="0.000203"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:53.347832" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:53.347626" elapsed="0.000528"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:53.348347" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:53.348179" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:24:53.347386" elapsed="0.001034"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:24:53.276493" elapsed="0.071984">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:24:53.276307" elapsed="0.072226">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:24:53.348583" elapsed="0.000019"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:24:53.272335" elapsed="0.076355">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:53.348906" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:53.349122" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:53.348984" elapsed="0.000183"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:24:53.348969" elapsed="0.000219"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:53.349315" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:53.349500" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:24:53.349558" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:24:53.271606" elapsed="0.078042">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:24:53.271381" elapsed="0.078381">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:24:53.271266" elapsed="0.078549">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:24:53.270928" elapsed="0.078968">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:53.350147" elapsed="0.000023"/>
</kw>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:24:53.261841" elapsed="0.088412">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:24:52.901036" elapsed="0.449366">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:24:53.352118" elapsed="0.000226"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:24:53.351869" 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-10-16T01:24:53.353379" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:53.353287" elapsed="0.000136"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:53.353269" 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-10-16T01:24:53.355616" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:53.355528" elapsed="0.000131"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:53.355511" elapsed="0.000168"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:24:53.356607" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:24:53.356258" elapsed="0.000419"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:53.357120" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:53.356848" elapsed="0.000296"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:24:53.357185" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:24:53.357311" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:24:53.355904" elapsed="0.001429"/>
</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-10-16T01:24:53.359786" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:53.359680" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:53.359663" elapsed="0.000185"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:53.360955" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:53.360870" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:53.360853" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:53.361383" level="INFO">${karaf_connection_index} = 598</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:24:53.361156" elapsed="0.000251"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:53.361783" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:24:53.361579" elapsed="0.000228"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:24:53.394760" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:24:53.362364" elapsed="0.032578"/>
</kw>
<msg time="2026-10-16T01:24:53.395106" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:24:53.395147" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:53.361958" elapsed="0.033223"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:24:53.454182" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:24:53.395812" elapsed="0.058566"/>
</kw>
<msg time="2026-10-16T01:24:53.454567" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:24:53.454610" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:53.395345" elapsed="0.059300"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:53.454955" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:53.454746" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:53.454725" elapsed="0.000326"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:53.455591" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:24:53.455233" elapsed="0.000438"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:53.455949" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:53.455750" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:53.455733" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:24:53.456077" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:53.458589" elapsed="0.002099"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:24:53.461939" elapsed="0.000473"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:53.463616" 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-10-16T01:24:53.456902" elapsed="0.007146"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:24:53.456351" elapsed="0.007815"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:24:53.360583" elapsed="0.103658"/>
</kw>
<msg time="2026-10-16T01:24:53.464322" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:53.464361" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:53.359993" elapsed="0.104401"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:24:53.464564" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:24:53.464479" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:53.464462" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:24:53.464988" 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-10-16T01:24:53.465283" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:24:53.465347" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:24:53.359348" elapsed="0.106101"/>
</kw>
<msg time="2026-10-16T01:24:53.465534" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:53.465572" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:53.357670" elapsed="0.107934"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:53.465910" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:53.465670" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:53.465655" elapsed="0.000326"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:24:53.357533" elapsed="0.108469"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:53.468351" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:53.468245" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:53.468228" 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-10-16T01:24:53.469948" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:53.469862" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:53.469845" elapsed="0.000166"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:53.470380" level="INFO">${karaf_connection_index} = 600</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:24:53.470154" elapsed="0.000251"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:53.470788" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:24:53.470582" elapsed="0.000230"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:24:53.506839" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:24:53.471383" elapsed="0.035653"/>
</kw>
<msg time="2026-10-16T01:24:53.507203" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:24:53.507249" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:53.470965" elapsed="0.036333"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:24:53.589690" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:24:53.508002" elapsed="0.081891"/>
</kw>
<msg time="2026-10-16T01:24:53.590057" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:24:53.590098" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:53.507492" elapsed="0.082688"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:53.590511" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:53.590263" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:53.590241" elapsed="0.000368"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:53.591168" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:24:53.590812" elapsed="0.000432"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:53.591512" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:53.591304" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:53.591288" elapsed="0.000319"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:24:53.591639" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:53.594180" 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-10-16T01:24:53.595918" elapsed="0.000454"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:53.597557" elapsed="0.000507"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:24:53.592475" elapsed="0.005657"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:24:53.591950" elapsed="0.006298"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:24:53.469577" elapsed="0.128747"/>
</kw>
<msg time="2026-10-16T01:24:53.598406" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:53.598461" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:53.468649" elapsed="0.129847"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:24:53.598650" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:24:53.598566" elapsed="0.000431"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:53.598549" elapsed="0.000474"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:24:53.599345" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:53.599660" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:24:53.599741" 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-10-16T01:24:53.467955" elapsed="0.131872"/>
</kw>
<msg time="2026-10-16T01:24:53.599912" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:53.599951" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:53.466243" elapsed="0.133741"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:53.600265" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:53.600052" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:53.600036" elapsed="0.000316"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:24:53.466110" elapsed="0.134264"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:53.602855" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:53.602768" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:53.602750" elapsed="0.000167"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:24:53.604014" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:53.603931" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:53.603915" elapsed="0.000161"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:24:53.604496" 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-10-16T01:24:53.604252" elapsed="0.000269"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:53.604879" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:24:53.604679" elapsed="0.000224"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:24:53.636070" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:24:53.605497" elapsed="0.030761"/>
</kw>
<msg time="2026-10-16T01:24:53.636445" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:24:53.636493" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:53.605054" elapsed="0.031490"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:24:53.690505" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:24:53.637238" elapsed="0.053484"/>
</kw>
<msg time="2026-10-16T01:24:53.690886" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:24:53.690931" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:53.636750" elapsed="0.054230"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:53.691292" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:53.691057" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:53.691037" elapsed="0.000355"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:53.692012" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:24:53.691612" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:53.692403" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:53.692175" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:53.692157" elapsed="0.000364"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:24:53.692552" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:53.695333" 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-10-16T01:24:53.697256" elapsed="0.000770"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:53.699346" elapsed="0.000603"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:24:53.693477" elapsed="0.006555"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:24:53.692905" elapsed="0.007256"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:24:53.603650" elapsed="0.096605"/>
</kw>
<msg time="2026-10-16T01:24:53.700359" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:53.700400" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:53.603062" elapsed="0.097388"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:24:53.700633" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-10-16T01:24:53.700523" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:53.700505" 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 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-10-16T01:24:53.701099" 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-10-16T01:24:53.701471" elapsed="0.000063"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:24:53.701581" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:24:53.602415" elapsed="0.099255"/>
</kw>
<msg time="2026-10-16T01:24:53.701911" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:24:53.701961" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:53.600641" elapsed="0.101369"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:53.702324" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:53.702085" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:53.702067" elapsed="0.000335"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:24:53.600503" elapsed="0.101921"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:24:53.357381" elapsed="0.345089"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:24:53.355214" elapsed="0.347332"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:24:53.353026" elapsed="0.349581"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:24:53.352577" elapsed="0.350074"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:24:53.351388" elapsed="0.351329"/>
</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-10-16T01:24:53.705643" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:24:53.705243" elapsed="0.000426"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:24:53.706118" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:24:53.705845" elapsed="0.000298"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:24:53.706197" elapsed="0.000028"/>
</return>
<msg time="2026-10-16T01:24:53.706330" 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-10-16T01:24:53.704864" elapsed="0.001489"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:53.708792" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:53.708510" elapsed="0.000353"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:53.708492" elapsed="0.000404"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:53.709259" 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-10-16T01:24:53.709368" 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-10-16T01:24:53.709109" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:53.709959" level="INFO">Attempting to execute command "sudo mn -c" on remote system "10.30.171.104" 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-10-16T01:24:53.709623" elapsed="0.000381"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:53.710553" level="INFO">${conn_id} = 613</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-10-16T01:24:53.710204" elapsed="0.000382"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:24:53.711532" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:24:53.711606" 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-10-16T01:24:53.711192" elapsed="0.000436"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:53.711794" elapsed="0.000339"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:24:53.713196" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:24:54.088407" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:24:00 UTC 2026

  System load:  0.01               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%

 * Canonical Workshop gives developers fast, composable, reproducible, and
   secure developer environments that are perfect for agentic workflows.

   https://ubuntu.com/workshop

Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:24:44 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:24:53.712934" elapsed="0.375629"/>
</kw>
<msg time="2026-10-16T01:24:54.088642" 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-10-16T01:24:53.712298" elapsed="0.376440"/>
</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-10-16T01:24:53.710823" elapsed="0.378022"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:24:54.089413" level="INFO">Executing command 'sudo mn -c'.</msg>
<msg time="2026-10-16T01:24:55.287337" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:24:55.287814" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:24:55.287914" 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-10-16T01:24:54.089165" elapsed="1.198806"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:55.288532" elapsed="0.000694"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:55.290555" 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-10-16T01:24:55.289851" 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-10-16T01:24:55.291141" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:55.290878" elapsed="0.000368"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:55.290825" 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-10-16T01:24:55.291612" elapsed="0.000069"/>
</return>
<status status="PASS" start="2026-10-16T01:24:55.291405" elapsed="0.000377"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:55.291372" elapsed="0.000460"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:24:55.291904" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:55.293638" elapsed="0.000696"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:24:55.294797" elapsed="0.000345"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:55.295537" elapsed="0.000250"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:24:55.292618" elapsed="0.003283"/>
</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-10-16T01:24:53.708028" elapsed="1.588037"/>
</kw>
<msg time="2026-10-16T01:24:55.296180" 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-10-16T01:24:53.707410" elapsed="1.588884"/>
</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-10-16T01:24:53.706949" elapsed="1.589538"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:55.301021" elapsed="0.000174"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:55.300462" elapsed="0.000812"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:55.300398" elapsed="0.000928"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:55.302148" 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-10-16T01:24:55.302355" 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-10-16T01:24:55.301849" elapsed="0.000559"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:55.303543" 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.104" 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-10-16T01:24:55.302879" elapsed="0.000759"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:55.304785" level="INFO">${conn_id} = 615</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-10-16T01:24:55.304057" elapsed="0.000783"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:24:55.307171" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:24:55.307326" 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-10-16T01:24:55.306567" elapsed="0.000807"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:55.307765" elapsed="0.000641"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:24:55.310217" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:24:55.712371" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:24:00 UTC 2026

  System load:  0.01               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%

 * Canonical Workshop gives developers fast, composable, reproducible, and
   secure developer environments that are perfect for agentic workflows.

   https://ubuntu.com/workshop

Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:24:54 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:24:55.309667" elapsed="0.402817"/>
</kw>
<msg time="2026-10-16T01:24:55.712548" 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-10-16T01:24:55.308825" elapsed="0.403786"/>
</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-10-16T01:24:55.305262" elapsed="0.407463"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:24:55.713136" 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-10-16T01:24:55.755856" level="INFO">Command exited with return code -1.</msg>
<msg time="2026-10-16T01:24:55.756021" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:24:55.756079" 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-10-16T01:24:55.712955" elapsed="0.043156"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:55.756348" elapsed="0.000385"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:55.757487" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:55.757081" elapsed="0.000462"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:24:55.758441" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:55.758246" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:55.757620" elapsed="0.000928"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:24:55.758767" elapsed="0.000054"/>
</return>
<status status="PASS" start="2026-10-16T01:24:55.758620" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:55.758599" elapsed="0.000330"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:24:55.758979" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:55.760449" 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-10-16T01:24:55.761240" elapsed="0.000244"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:55.761690" elapsed="0.000267"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:24:55.759565" elapsed="0.002466"/>
</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-10-16T01:24:55.299466" elapsed="0.462673"/>
</kw>
<msg time="2026-10-16T01:24:55.762215" 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-10-16T01:24:55.298003" elapsed="0.464286"/>
</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-10-16T01:24:55.296911" elapsed="0.465485"/>
</kw>
<arg>${tools_system}</arg>
<status status="PASS" start="2026-10-16T01:24:53.706573" elapsed="2.055921"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:24:55.763092" level="INFO">${ovs_opt} = </msg>
<var>${ovs_opt}</var>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:24:55.762738" elapsed="0.000389"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-10-16T01:24:55.764135" level="INFO">${ovs_opt} =   tcp:10.30.170.180:6640</msg>
<var>${ovs_opt}</var>
<arg>${ovs_opt}</arg>
<arg>${SPACE}tcp:${ODL_SYSTEM_${index}_IP}:${ovs_mgr_port}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-10-16T01:24:55.763623" elapsed="0.000547"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:55.764813" level="INFO">  tcp:10.30.170.180:6640</msg>
<arg>${ovs_opt}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:55.764471" elapsed="0.000401"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:24:55.763397" elapsed="0.001520"/>
</iter>
<iter>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-10-16T01:24:55.765915" level="INFO">${ovs_opt} =   tcp:10.30.170.180:6640  tcp:10.30.170.14:6640</msg>
<var>${ovs_opt}</var>
<arg>${ovs_opt}</arg>
<arg>${SPACE}tcp:${ODL_SYSTEM_${index}_IP}:${ovs_mgr_port}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-10-16T01:24:55.765238" elapsed="0.000718"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:55.766604" level="INFO">  tcp:10.30.170.180:6640  tcp:10.30.170.14:6640</msg>
<arg>${ovs_opt}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:55.766249" elapsed="0.000418"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:24:55.765039" elapsed="0.001695"/>
</iter>
<iter>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-10-16T01:24:55.767569" level="INFO">${ovs_opt} =   tcp:10.30.170.180:6640  tcp:10.30.170.14:6640  tcp:10.30.170.84:6640</msg>
<var>${ovs_opt}</var>
<arg>${ovs_opt}</arg>
<arg>${SPACE}tcp:${ODL_SYSTEM_${index}_IP}:${ovs_mgr_port}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-10-16T01:24:55.767062" elapsed="0.000545"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:55.768236" level="INFO">  tcp:10.30.170.180:6640  tcp:10.30.170.14:6640  tcp:10.30.170.84:6640</msg>
<arg>${ovs_opt}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:55.767915" elapsed="0.000383"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:24:55.766858" elapsed="0.001485"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:24:55.763208" elapsed="0.005176"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:55.771563" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:55.771178" elapsed="0.000463"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:55.771152" elapsed="0.000523"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:55.772183" 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-10-16T01:24:55.772319" 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-10-16T01:24:55.771986" elapsed="0.000371"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:55.773110" level="INFO">Attempting to execute command "sudo ovs-vsctl set-manager   tcp:10.30.170.180:6640  tcp:10.30.170.14:6640  tcp:10.30.170.84:6640" on remote system "10.30.171.104" 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-10-16T01:24:55.772655" elapsed="0.000520"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:55.773922" 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-10-16T01:24:55.773450" elapsed="0.000509"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:24:55.775208" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:24:55.775309" 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-10-16T01:24:55.774821" elapsed="0.000521"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:55.775580" elapsed="0.000452"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:24:55.777259" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:24:56.158690" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:24:00 UTC 2026

  System load:  0.01               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%

 * Canonical Workshop gives developers fast, composable, reproducible, and
   secure developer environments that are perfect for agentic workflows.

   https://ubuntu.com/workshop

Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:24:55 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:24:55.776912" elapsed="0.382011"/>
</kw>
<msg time="2026-10-16T01:24:56.159021" 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-10-16T01:24:55.776324" elapsed="0.382806"/>
</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-10-16T01:24:55.774248" elapsed="0.385013"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:24:56.159947" level="INFO">Executing command 'sudo ovs-vsctl set-manager   tcp:10.30.170.180:6640  tcp:10.30.170.14:6640  tcp:10.30.170.84:6640'.</msg>
<msg time="2026-10-16T01:24:56.213362" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:24:56.213539" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:24:56.213594" 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-10-16T01:24:56.159622" elapsed="0.054002"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:56.213875" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:56.214995" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:56.214565" elapsed="0.000483"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:24:56.215355" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:56.215171" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:56.215133" elapsed="0.000382"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:24:56.215726" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-10-16T01:24:56.215589" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:56.215568" elapsed="0.000268"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:24:56.215879" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:56.216984" elapsed="0.000441"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:24:56.217683" elapsed="0.000238"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:56.218114" 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-10-16T01:24:56.216322" elapsed="0.001980"/>
</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-10-16T01:24:55.770518" elapsed="0.447881"/>
</kw>
<msg time="2026-10-16T01:24:56.218485" 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-10-16T01:24:55.769348" elapsed="0.449202"/>
</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-10-16T01:24:55.768671" elapsed="0.449982"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:56.226879" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:56.226528" elapsed="0.000426"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:56.226503" elapsed="0.000482"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:56.227442" 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-10-16T01:24:56.227572" 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-10-16T01:24:56.227250" elapsed="0.000436"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:56.228369" level="INFO">Attempting to execute command "sudo ovs-vsctl show" on remote system "10.30.171.104" 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-10-16T01:24:56.227969" elapsed="0.000479"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:56.229124" 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-10-16T01:24:56.228692" elapsed="0.000465"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:24:56.230527" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:24:56.230622" 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-10-16T01:24:56.230149" elapsed="0.000504"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:56.230877" elapsed="0.000398"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:24:56.232684" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:24:56.613515" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:24:00 UTC 2026

  System load:  0.01               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%

 * Canonical Workshop gives developers fast, composable, reproducible, and
   secure developer environments that are perfect for agentic workflows.

   https://ubuntu.com/workshop

Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:24:56 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:24:56.232068" elapsed="0.381700"/>
</kw>
<msg time="2026-10-16T01:24:56.613863" 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-10-16T01:24:56.231519" elapsed="0.382444"/>
</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-10-16T01:24:56.229437" elapsed="0.384653"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:24:56.614766" level="INFO">Executing command 'sudo ovs-vsctl show'.</msg>
<msg time="2026-10-16T01:24:56.638244" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:24:56.638490" level="INFO">${stdout} = 93e5097f-a2fe-4b76-a654-a7a9e08324d0
    Manager "tcp:10.30.170.84:6640"
    Manager "tcp:10.30.170.180:6640"
    Manager "tcp:10.30.170.14:6640"
    ovs_version: "2.17.11"</msg>
<msg time="2026-10-16T01:24:56.638572" 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-10-16T01:24:56.614443" elapsed="0.024173"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:56.638928" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:56.640120" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:56.639662" elapsed="0.000515"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:24:56.640514" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:56.640307" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:56.640269" 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-10-16T01:24:56.640836" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-10-16T01:24:56.640715" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:56.640675" elapsed="0.000276"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:24:56.640995" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:56.642148" 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-10-16T01:24:56.642902" elapsed="0.000225"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:56.643331" elapsed="0.000204"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:24:56.641474" elapsed="0.002131"/>
</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-10-16T01:24:56.225903" elapsed="0.417826"/>
</kw>
<msg time="2026-10-16T01:24:56.643886" 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-10-16T01:24:56.225147" elapsed="0.418809"/>
</kw>
<msg time="2026-10-16T01:24:56.644110" level="INFO">${output} = 93e5097f-a2fe-4b76-a654-a7a9e08324d0
    Manager "tcp:10.30.170.84:6640"
    Manager "tcp:10.30.170.180:6640"
    Manager "tcp:10.30.170.14: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-10-16T01:24:56.224535" elapsed="0.419612"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:56.644797" level="INFO">93e5097f-a2fe-4b76-a654-a7a9e08324d0
    Manager "tcp:10.30.170.84:6640"
    Manager "tcp:10.30.170.180:6640"
    Manager "tcp:10.30.170.14: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-10-16T01:24:56.644445" elapsed="0.000414"/>
</kw>
<if>
<branch type="IF" condition="&quot;${should_match}&quot; == &quot;True&quot;">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-10-16T01:24:56.645816" level="FAIL">'93e5097f-a2fe-4b76-a654-a7a9e08324d0
    Manager "tcp:10.30.170.84:6640"
    Manager "tcp:10.30.170.180:6640"
    Manager "tcp:10.30.170.14:6640"
    ovs_version: "2.17.11"' does not contain 'is_connected'</msg>
<arg>${output}</arg>
<arg>${expected_output}</arg>
<doc>Fails if the `container` does not contain the `item` one or more times.</doc>
<status status="FAIL" start="2026-10-16T01:24:56.645253" elapsed="0.000681">'93e5097f-a2fe-4b76-a654-a7a9e08324d0
    Manager "tcp:10.30.170.84:6640"
    Manager "tcp:10.30.170.180:6640"
    Manager "tcp:10.30.170.14:6640"
    ovs_version: "2.17.11"' does not contain 'is_connected'</status>
</kw>
<status status="FAIL" start="2026-10-16T01:24:56.644947" elapsed="0.001091">'93e5097f-a2fe-4b76-a654-a7a9e08324d0
    Manager "tcp:10.30.170.84:6640"
    Manager "tcp:10.30.170.180:6640"
    Manager "tcp:10.30.170.14:6640"
    ovs_version: "2.17.11"' does not contain 'is_connected'</status>
</branch>
<status status="FAIL" start="2026-10-16T01:24:56.644923" elapsed="0.001160">'93e5097f-a2fe-4b76-a654-a7a9e08324d0
    Manager "tcp:10.30.170.84:6640"
    Manager "tcp:10.30.170.180:6640"
    Manager "tcp:10.30.170.14: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 the `container` contains the `item`.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:56.646418" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:56.646175" elapsed="0.000322"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:24:56.646152" elapsed="0.000378"/>
</if>
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-10-16T01:24:56.646575" 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-10-16T01:24:56.223972" elapsed="0.422771">'93e5097f-a2fe-4b76-a654-a7a9e08324d0
    Manager "tcp:10.30.170.84:6640"
    Manager "tcp:10.30.170.180:6640"
    Manager "tcp:10.30.170.14:6640"
    ovs_version: "2.17.11"' does not contain 'is_connected'</status>
</kw>
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-10-16T01:24:56.646828" elapsed="0.000021"/>
</return>
<arg>${tools_system}</arg>
<doc>Uses "vsctl show" to check for string "is_connected"</doc>
<status status="FAIL" start="2026-10-16T01:24:56.219621" elapsed="0.427341">'93e5097f-a2fe-4b76-a654-a7a9e08324d0
    Manager "tcp:10.30.170.84:6640"
    Manager "tcp:10.30.170.180:6640"
    Manager "tcp:10.30.170.14: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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:57.659467" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:57.658844" elapsed="0.000768"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:57.658796" elapsed="0.000879"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:57.660506" 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-10-16T01:24:57.660766" 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-10-16T01:24:57.660148" elapsed="0.000678"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:57.662029" level="INFO">Attempting to execute command "sudo ovs-vsctl show" on remote system "10.30.171.104" 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-10-16T01:24:57.661252" elapsed="0.000879"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:24:57.663288" 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-10-16T01:24:57.662554" elapsed="0.000792"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:24:57.665830" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:24:57.665993" 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-10-16T01:24:57.665148" elapsed="0.000897"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:57.666386" elapsed="0.000728"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:24:57.669433" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:24:58.071324" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:24:00 UTC 2026

  System load:  0.01               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%

 * Canonical Workshop gives developers fast, composable, reproducible, and
   secure developer environments that are perfect for agentic workflows.

   https://ubuntu.com/workshop

Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:24:56 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:24:57.668388" elapsed="0.403059"/>
</kw>
<msg time="2026-10-16T01:24:58.071506" 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-10-16T01:24:57.667515" elapsed="0.404060"/>
</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-10-16T01:24:57.663845" elapsed="0.407811"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:24:58.072079" level="INFO">Executing command 'sudo ovs-vsctl show'.</msg>
<msg time="2026-10-16T01:24:58.115422" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:24:58.115652" level="INFO">${stdout} = 93e5097f-a2fe-4b76-a654-a7a9e08324d0
    Manager "tcp:10.30.170.84:6640"
        is_connected: true
    Manager "tcp:10.30.170.180:6640"
        is_connected: true
    Manager "tcp:10.30.170.14:6640"
...</msg>
<msg time="2026-10-16T01:24:58.115786" 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-10-16T01:24:58.071908" elapsed="0.043929"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:58.116185" elapsed="0.000465"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:58.117691" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:24:58.117142" elapsed="0.000674"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:24:58.118177" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:24:58.117960" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:58.117919" elapsed="0.000405"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:24:58.118640" elapsed="0.000052"/>
</return>
<status status="PASS" start="2026-10-16T01:24:58.118456" elapsed="0.000339"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:58.118423" elapsed="0.000422"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:24:58.118913" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:24:58.120520" elapsed="0.000669"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:24:58.121618" elapsed="0.000344"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:24:58.122275" elapsed="0.000223"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:24:58.119596" elapsed="0.003008"/>
</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-10-16T01:24:57.657805" elapsed="0.464982"/>
</kw>
<msg time="2026-10-16T01:24:58.122897" 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-10-16T01:24:57.656457" elapsed="0.466541"/>
</kw>
<msg time="2026-10-16T01:24:58.123214" level="INFO">${output} = 93e5097f-a2fe-4b76-a654-a7a9e08324d0
    Manager "tcp:10.30.170.84:6640"
        is_connected: true
    Manager "tcp:10.30.170.180:6640"
        is_connected: true
    Manager "tcp:10.30.170.14: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-10-16T01:24:57.655375" elapsed="0.467893"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:58.124234" level="INFO">93e5097f-a2fe-4b76-a654-a7a9e08324d0
    Manager "tcp:10.30.170.84:6640"
        is_connected: true
    Manager "tcp:10.30.170.180:6640"
        is_connected: true
    Manager "tcp:10.30.170.14: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-10-16T01:24:58.123737" elapsed="0.000590"/>
</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 the `container` does not contain the `item` one or more times.</doc>
<status status="PASS" start="2026-10-16T01:24:58.124974" elapsed="0.000672"/>
</kw>
<status status="PASS" start="2026-10-16T01:24:58.124488" elapsed="0.001267"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:58.124450" elapsed="0.001359"/>
</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 the `container` contains the `item`.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:58.126482" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:24:58.126005" elapsed="0.000598"/>
</branch>
<status status="PASS" start="2026-10-16T01:24:58.125968" elapsed="0.000685"/>
</if>
<return>
<value>${output}</value>
<status status="PASS" start="2026-10-16T01:24:58.126752" elapsed="0.000056"/>
</return>
<msg time="2026-10-16T01:24:58.127031" level="INFO">${output} = 93e5097f-a2fe-4b76-a654-a7a9e08324d0
    Manager "tcp:10.30.170.84:6640"
        is_connected: true
    Manager "tcp:10.30.170.180:6640"
        is_connected: true
    Manager "tcp:10.30.170.14: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-10-16T01:24:57.654373" elapsed="0.472713"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-10-16T01:24:58.127188" elapsed="0.000051"/>
</return>
<arg>${tools_system}</arg>
<doc>Uses "vsctl show" to check for string "is_connected"</doc>
<status status="PASS" start="2026-10-16T01:24:57.647775" elapsed="0.479642"/>
</kw>
<msg time="2026-10-16T01:24:58.127583" level="INFO">${output} = 93e5097f-a2fe-4b76-a654-a7a9e08324d0
    Manager "tcp:10.30.170.84:6640"
        is_connected: true
    Manager "tcp:10.30.170.180:6640"
        is_connected: true
    Manager "tcp:10.30.170.14: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-10-16T01:24:56.218930" elapsed="1.908706"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:24:58.128624" level="INFO">93e5097f-a2fe-4b76-a654-a7a9e08324d0
    Manager "tcp:10.30.170.84:6640"
        is_connected: true
    Manager "tcp:10.30.170.180:6640"
        is_connected: true
    Manager "tcp:10.30.170.14: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-10-16T01:24:58.128102" elapsed="0.000650"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-10-16T01:24:58.129478" 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-10-16T01:24:58.129100" elapsed="0.000434"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:24:58.131367" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:24:58.130770" elapsed="0.000675"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:24:58.131538" elapsed="0.000056"/>
</return>
<msg time="2026-10-16T01:24:58.131841" 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-10-16T01:24:58.129992" elapsed="0.001900"/>
</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-10-16T01:24:58.138412" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:24:58.137996" elapsed="0.000451"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:24:58.143261" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:24:58.143338" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:24:58.143528" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:24:58.138660" elapsed="0.005525">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:24:58.144573" elapsed="0.000033"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:24:58.144881" elapsed="0.000030"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:24:58.145119" elapsed="0.000026"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:58.145352" elapsed="0.000025"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:24:58.145599" elapsed="0.000025"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:58.145901" elapsed="0.000026"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:24:58.146295" elapsed="0.000026"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:24:58.146600" elapsed="0.000027"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:58.146863" elapsed="0.000027"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:24:58.147104" elapsed="0.000025"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:24:58.147405" elapsed="0.000027"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:24:58.146110" elapsed="0.001372"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:24:58.146001" elapsed="0.001518"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:24:58.147572" elapsed="0.000021"/>
</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="FAIL" start="2026-10-16T01:24:58.137064" elapsed="0.010671">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:25:00.153338" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:25:00.152604" elapsed="0.000819"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:25:00.160660" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:25:00.161484" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:25:00.161752" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:25:00.153890" elapsed="0.008789">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:25:00.163421" elapsed="0.000062"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:25:00.163925" elapsed="0.000049"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:25:00.164306" elapsed="0.000042"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:00.164761" elapsed="0.000044"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:25:00.165127" elapsed="0.000040"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:00.165608" elapsed="0.000043"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:25:00.166254" elapsed="0.000041"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:25:00.166666" elapsed="0.000070"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:00.167090" elapsed="0.000041"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:00.167505" elapsed="0.000043"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:25:00.168021" elapsed="0.000043"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:25:00.165962" elapsed="0.002181"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:25:00.165790" elapsed="0.002411"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:25:00.168431" elapsed="0.000041"/>
</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="FAIL" start="2026-10-16T01:25:00.151547" elapsed="0.017126">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:25:02.191674" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:25:02.190797" elapsed="0.000977"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:25:02.199399" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:25:02.199536" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:25:02.199889" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:25:02.192171" elapsed="0.008778">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:25:02.201674" elapsed="0.000096"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:25:02.202183" elapsed="0.000048"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:25:02.202590" elapsed="0.000044"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:02.203006" elapsed="0.000042"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:25:02.203384" elapsed="0.000041"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:02.203870" elapsed="0.000042"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:25:02.204523" elapsed="0.000043"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:25:02.204943" elapsed="0.000042"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:02.205342" elapsed="0.000062"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:02.205777" elapsed="0.000043"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:25:02.206292" elapsed="0.000041"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:25:02.204207" elapsed="0.002227"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:25:02.204023" elapsed="0.002472"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:25:02.206594" elapsed="0.000037"/>
</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="FAIL" start="2026-10-16T01:25:02.188779" elapsed="0.018095">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:25:04.220828" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:25:04.218629" elapsed="0.002277"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:25:04.227526" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:25:04.227649" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:25:04.228767" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:25:04.221535" elapsed="0.009444">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:25:04.231833" elapsed="0.000070"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:25:04.232440" elapsed="0.000053"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:25:04.232871" elapsed="0.000045"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:04.233257" elapsed="0.000040"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:25:04.233646" elapsed="0.000041"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:04.234130" elapsed="0.000041"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:25:04.234805" elapsed="0.000043"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:25:04.235195" elapsed="0.000040"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:04.235619" elapsed="0.000042"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:04.236033" elapsed="0.000041"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:25:04.236575" elapsed="0.000041"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:25:04.234486" elapsed="0.002208"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:25:04.234284" elapsed="0.002497"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:25:04.236876" elapsed="0.000037"/>
</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="FAIL" start="2026-10-16T01:25:04.216043" elapsed="0.021088">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:25:06.251192" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:25:06.249809" elapsed="0.001449"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:25:06.257746" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:25:06.257895" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:25:06.258157" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:25:06.251651" elapsed="0.008137">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:25:06.260455" elapsed="0.000058"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:25:06.260955" elapsed="0.000049"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:25:06.261420" elapsed="0.000046"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:06.261835" elapsed="0.000042"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:25:06.262202" elapsed="0.000042"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:06.263634" elapsed="0.000050"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:25:06.264388" elapsed="0.000044"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:25:06.264807" elapsed="0.000042"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:06.265194" elapsed="0.000040"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:06.265602" elapsed="0.000049"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:25:06.266363" elapsed="0.000046"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:25:06.264037" elapsed="0.002451"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:25:06.263860" elapsed="0.002689"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:25:06.266642" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:25:06.248512" elapsed="0.018552">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:25:08.289755" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:25:08.288044" elapsed="0.001801"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:25:08.298999" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:25:08.299173" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:25:08.299470" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:25:08.290326" elapsed="0.010762">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:25:08.301906" elapsed="0.000065"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:25:08.302407" elapsed="0.000050"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:25:08.302825" elapsed="0.000045"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:08.303208" elapsed="0.000041"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:25:08.303598" elapsed="0.000042"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:08.304153" elapsed="0.000051"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:25:08.304835" elapsed="0.000052"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:25:08.305258" elapsed="0.000072"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:08.305681" elapsed="0.000071"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:08.306093" elapsed="0.000040"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:25:08.306796" elapsed="0.000046"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:25:08.304509" elapsed="0.002413"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:25:08.304339" elapsed="0.002642"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:25:08.307074" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:25:08.284177" elapsed="0.023160">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:25:10.317535" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:25:10.316767" elapsed="0.000834"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:25:10.323895" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:25:10.324015" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:25:10.324256" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:25:10.317993" elapsed="0.007211">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:25:10.325883" elapsed="0.000054"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:25:10.326355" elapsed="0.000050"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:25:10.326758" elapsed="0.000043"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:10.327134" elapsed="0.000040"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:25:10.327529" elapsed="0.000041"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:10.328014" elapsed="0.000043"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:25:10.328628" elapsed="0.000040"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:25:10.329073" elapsed="0.000042"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:10.329486" elapsed="0.000042"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:10.329898" elapsed="0.000043"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:25:10.330383" elapsed="0.000042"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:25:10.328339" elapsed="0.002162"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:25:10.328160" elapsed="0.002397"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:25:10.330649" elapsed="0.000033"/>
</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="FAIL" start="2026-10-16T01:25:10.315572" elapsed="0.015339">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:25:12.337445" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:25:12.336605" elapsed="0.000923"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:25:12.344353" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:25:12.344476" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:25:12.344745" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:25:12.337985" elapsed="0.007750">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:25:12.346465" elapsed="0.000074"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:25:12.347016" elapsed="0.000051"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:25:12.347457" elapsed="0.000054"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:12.347951" elapsed="0.000044"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:25:12.348359" elapsed="0.000043"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:12.348844" elapsed="0.000043"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:25:12.349477" elapsed="0.000042"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:25:12.349891" elapsed="0.000042"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:12.350295" elapsed="0.000044"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:12.350677" elapsed="0.000070"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:25:12.351169" elapsed="0.000041"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:25:12.349164" elapsed="0.002138"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:25:12.348993" elapsed="0.002368"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:25:12.351454" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:25:12.335389" elapsed="0.016301">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:25:14.358557" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:25:14.357821" elapsed="0.000799"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:25:14.365353" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:25:14.365473" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:25:14.365743" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:25:14.359012" elapsed="0.007802">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:25:14.367436" elapsed="0.000052"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:25:14.367916" elapsed="0.000048"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:25:14.368334" elapsed="0.000056"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:14.368864" elapsed="0.000045"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:25:14.369236" elapsed="0.000069"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:14.369751" elapsed="0.000042"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:25:14.370387" elapsed="0.000043"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:25:14.370804" elapsed="0.000043"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:14.371192" elapsed="0.000041"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:14.371832" elapsed="0.000043"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:25:14.372307" elapsed="0.000043"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:25:14.370062" elapsed="0.002364"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:25:14.369897" elapsed="0.002586"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:25:14.372573" elapsed="0.000034"/>
</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="FAIL" start="2026-10-16T01:25:14.356656" elapsed="0.016180">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:25:16.379636" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:25:16.378863" elapsed="0.000868"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:25:16.386694" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:25:16.386859" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:25:16.387083" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:25:16.380108" elapsed="0.007912">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:25:16.388649" elapsed="0.000083"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:25:16.389172" elapsed="0.000051"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:25:16.389693" elapsed="0.000092"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:16.390181" elapsed="0.000043"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:25:16.390573" elapsed="0.000042"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:16.391172" elapsed="0.000044"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:25:16.391895" elapsed="0.000044"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:25:16.392326" elapsed="0.000044"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:16.392747" elapsed="0.000043"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:16.393136" elapsed="0.000041"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:25:16.393619" elapsed="0.000042"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:25:16.391567" elapsed="0.002203"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:25:16.391364" elapsed="0.002466"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:25:16.393921" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:25:16.377615" elapsed="0.016538">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:25:18.401202" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:25:18.400440" elapsed="0.000847"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:25:18.407854" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:25:18.407979" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:25:18.408257" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:25:18.401640" elapsed="0.007695">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:25:18.409977" elapsed="0.000054"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:25:18.410452" elapsed="0.000048"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:25:18.410857" elapsed="0.000045"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:18.411272" elapsed="0.000044"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:25:18.411665" elapsed="0.000069"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:18.412191" elapsed="0.000061"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:25:18.412831" elapsed="0.000043"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:25:18.413209" elapsed="0.000063"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:18.413616" elapsed="0.000040"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:18.414023" elapsed="0.000041"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:25:18.414581" elapsed="0.000058"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:25:18.412516" elapsed="0.002417"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:25:18.412354" elapsed="0.002650"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:25:18.415099" elapsed="0.000038"/>
</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="FAIL" start="2026-10-16T01:25:18.399149" elapsed="0.016314">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:25:20.420039" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:25:20.419631" elapsed="0.000442"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:25:20.425262" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:25:20.425320" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:25:20.425437" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:25:20.420254" elapsed="0.005687">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:25:20.426246" elapsed="0.000026"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:25:20.426458" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:25:20.426631" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:20.427068" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:25:20.427258" elapsed="0.000019"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:20.427466" elapsed="0.000018"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:25:20.427770" elapsed="0.000020"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:25:20.427944" elapsed="0.000018"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:20.428371" elapsed="0.000023"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:20.428552" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:25:20.428785" elapsed="0.000018"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:25:20.427612" elapsed="0.001227"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:25:20.427532" elapsed="0.001332"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:25:20.428906" elapsed="0.000016"/>
</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="FAIL" start="2026-10-16T01:25:20.418940" elapsed="0.010077">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:25:22.436099" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:25:22.435329" elapsed="0.000837"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:25:22.442618" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:25:22.442890" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:25:22.443143" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:25:22.436548" elapsed="0.007549">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:25:22.444764" elapsed="0.000055"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:25:22.445241" elapsed="0.000048"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:25:22.445616" elapsed="0.000043"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:22.446025" elapsed="0.000041"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:25:22.446404" elapsed="0.000044"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:22.446886" elapsed="0.000042"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:25:22.447509" elapsed="0.000043"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:25:22.447918" elapsed="0.000042"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:22.448322" elapsed="0.000041"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:22.448725" elapsed="0.000044"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:25:22.449203" elapsed="0.000043"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:25:22.447219" elapsed="0.002103"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:25:22.447033" elapsed="0.002347"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:25:22.449468" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:25:22.434100" elapsed="0.015626">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:25:24.455540" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:25:24.454813" elapsed="0.000789"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:25:24.462307" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:25:24.462425" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:25:24.462640" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:25:24.455982" elapsed="0.007570">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:25:24.464225" elapsed="0.000150"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:25:24.464818" elapsed="0.000050"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:25:24.465219" elapsed="0.000044"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:24.465600" elapsed="0.000042"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:25:24.465993" elapsed="0.000042"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:24.466473" elapsed="0.000042"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:25:24.467094" elapsed="0.000042"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:25:24.467499" elapsed="0.000041"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:24.467909" elapsed="0.000043"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:24.468316" elapsed="0.000043"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:25:24.468803" elapsed="0.000044"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:25:24.466803" elapsed="0.002121"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:25:24.466613" elapsed="0.002366"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:25:24.469065" elapsed="0.000034"/>
</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="FAIL" start="2026-10-16T01:25:24.453693" elapsed="0.015618">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:25:26.476067" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:25:26.475311" elapsed="0.000819"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:25:26.483427" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:25:26.483545" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:25:26.483822" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:25:26.476510" elapsed="0.008257">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:25:26.485394" elapsed="0.000056"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:25:26.485887" elapsed="0.000050"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:25:26.486285" elapsed="0.000044"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:26.486665" elapsed="0.000070"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:25:26.487056" elapsed="0.000040"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:26.487519" elapsed="0.000041"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:25:26.488192" elapsed="0.000046"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:25:26.488683" elapsed="0.000074"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:26.489104" elapsed="0.000042"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:26.489511" elapsed="0.000042"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:25:26.489999" elapsed="0.000043"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:25:26.487857" elapsed="0.002263"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:25:26.487664" elapsed="0.002531"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:25:26.490287" elapsed="0.000034"/>
</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="FAIL" start="2026-10-16T01:25:26.474129" elapsed="0.016386">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:25:28.496443" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:25:28.495678" elapsed="0.000827"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:25:28.503374" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:25:28.503488" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '426'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology/topology=ovsdb%3A1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:25:28.503745" level="FAIL">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:25:28.496896" elapsed="0.007754">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Log Content" owner="Utils">
<arg>${resp.text}</arg>
<status status="NOT RUN" start="2026-10-16T01:25:28.505316" elapsed="0.000055"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:25:28.505803" elapsed="0.000051"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:25:28.506208" elapsed="0.000043"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:28.506586" elapsed="0.000041"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:25:28.506973" elapsed="0.000042"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:28.507446" elapsed="0.000041"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:25:28.508068" elapsed="0.000041"/>
</kw>
<kw name="Replace String" owner="String">
<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="NOT RUN" start="2026-10-16T01:25:28.508472" elapsed="0.000042"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:28.508881" elapsed="0.000043"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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 errorw.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:28.509285" elapsed="0.000042"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:25:28.509765" elapsed="0.000044"/>
</kw>
<var name="${node}"/>
<status status="NOT RUN" start="2026-10-16T01:25:28.507779" elapsed="0.002107"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="NOT RUN" start="2026-10-16T01:25:28.507587" elapsed="0.002356"/>
</for>
<return>
<value>${uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:25:28.510032" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:25:28.494604" elapsed="0.015789">Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<msg time="2026-10-16T01:25:28.510582" level="FAIL">Keyword 'OVSDB.Get OVSDB UUID' failed after retrying for 30 seconds. The last error was: Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</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="FAIL" start="2026-10-16T01:24:58.132277" elapsed="30.378531">Keyword 'OVSDB.Get OVSDB UUID' failed after retrying for 30 seconds. The last error was: Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<return>
<value>${ovsdb_uuid}</value>
<status status="NOT RUN" start="2026-10-16T01:25:28.510938" elapsed="0.000034"/>
</return>
<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="FAIL" start="2026-10-16T01:24:53.704315" elapsed="34.806844">Keyword 'OVSDB.Get OVSDB UUID' failed after retrying for 30 seconds. The last error was: Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${ovsdb_uuid}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:28.511586" elapsed="0.000045"/>
</kw>
<doc>Connect OVS to all cluster instances.</doc>
<status status="FAIL" start="2026-10-16T01:24:53.350855" elapsed="35.161087">Keyword 'OVSDB.Get OVSDB UUID' failed after retrying for 30 seconds. The last error was: Url: http://10.30.170.180:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig Expected status: 404 != 200</status>
</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-10-16T01:25:28.516494" elapsed="0.000984"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:25:28.515920" elapsed="0.001683"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:28.519957" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:28.519562" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:28.519518" elapsed="0.000590"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:28.524388" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:28.524198" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:28.524159" elapsed="0.000368"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:25:28.526603" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:25:28.525849" elapsed="0.000811"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:25:28.527659" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:25:28.527028" elapsed="0.000718"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:25:28.527838" elapsed="0.000064"/>
</return>
<msg time="2026-10-16T01:25:28.528129" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:25:28.525011" elapsed="0.003191"/>
</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-10-16T01:25:28.533943" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:28.533750" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:28.533681" elapsed="0.000401"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:28.536667" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:28.536480" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:28.536443" elapsed="0.000401"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:28.537697" level="INFO">${karaf_connection_index} = 598</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:25:28.537180" elapsed="0.000618"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:28.538592" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:28.538175" elapsed="0.000470"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:28.573631" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:28.540085" elapsed="0.033825"/>
</kw>
<msg time="2026-10-16T01:25:28.574133" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:28.574208" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:28.539039" elapsed="0.035424"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:28.672956" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:28.575350" elapsed="0.097811"/>
</kw>
<msg time="2026-10-16T01:25:28.673320" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:28.673361" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:28.574730" elapsed="0.098665"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:28.673672" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:28.673466" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:28.673448" elapsed="0.000344"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:28.674332" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:28.673971" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:28.674833" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:28.674610" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:28.674464" elapsed="0.000464"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:28.674959" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:28.677483" 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-10-16T01:25:28.679240" elapsed="0.001992"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:28.684160" elapsed="0.000840"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:25:28.675787" elapsed="0.009406"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:28.675264" elapsed="0.010199"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:28.535878" elapsed="0.149804"/>
</kw>
<msg time="2026-10-16T01:25:28.686168" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:28.686266" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:28.534433" elapsed="0.151913"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:28.686835" elapsed="0.000076"/>
</return>
<status status="PASS" start="2026-10-16T01:25:28.686534" elapsed="0.000453"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:28.686483" elapsed="0.000558"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:28.687903" 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-10-16T01:25:28.688611" elapsed="0.000051"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:28.688785" 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-10-16T01:25:28.533050" elapsed="0.155933"/>
</kw>
<msg time="2026-10-16T01:25:28.689195" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:28.689287" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:28.528953" elapsed="0.160411"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:28.690169" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:28.689614" elapsed="0.000668"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:28.689575" elapsed="0.000758"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:25:28.528616" elapsed="0.161766"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:28.696017" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:28.695822" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:28.695783" elapsed="0.000402"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:28.698678" elapsed="0.000065"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:28.698491" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:28.698454" elapsed="0.000404"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:28.699752" level="INFO">${karaf_connection_index} = 600</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:25:28.699201" elapsed="0.000611"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:28.700600" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:28.700191" elapsed="0.000463"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:28.735655" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:28.702053" elapsed="0.033878"/>
</kw>
<msg time="2026-10-16T01:25:28.736167" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:28.736227" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:28.701068" elapsed="0.035205"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:28.841370" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:28.737113" elapsed="0.104468"/>
</kw>
<msg time="2026-10-16T01:25:28.841810" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:28.841851" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:28.736498" elapsed="0.105386"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:28.842168" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:28.841953" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:28.841935" elapsed="0.000327"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:28.842800" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:28.842441" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:28.843171" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:28.842961" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:28.842942" elapsed="0.000324"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:28.843296" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:28.846035" 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-10-16T01:25:28.848033" elapsed="0.000489"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:28.849876" 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-10-16T01:25:28.844125" elapsed="0.006138"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:28.843595" elapsed="0.006784"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:28.697891" elapsed="0.152595"/>
</kw>
<msg time="2026-10-16T01:25:28.850569" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:28.850608" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:28.696511" elapsed="0.154130"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:28.850874" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:25:28.850786" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:28.850693" 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 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-10-16T01:25:28.851277" 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-10-16T01:25:28.851572" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:28.851636" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:25:28.695079" elapsed="0.156656"/>
</kw>
<msg time="2026-10-16T01:25:28.851818" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:28.851856" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:28.690996" elapsed="0.160894"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:28.852183" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:28.851956" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:28.851940" elapsed="0.000315"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:25:28.690649" elapsed="0.161628"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:28.854777" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:28.854676" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:28.854659" elapsed="0.000180"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:28.855937" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:28.855851" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:28.855834" elapsed="0.000166"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:28.856378" 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-10-16T01:25:28.856155" elapsed="0.000249"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:28.856756" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:28.856560" elapsed="0.000221"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:28.890572" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:28.857357" elapsed="0.033412"/>
</kw>
<msg time="2026-10-16T01:25:28.890925" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:28.890966" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:28.856933" elapsed="0.034066"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:28.991414" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:28.891593" elapsed="0.100017"/>
</kw>
<msg time="2026-10-16T01:25:28.991787" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:28.991827" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:28.891175" elapsed="0.100688"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:28.992184" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:28.991932" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:28.991915" elapsed="0.000366"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:28.992821" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:28.992460" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:28.993189" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:28.992975" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:28.992958" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:28.993315" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:28.995779" 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-10-16T01:25:28.997486" elapsed="0.000664"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:28.999489" 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-10-16T01:25:28.994083" elapsed="0.005799"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:28.993579" elapsed="0.006420"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:28.855570" elapsed="0.144504"/>
</kw>
<msg time="2026-10-16T01:25:29.000174" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:29.000214" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:28.854985" elapsed="0.145264"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:29.000400" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:25:29.000318" elapsed="0.000136"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:29.000301" elapsed="0.000175"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:29.000859" 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-10-16T01:25:29.001173" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:29.001239" 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-10-16T01:25:28.854388" elapsed="0.146936"/>
</kw>
<msg time="2026-10-16T01:25:29.001405" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:29.001444" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:28.852516" elapsed="0.148963"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:29.001776" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:29.001546" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:29.001530" elapsed="0.000318"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:25:28.852383" elapsed="0.149486"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:25:28.528304" elapsed="0.473593"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:25:28.523493" elapsed="0.478462"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:25:28.518943" elapsed="0.483070"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:28.517972" elapsed="0.484088"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:25:28.515087" elapsed="0.487027"/>
</kw>
<kw name="Get Ovsdb Entity Owner Status For One Device" owner="ClusterOvsdb">
<msg time="2026-10-16T01:25:29.005948" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:25:29.004734" elapsed="0.001254">Variable '${ovsdb_uuid}' not found.</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-10-16T01:25:29.006176" elapsed="0.000020"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${original_owner}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:29.006376" elapsed="0.000018"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${original_candidate}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:29.006562" elapsed="0.000018"/>
</kw>
<doc>Check Entity Owner Status and identify owner and candidate.</doc>
<status status="FAIL" start="2026-10-16T01:25:28.512653" elapsed="0.494087">Variable '${ovsdb_uuid}' not found.</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-10-16T01:25:29.008250" elapsed="0.000203"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:25:29.007981" 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-10-16T01:25:29.009566" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:29.009478" elapsed="0.000131"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:29.009460" elapsed="0.000170"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:29.011530" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:29.011445" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:29.011428" elapsed="0.000163"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:25:29.012508" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:25:29.012178" elapsed="0.000355"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:25:29.012970" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:25:29.012683" elapsed="0.000311"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:25:29.013035" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:25:29.013177" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:25:29.011811" elapsed="0.001389"/>
</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-10-16T01:25:29.015777" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:29.015677" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:29.015660" elapsed="0.000181"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:29.016939" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:29.016856" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:29.016839" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:29.017385" level="INFO">${karaf_connection_index} = 598</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:25:29.017158" elapsed="0.000252"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:29.017767" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:29.017568" elapsed="0.000224"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:29.050997" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:29.018371" elapsed="0.032818"/>
</kw>
<msg time="2026-10-16T01:25:29.051345" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:29.051417" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:29.017945" elapsed="0.033509"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:29.150391" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:29.052092" elapsed="0.098481"/>
</kw>
<msg time="2026-10-16T01:25:29.150788" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:29.150829" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:29.051627" elapsed="0.099238"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:29.151149" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:29.150935" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:29.150917" elapsed="0.000328"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:29.151775" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:29.151423" elapsed="0.000437"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:29.152119" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:29.151920" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:29.151904" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:29.152261" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:29.154669" 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-10-16T01:25:29.156374" elapsed="0.000466"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:29.158207" elapsed="0.000303"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:25:29.153036" elapsed="0.005538"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:29.152524" elapsed="0.006165"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:29.016574" elapsed="0.142210"/>
</kw>
<msg time="2026-10-16T01:25:29.158866" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:29.158905" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:29.015988" elapsed="0.142953"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:29.159093" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:25:29.159009" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:29.158993" elapsed="0.000192"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:29.159497" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:29.159840" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:29.159906" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:25:29.015389" elapsed="0.144602"/>
</kw>
<msg time="2026-10-16T01:25:29.160073" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:29.160112" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:29.013529" elapsed="0.146636"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:29.160449" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:29.160234" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:29.160218" elapsed="0.000302"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:25:29.013393" elapsed="0.147148"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:29.163114" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:29.163030" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:29.163013" elapsed="0.000176"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:29.164309" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:29.164226" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:29.164209" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:29.164757" level="INFO">${karaf_connection_index} = 600</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:25:29.164512" elapsed="0.000270"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:29.165122" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:29.164939" elapsed="0.000222"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:29.200642" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:29.165735" elapsed="0.035103"/>
</kw>
<msg time="2026-10-16T01:25:29.200995" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:29.201036" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:29.165313" elapsed="0.035759"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:29.290772" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:29.201662" elapsed="0.089291"/>
</kw>
<msg time="2026-10-16T01:25:29.291107" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:29.291161" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:29.201248" elapsed="0.089951"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:29.291468" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:29.291268" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:29.291251" elapsed="0.000311"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:29.292098" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:29.291762" elapsed="0.000438"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:29.292456" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:29.292261" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:29.292245" elapsed="0.000305"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:29.292580" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:29.295045" elapsed="0.000485"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:25:29.296844" elapsed="0.000466"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:29.298502" 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-10-16T01:25:29.293365" elapsed="0.005536"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:29.292862" elapsed="0.006157"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:29.163954" elapsed="0.135141"/>
</kw>
<msg time="2026-10-16T01:25:29.299195" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:29.299235" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:29.163337" elapsed="0.135933"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:29.299422" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:25:29.299339" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:29.299322" elapsed="0.000177"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:29.299833" 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-10-16T01:25:29.300191" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:29.300257" 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-10-16T01:25:29.162740" elapsed="0.137603"/>
</kw>
<msg time="2026-10-16T01:25:29.300425" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:29.300464" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:29.160885" elapsed="0.139614"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:29.301075" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:29.300567" elapsed="0.000560"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:29.300551" elapsed="0.000623"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:25:29.160648" elapsed="0.140548"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:29.303761" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:29.303660" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:29.303642" elapsed="0.000183"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:29.304920" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:29.304837" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:29.304820" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:29.305359" 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-10-16T01:25:29.305122" elapsed="0.000261"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:29.305732" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:29.305541" elapsed="0.000217"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:29.338123" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:29.306335" elapsed="0.031977"/>
</kw>
<msg time="2026-10-16T01:25:29.338467" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:29.338508" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:29.305910" elapsed="0.032633"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:29.413765" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:29.339167" elapsed="0.074776"/>
</kw>
<msg time="2026-10-16T01:25:29.414098" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:29.414155" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:29.338734" elapsed="0.075457"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:29.414459" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:29.414260" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:29.414242" elapsed="0.000311"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:29.415095" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:29.414761" elapsed="0.000436"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:29.415450" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:29.415257" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:29.415241" elapsed="0.000333"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:29.415606" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:29.418081" 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-10-16T01:25:29.419813" elapsed="0.000470"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:29.421456" 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-10-16T01:25:29.416399" elapsed="0.005454"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:29.415888" elapsed="0.006089"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:29.304557" elapsed="0.117496"/>
</kw>
<msg time="2026-10-16T01:25:29.422148" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:29.422190" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:29.303970" elapsed="0.118256"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:29.422379" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:25:29.422294" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:29.422278" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:29.423056" 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-10-16T01:25:29.423400" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:29.423468" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:25:29.303369" elapsed="0.120184"/>
</kw>
<msg time="2026-10-16T01:25:29.423637" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:29.423676" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:29.301442" elapsed="0.122289"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:29.424017" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:29.423800" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:29.423785" elapsed="0.000302"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:25:29.301306" elapsed="0.122802"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:25:29.013251" elapsed="0.410900"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:25:29.011155" elapsed="0.413046"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:25:29.009056" elapsed="0.415195"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:29.008647" elapsed="0.415644"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:25:29.007501" elapsed="0.416837"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:29.428970" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:29.428736" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:29.428718" elapsed="0.000328"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:29.429383" 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-10-16T01:25:29.429474" 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-10-16T01:25:29.429250" elapsed="0.000249"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:29.430027" level="INFO">Attempting to execute command "sudo ovs-vsctl add-br br-s1" on remote system "10.30.171.104" 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-10-16T01:25:29.429733" elapsed="0.000337"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:29.430564" level="INFO">${conn_id} = 629</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-10-16T01:25:29.430259" elapsed="0.000330"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:25:29.431453" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:25:29.431522" 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-10-16T01:25:29.431179" elapsed="0.000365"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:29.431689" elapsed="0.000294"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:25:29.432790" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:25:30.000623" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:25:29 UTC 2026

  System load:  0.02               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%

 * Canonical Workshop gives developers fast, composable, reproducible, and
   secure developer environments that are perfect for agentic workflows.

   https://ubuntu.com/workshop

Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:24:57 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:25:29.432543" elapsed="0.568218"/>
</kw>
<msg time="2026-10-16T01:25:30.000843" 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-10-16T01:25:29.432157" elapsed="0.568759"/>
</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-10-16T01:25:29.430796" elapsed="0.570225"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:25:30.001627" level="INFO">Executing command 'sudo ovs-vsctl add-br br-s1'.</msg>
<msg time="2026-10-16T01:25:30.055344" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:25:30.055570" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:25:30.055659" 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-10-16T01:25:30.001368" elapsed="0.054375"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:30.056094" elapsed="0.000457"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:30.057594" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:25:30.057042" elapsed="0.000637"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:25:30.058076" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:30.057858" elapsed="0.000338"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:30.057816" elapsed="0.000427"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:25:30.058527" elapsed="0.000053"/>
</return>
<status status="PASS" start="2026-10-16T01:25:30.058349" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:30.058319" elapsed="0.000406"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:25:30.058799" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:30.060361" 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-10-16T01:25:30.061444" elapsed="0.000330"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:30.062089" elapsed="0.000223"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:25:30.059447" elapsed="0.002970"/>
</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-10-16T01:25:29.428305" elapsed="0.634263"/>
</kw>
<msg time="2026-10-16T01:25:30.062672" 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-10-16T01:25:29.427785" elapsed="0.635088"/>
</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-10-16T01:25:29.427361" elapsed="0.635673"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:25:30.064258" 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-10-16T01:25:30.063538" elapsed="0.000775"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:25:30.065400" 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-10-16T01:25:30.064760" elapsed="0.000695"/>
</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-10-16T01:25:30.075591" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:25:30.074830" elapsed="0.000817"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:25:30.076638" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:25:30.076012" elapsed="0.000678"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:25:30.076816" elapsed="0.000060"/>
</return>
<msg time="2026-10-16T01:25:30.077100" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:25:30.073990" elapsed="0.003186"/>
</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-10-16T01:25:30.083011" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:25:30.082378" elapsed="0.000686"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:25:30.083183" elapsed="0.000059"/>
</return>
<msg time="2026-10-16T01:25:30.083454" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:25:30.081606" elapsed="0.001898"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:30.086296" 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-10-16T01:25:30.085598" elapsed="0.000817"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:30.087383" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:25:30.086868" elapsed="0.000603"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:25:30.095556" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:25:30.095671" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:25:30.095938" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:25:30.088183" elapsed="0.008851">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:25:30.087603" elapsed="0.009631">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:25:30.097637" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:30.097304" elapsed="0.000496"/>
</branch>
<status status="FAIL" start="2026-10-16T01:25:30.087567" elapsed="0.010284">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:25:30.098616" elapsed="0.000050"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:25:30.098921" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:30.098848" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:25:30.098811" elapsed="0.000334"/>
</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-10-16T01:25:30.099454" elapsed="0.000044"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:25:30.099593" elapsed="0.000030"/>
</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-10-16T01:25:30.084209" elapsed="0.015630">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:25:30.099959" elapsed="0.000031"/>
</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-10-16T01:25:30.080653" elapsed="0.019516">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:25:30.100630" elapsed="0.000047"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:25:30.077530" elapsed="0.023288">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:25:30.077285" elapsed="0.023647">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:25:30.072878" elapsed="0.028233">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:25:31.110863" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:25:31.109945" elapsed="0.000984"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:25:31.111969" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:25:31.111310" elapsed="0.000713"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:25:31.112143" elapsed="0.000079"/>
</return>
<msg time="2026-10-16T01:25:31.112466" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:25:31.109071" elapsed="0.003445"/>
</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-10-16T01:25:31.118460" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:25:31.117834" elapsed="0.000684"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:25:31.118612" elapsed="0.000056"/>
</return>
<msg time="2026-10-16T01:25:31.118915" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:25:31.117072" elapsed="0.001894"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:31.121604" 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-10-16T01:25:31.121080" elapsed="0.000616"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:31.122645" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:25:31.122162" elapsed="0.000604"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:25:31.130037" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:25:31.130175" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:25:31.130396" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:25:31.123448" elapsed="0.008189">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:25:31.122914" elapsed="0.009021">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:25:31.132370" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:31.132011" elapsed="0.000490"/>
</branch>
<status status="FAIL" start="2026-10-16T01:25:31.122875" elapsed="0.009676">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:25:31.133332" elapsed="0.000052"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:25:31.133597" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:31.133523" elapsed="0.000158"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:25:31.133489" elapsed="0.000268"/>
</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-10-16T01:25:31.134061" elapsed="0.000043"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:25:31.134220" 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-10-16T01:25:31.119651" elapsed="0.014782">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:25:31.134553" elapsed="0.000031"/>
</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-10-16T01:25:31.116110" elapsed="0.018657">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:25:31.135255" elapsed="0.000049"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:25:31.112925" elapsed="0.022484">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:25:31.112635" elapsed="0.022888">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:25:31.107787" elapsed="0.027948">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:25:32.144894" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:25:32.143970" elapsed="0.000985"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:25:32.145957" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:25:32.145313" elapsed="0.000698"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:25:32.146104" elapsed="0.000083"/>
</return>
<msg time="2026-10-16T01:25:32.146417" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:25:32.143142" elapsed="0.003327"/>
</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-10-16T01:25:32.152432" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:25:32.151798" elapsed="0.000690"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:25:32.152581" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:25:32.152888" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:25:32.151035" elapsed="0.001905"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:32.155586" 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-10-16T01:25:32.155059" elapsed="0.000619"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:32.156642" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:25:32.156152" elapsed="0.000611"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:25:32.163105" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:25:32.163243" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:25:32.163445" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:25:32.157512" elapsed="0.007038">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:25:32.156899" elapsed="0.007849">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:25:32.165178" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:32.164822" elapsed="0.000489"/>
</branch>
<status status="FAIL" start="2026-10-16T01:25:32.156861" elapsed="0.008500">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:25:32.166138" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:25:32.166406" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:32.166334" elapsed="0.000155"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:25:32.166298" 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-10-16T01:25:32.166869" elapsed="0.000045"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:25:32.167010" elapsed="0.000030"/>
</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-10-16T01:25:32.153613" elapsed="0.013629">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:25:32.167363" 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-10-16T01:25:32.150066" elapsed="0.017484">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:25:32.168036" elapsed="0.000050"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:25:32.146848" elapsed="0.021368">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:25:32.146572" elapsed="0.021758">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:25:32.141991" elapsed="0.026518">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:25:33.177627" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:25:33.176832" elapsed="0.000855"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:25:33.178698" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:25:33.178063" elapsed="0.000721"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:25:33.178875" elapsed="0.000064"/>
</return>
<msg time="2026-10-16T01:25:33.179190" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:25:33.175987" elapsed="0.003257"/>
</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-10-16T01:25:33.185174" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:25:33.184515" elapsed="0.000716"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:25:33.185325" elapsed="0.000059"/>
</return>
<msg time="2026-10-16T01:25:33.185597" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:25:33.183786" elapsed="0.001863"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:33.188311" 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-10-16T01:25:33.187780" elapsed="0.000625"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:33.189374" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:25:33.188848" elapsed="0.000617"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:25:33.195863" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:25:33.195973" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:25:33.196202" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:25:33.190174" elapsed="0.007137">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:25:33.189601" elapsed="0.007932">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:25:33.197977" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:33.197607" elapsed="0.000524"/>
</branch>
<status status="FAIL" start="2026-10-16T01:25:33.189564" elapsed="0.008618">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:25:33.199004" elapsed="0.000054"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:25:33.199299" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:33.199226" elapsed="0.000158"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:25:33.199189" 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-10-16T01:25:33.199770" elapsed="0.000046"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:25:33.199915" elapsed="0.000031"/>
</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-10-16T01:25:33.186345" elapsed="0.013805">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:25:33.200273" 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-10-16T01:25:33.182826" elapsed="0.017635">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:25:33.200957" elapsed="0.000050"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:25:33.179677" elapsed="0.021459">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:25:33.179427" elapsed="0.021828">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:25:33.174857" elapsed="0.026580">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:25:34.211200" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:25:34.210393" elapsed="0.000868"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:25:34.212359" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:25:34.211594" elapsed="0.000820"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:25:34.212505" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:25:34.212825" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:25:34.209520" elapsed="0.003358"/>
</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-10-16T01:25:34.218826" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:25:34.218192" elapsed="0.000689"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:25:34.218975" elapsed="0.000057"/>
</return>
<msg time="2026-10-16T01:25:34.219272" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:25:34.217432" elapsed="0.001891"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:34.221941" 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-10-16T01:25:34.221419" elapsed="0.000614"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:34.222982" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:25:34.222469" elapsed="0.000601"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:25:34.229327" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:25:34.229436" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:25:34.229632" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:25:34.223748" elapsed="0.006995">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:25:34.223225" elapsed="0.007682">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:25:34.231326" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:34.230974" elapsed="0.000485"/>
</branch>
<status status="FAIL" start="2026-10-16T01:25:34.223189" elapsed="0.008318">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:25:34.232266" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:25:34.232528" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:34.232457" elapsed="0.000154"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:25:34.232423" elapsed="0.000232"/>
</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-10-16T01:25:34.232986" elapsed="0.000043"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:25:34.233145" elapsed="0.000031"/>
</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-10-16T01:25:34.219997" elapsed="0.013358">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:25:34.233541" 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-10-16T01:25:34.216380" elapsed="0.017387">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:25:34.234245" elapsed="0.000049"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:25:34.213249" elapsed="0.021148">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:25:34.212984" elapsed="0.021523">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:25:34.208015" elapsed="0.026671">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:25:35.244754" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:25:35.243839" elapsed="0.000985"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:25:35.245839" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:25:35.245197" elapsed="0.000696"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:25:35.245990" elapsed="0.000078"/>
</return>
<msg time="2026-10-16T01:25:35.246324" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:25:35.242982" elapsed="0.003393"/>
</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-10-16T01:25:35.252237" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:25:35.251582" elapsed="0.000711"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:25:35.252386" elapsed="0.000056"/>
</return>
<msg time="2026-10-16T01:25:35.252653" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:25:35.250851" elapsed="0.001891"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:35.255426" 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-10-16T01:25:35.254881" elapsed="0.000647"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:35.256532" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:25:35.256006" 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-10-16T01:25:35.263182" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:25:35.263294" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:25:35.263507" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:25:35.257321" elapsed="0.007352">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:25:35.256797" elapsed="0.008075">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:25:35.265301" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:35.264943" elapsed="0.000491"/>
</branch>
<status status="FAIL" start="2026-10-16T01:25:35.256757" elapsed="0.008727">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:25:35.266271" elapsed="0.000157"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:25:35.266651" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:35.266575" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:25:35.266539" elapsed="0.000275"/>
</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-10-16T01:25:35.267141" elapsed="0.000045"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:25:35.267282" elapsed="0.000031"/>
</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-10-16T01:25:35.253433" elapsed="0.014061">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:25:35.267614" 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-10-16T01:25:35.249892" elapsed="0.017941">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:25:35.268327" elapsed="0.000054"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:25:35.246774" elapsed="0.021720">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:25:35.246491" elapsed="0.022128">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:25:35.241679" elapsed="0.027173">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<msg time="2026-10-16T01:25:35.269059" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<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="FAIL" start="2026-10-16T01:25:30.065912" elapsed="5.203381">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${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="NOT RUN" start="2026-10-16T01:25:35.269815" elapsed="0.000046"/>
</kw>
<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-10-16T01:25:29.426977" elapsed="5.843084">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<doc>Create bridge with OVS command and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-10-16T01:25:29.006970" elapsed="6.263395">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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-10-16T01:25:35.275116" elapsed="0.000450"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:25:35.274515" elapsed="0.001163"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:35.277756" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:35.277529" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:35.277490" elapsed="0.000409"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:35.282120" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:35.281919" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:35.281882" elapsed="0.000383"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:25:35.284316" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:25:35.283540" elapsed="0.000832"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:25:35.285344" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:25:35.284696" elapsed="0.000703"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:25:35.285563" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:25:35.285884" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:25:35.282732" elapsed="0.003203"/>
</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-10-16T01:25:35.291143" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:35.291008" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:35.290984" elapsed="0.000249"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:35.292823" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:35.292671" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:35.292648" elapsed="0.000264"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:35.293445" level="INFO">${karaf_connection_index} = 598</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:25:35.293126" elapsed="0.000354"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:35.293988" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:35.293726" elapsed="0.000296"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:35.331192" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:35.294865" elapsed="0.036572"/>
</kw>
<msg time="2026-10-16T01:25:35.331659" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:35.331745" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:35.294257" elapsed="0.037537"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:35.410619" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:35.332627" elapsed="0.078207"/>
</kw>
<msg time="2026-10-16T01:25:35.410993" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:35.411034" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:35.332023" elapsed="0.079044"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:35.411370" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:35.411156" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:35.411136" elapsed="0.000329"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:35.412003" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:35.411646" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:35.412356" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:35.412162" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:35.412146" elapsed="0.000303"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:35.412480" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:35.415048" 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-10-16T01:25:35.416847" elapsed="0.000507"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:35.418828" 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-10-16T01:25:35.413316" elapsed="0.005941"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:35.412794" elapsed="0.006576"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:35.292315" elapsed="0.127189"/>
</kw>
<msg time="2026-10-16T01:25:35.419593" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:35.419634" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:35.291438" elapsed="0.128231"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:35.420046" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:25:35.419961" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:35.419943" elapsed="0.000200"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:35.420467" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:35.420784" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:35.420850" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:25:35.290583" elapsed="0.130352"/>
</kw>
<msg time="2026-10-16T01:25:35.421019" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:35.421059" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:35.286671" elapsed="0.134439"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:35.421400" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:35.421181" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:35.421164" elapsed="0.000307"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:25:35.286364" elapsed="0.135128"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:35.424042" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:35.423958" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:35.423941" 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-10-16T01:25:35.425347" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:35.425264" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:35.425248" elapsed="0.000161"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:35.425800" level="INFO">${karaf_connection_index} = 600</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:25:35.425549" elapsed="0.000276"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:35.426202" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:35.425984" elapsed="0.000242"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:35.460241" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:35.426803" elapsed="0.033626"/>
</kw>
<msg time="2026-10-16T01:25:35.460589" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:35.460630" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:35.426378" elapsed="0.034285"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:35.532387" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:35.461289" elapsed="0.071284"/>
</kw>
<msg time="2026-10-16T01:25:35.532760" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:35.532804" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:35.460851" elapsed="0.071988"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:35.533204" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:35.532969" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:35.532946" elapsed="0.000358"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:35.533861" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:35.533486" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:35.534218" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:35.534006" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:35.533989" elapsed="0.000323"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:35.534344" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:35.536902" elapsed="0.000497"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:25:35.538637" elapsed="0.000516"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:35.540346" 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-10-16T01:25:35.535198" elapsed="0.005778"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:35.534648" elapsed="0.006460"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:35.424992" elapsed="0.116194"/>
</kw>
<msg time="2026-10-16T01:25:35.541272" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:35.541312" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:35.424305" elapsed="0.117041"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:35.541502" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:25:35.541415" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:35.541399" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:35.541918" 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-10-16T01:25:35.542230" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:35.542295" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:25:35.423650" elapsed="0.118730"/>
</kw>
<msg time="2026-10-16T01:25:35.542465" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:35.542506" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:35.421791" elapsed="0.120749"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:35.542907" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:35.542606" elapsed="0.000352"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:35.542591" elapsed="0.000389"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:25:35.421603" elapsed="0.121399"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:35.545530" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:35.545446" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:35.545429" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:35.546689" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:35.546606" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:35.546589" elapsed="0.000187"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:35.547159" 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-10-16T01:25:35.546918" elapsed="0.000266"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:35.547562" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:35.547376" elapsed="0.000210"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:35.579715" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:35.548179" elapsed="0.031712"/>
</kw>
<msg time="2026-10-16T01:25:35.580044" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:35.580099" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:35.547756" elapsed="0.032379"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:35.653053" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:35.580738" elapsed="0.072506"/>
</kw>
<msg time="2026-10-16T01:25:35.653410" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:35.653451" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:35.580296" elapsed="0.073189"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:35.653784" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:35.653554" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:35.653537" elapsed="0.000342"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:35.654404" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:35.654056" elapsed="0.000427"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:35.654753" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:35.654543" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:35.654526" elapsed="0.000320"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:35.654876" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:35.657340" 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-10-16T01:25:35.659048" elapsed="0.000464"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:35.660690" 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-10-16T01:25:35.655640" elapsed="0.005440"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:35.655156" elapsed="0.006081"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:35.546349" elapsed="0.114964"/>
</kw>
<msg time="2026-10-16T01:25:35.661394" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:35.661433" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:35.545760" elapsed="0.115707"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:35.661619" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:25:35.661535" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:35.661518" elapsed="0.000192"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:35.662024" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:35.662338" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:35.662438" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:25:35.545146" elapsed="0.117379"/>
</kw>
<msg time="2026-10-16T01:25:35.662607" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:35.662646" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:35.543269" elapsed="0.119410"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:35.662974" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:35.662760" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:35.662744" elapsed="0.000301"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:25:35.543132" elapsed="0.119934"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:25:35.286039" elapsed="0.377070"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:25:35.281233" elapsed="0.381930"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:25:35.276947" elapsed="0.386268"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:35.276032" elapsed="0.387225"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:25:35.273405" elapsed="0.389903"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:35.666908" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:35.666652" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:35.666635" elapsed="0.000348"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:35.667319" 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-10-16T01:25:35.667411" 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-10-16T01:25:35.667188" elapsed="0.000247"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:35.668225" 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.104" 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-10-16T01:25:35.667619" elapsed="0.000649"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:35.668762" level="INFO">${conn_id} = 634</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-10-16T01:25:35.668441" elapsed="0.000345"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:25:35.669607" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:25:35.669676" 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-10-16T01:25:35.669341" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:35.669859" elapsed="0.000294"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:25:35.670916" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:25:36.021560" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:25:29 UTC 2026

  System load:  0.02               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%

 * Canonical Workshop gives developers fast, composable, reproducible, and
   secure developer environments that are perfect for agentic workflows.

   https://ubuntu.com/workshop

Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:25:29 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:25:35.670671" elapsed="0.351025"/>
</kw>
<msg time="2026-10-16T01:25:36.021900" 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-10-16T01:25:35.670314" elapsed="0.351671"/>
</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-10-16T01:25:35.668977" elapsed="0.353121"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:25:36.022599" level="INFO">Executing command 'sudo ovs-vsctl add-port br-s1 vx1 -- set Interface vx1 type=vxlan'.</msg>
<msg time="2026-10-16T01:25:36.067792" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:25:36.068038" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:25:36.068159" 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-10-16T01:25:36.022370" elapsed="0.045843"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:36.068576" elapsed="0.000480"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:36.070234" 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-10-16T01:25:36.069602" 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-10-16T01:25:36.070748" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:36.070486" elapsed="0.000368"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:36.070443" elapsed="0.000461"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:25:36.071215" elapsed="0.000054"/>
</return>
<status status="PASS" start="2026-10-16T01:25:36.071012" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:36.070981" elapsed="0.000404"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:25:36.071454" elapsed="0.000027"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:36.073069" elapsed="0.000690"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:25:36.074185" elapsed="0.000317"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:36.074845" elapsed="0.000198"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:25:36.072151" elapsed="0.003019"/>
</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-10-16T01:25:35.666238" elapsed="0.409087"/>
</kw>
<msg time="2026-10-16T01:25:36.075426" 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-10-16T01:25:35.665682" elapsed="0.409843"/>
</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-10-16T01:25:35.665266" elapsed="0.410412"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:25:36.076852" 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-10-16T01:25:36.076159" elapsed="0.000748"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:25:36.078008" 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-10-16T01:25:36.077355" elapsed="0.000706"/>
</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-10-16T01:25:36.088184" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:25:36.087391" elapsed="0.000859"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:25:36.088923" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:25:36.088514" elapsed="0.000443"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:25:36.089014" elapsed="0.000037"/>
</return>
<msg time="2026-10-16T01:25:36.089210" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:25:36.086556" elapsed="0.002686"/>
</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-10-16T01:25:36.092833" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:25:36.092441" elapsed="0.000480"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:25:36.092982" elapsed="0.000037"/>
</return>
<msg time="2026-10-16T01:25:36.093203" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:25:36.091992" elapsed="0.001243"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:36.094852" 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-10-16T01:25:36.094518" elapsed="0.000393"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:36.095487" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:25:36.095183" elapsed="0.000360"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:25:36.100422" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:25:36.100495" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:25:36.100631" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:25:36.095959" elapsed="0.005220">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:25:36.095627" elapsed="0.005657">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:25:36.101534" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:36.101328" elapsed="0.000288"/>
</branch>
<status status="FAIL" start="2026-10-16T01:25:36.095603" elapsed="0.006044">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:25:36.102160" elapsed="0.000033"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:25:36.102326" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:36.102281" elapsed="0.000099"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:25:36.102259" elapsed="0.000149"/>
</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-10-16T01:25:36.102594" elapsed="0.000027"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:25:36.102681" 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-10-16T01:25:36.093645" elapsed="0.009194">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:25:36.102914" 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-10-16T01:25:36.091410" elapsed="0.011623">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:25:36.103337" elapsed="0.000030"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:25:36.089476" elapsed="0.013956">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:25:36.089314" elapsed="0.014190">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:25:36.085349" elapsed="0.018270">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:25:37.113670" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:25:37.112758" elapsed="0.001014"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:25:37.114809" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:25:37.114151" elapsed="0.000714"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:25:37.114964" elapsed="0.000081"/>
</return>
<msg time="2026-10-16T01:25:37.115308" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:25:37.111872" elapsed="0.003489"/>
</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-10-16T01:25:37.121311" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:25:37.120647" elapsed="0.000719"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:25:37.121461" elapsed="0.000057"/>
</return>
<msg time="2026-10-16T01:25:37.121763" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:25:37.119907" elapsed="0.001911"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:37.124548" 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-10-16T01:25:37.123942" elapsed="0.000700"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:37.125601" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:25:37.125111" elapsed="0.000578"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:25:37.132233" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:25:37.132349" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:25:37.132570" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:25:37.126398" elapsed="0.007015">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:25:37.125870" elapsed="0.007708">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:25:37.134018" elapsed="0.000491"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:37.133651" elapsed="0.000951"/>
</branch>
<status status="FAIL" start="2026-10-16T01:25:37.125830" elapsed="0.008825">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:25:37.135497" elapsed="0.000054"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:25:37.135802" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:37.135692" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:25:37.135656" elapsed="0.000281"/>
</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-10-16T01:25:37.136264" elapsed="0.000045"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:25:37.136405" elapsed="0.000031"/>
</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-10-16T01:25:37.122517" elapsed="0.014102">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:25:37.136771" 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-10-16T01:25:37.118935" elapsed="0.018030">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:25:37.137520" elapsed="0.000050"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:25:37.115775" elapsed="0.021900">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:25:37.115482" elapsed="0.022342">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:25:37.110388" elapsed="0.027621">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:25:38.147541" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:25:38.146654" elapsed="0.000950"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:25:38.148629" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:25:38.147982" elapsed="0.000700"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:25:38.148811" elapsed="0.000075"/>
</return>
<msg time="2026-10-16T01:25:38.149144" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:25:38.145821" elapsed="0.003378"/>
</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-10-16T01:25:38.155137" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:25:38.154475" elapsed="0.000718"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:25:38.155286" elapsed="0.000057"/>
</return>
<msg time="2026-10-16T01:25:38.155557" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:25:38.153736" elapsed="0.001872"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:38.158271" 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-10-16T01:25:38.157745" elapsed="0.000623"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:38.159323" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:25:38.158811" elapsed="0.000601"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:25:38.165947" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:25:38.166062" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:25:38.166306" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:25:38.160119" elapsed="0.007008">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:25:38.159554" elapsed="0.007737">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:25:38.167697" elapsed="0.000088"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:38.167364" elapsed="0.000508"/>
</branch>
<status status="FAIL" start="2026-10-16T01:25:38.159515" elapsed="0.008406">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:25:38.169306" elapsed="0.000056"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:25:38.169684" elapsed="0.000059"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:38.169609" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:25:38.169570" elapsed="0.000280"/>
</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-10-16T01:25:38.170186" elapsed="0.000046"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:25:38.170330" elapsed="0.000030"/>
</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-10-16T01:25:38.156317" elapsed="0.014225">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:25:38.170661" 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-10-16T01:25:38.152774" elapsed="0.018112">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:25:38.171371" elapsed="0.000050"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:25:38.149571" elapsed="0.021957">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:25:38.149314" elapsed="0.022329">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:25:38.144544" elapsed="0.027315">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:25:39.181474" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:25:39.180588" elapsed="0.000950"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:25:39.182562" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:25:39.181922" elapsed="0.000694"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:25:39.182743" elapsed="0.000075"/>
</return>
<msg time="2026-10-16T01:25:39.183052" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:25:39.179752" elapsed="0.003371"/>
</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-10-16T01:25:39.188973" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:25:39.188345" elapsed="0.000683"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:25:39.189144" elapsed="0.000057"/>
</return>
<msg time="2026-10-16T01:25:39.189414" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:25:39.187589" elapsed="0.001876"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:39.192123" 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-10-16T01:25:39.191568" elapsed="0.000651"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:39.193165" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:25:39.192631" 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-10-16T01:25:39.199834" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:25:39.199947" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:25:39.200186" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:25:39.193928" elapsed="0.007183">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:25:39.193395" elapsed="0.007880">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:25:39.201679" elapsed="0.000078"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:39.201345" elapsed="0.000521"/>
</branch>
<status status="FAIL" start="2026-10-16T01:25:39.193355" elapsed="0.008562">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:25:39.202672" elapsed="0.000129"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:25:39.203028" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:39.202955" elapsed="0.000184"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:25:39.202918" elapsed="0.000266"/>
</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-10-16T01:25:39.203495" elapsed="0.000043"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:25:39.203632" elapsed="0.000030"/>
</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-10-16T01:25:39.190179" elapsed="0.013697">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:25:39.203996" 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-10-16T01:25:39.186641" elapsed="0.017569">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:25:39.204667" elapsed="0.000078"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:25:39.183492" elapsed="0.021358">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:25:39.183239" elapsed="0.021725">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:25:39.178464" elapsed="0.027105">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:25:40.214679" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:25:40.213873" elapsed="0.000899"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:25:40.215849" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:25:40.215137" elapsed="0.000769"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:25:40.215998" elapsed="0.000088"/>
</return>
<msg time="2026-10-16T01:25:40.216318" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:25:40.213014" elapsed="0.003355"/>
</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-10-16T01:25:40.222284" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:25:40.221617" elapsed="0.000722"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:25:40.222431" elapsed="0.000056"/>
</return>
<msg time="2026-10-16T01:25:40.222729" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:25:40.220886" elapsed="0.001899"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:40.225417" 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-10-16T01:25:40.224889" elapsed="0.000623"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:40.226475" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:25:40.225961" 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-10-16T01:25:40.233036" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:25:40.233180" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:25:40.233389" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:25:40.227372" elapsed="0.006797">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:25:40.226838" elapsed="0.007492">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:25:40.234764" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:40.234399" elapsed="0.000499"/>
</branch>
<status status="FAIL" start="2026-10-16T01:25:40.226798" elapsed="0.008149">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:25:40.235905" elapsed="0.000055"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:25:40.236204" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:40.236127" elapsed="0.000162"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:25:40.236090" elapsed="0.000245"/>
</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-10-16T01:25:40.236636" elapsed="0.000045"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:25:40.236894" 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-10-16T01:25:40.223460" elapsed="0.013672">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:25:40.237256" 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-10-16T01:25:40.219920" elapsed="0.017527">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:25:40.237934" elapsed="0.000050"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:25:40.216753" elapsed="0.021357">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:25:40.216476" elapsed="0.021751">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:25:40.211864" elapsed="0.026544">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:25:41.248603" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:25:41.247788" elapsed="0.000877"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:25:41.249663" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:25:41.249036" elapsed="0.000712"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:25:41.249845" elapsed="0.000065"/>
</return>
<msg time="2026-10-16T01:25:41.250213" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:25:41.246919" elapsed="0.003347"/>
</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-10-16T01:25:41.256308" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:25:41.255645" elapsed="0.000720"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:25:41.256460" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:25:41.256764" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:25:41.254916" elapsed="0.001903"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:41.259442" 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-10-16T01:25:41.258916" elapsed="0.000620"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:41.260494" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:25:41.259982" elapsed="0.000602"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:25:41.266685" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:25:41.266837" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:25:41.267092" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:25:41.261280" elapsed="0.006584">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:25:41.260756" elapsed="0.007272">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:25:41.268456" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:41.268122" elapsed="0.000463"/>
</branch>
<status status="FAIL" start="2026-10-16T01:25:41.260686" elapsed="0.007948">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:25:41.269418" elapsed="0.000052"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:25:41.269686" elapsed="0.000057"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:41.269614" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:25:41.269578" 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-10-16T01:25:41.270172" elapsed="0.000045"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:25:41.270311" elapsed="0.000031"/>
</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-10-16T01:25:41.257492" elapsed="0.013028">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:25:41.270637" 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-10-16T01:25:41.253951" elapsed="0.016906">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:25:41.271338" elapsed="0.000050"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:25:41.250809" elapsed="0.020684">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:25:41.250519" elapsed="0.021087">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:25:41.245367" elapsed="0.026450">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<msg time="2026-10-16T01:25:41.272105" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<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="FAIL" start="2026-10-16T01:25:36.078507" elapsed="5.193796">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${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="NOT RUN" start="2026-10-16T01:25:41.272836" elapsed="0.000045"/>
</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="FAIL" start="2026-10-16T01:25:35.664878" elapsed="5.608222">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<doc>Add port with OVS command and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-10-16T01:25:35.271478" elapsed="6.001917">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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-10-16T01:25:41.277354" elapsed="0.000500"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:25:41.276749" elapsed="0.001227"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:41.281081" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:41.280859" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:41.280816" elapsed="0.000411"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:41.285455" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:41.285272" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:41.285235" elapsed="0.000359"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:25:41.287687" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:25:41.286902" elapsed="0.000995"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:25:41.288952" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:25:41.288267" elapsed="0.000742"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:25:41.289127" elapsed="0.000060"/>
</return>
<msg time="2026-10-16T01:25:41.289412" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:25:41.286088" elapsed="0.003373"/>
</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-10-16T01:25:41.294890" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:41.294666" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:41.294629" 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-10-16T01:25:41.297551" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:41.297366" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:41.297329" elapsed="0.000362"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:41.298598" level="INFO">${karaf_connection_index} = 598</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:25:41.298092" elapsed="0.000563"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:41.299499" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:41.299061" elapsed="0.000493"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:41.332178" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:41.300981" elapsed="0.031472"/>
</kw>
<msg time="2026-10-16T01:25:41.332691" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:41.332771" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:41.299933" elapsed="0.032936"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:41.415966" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:41.333935" elapsed="0.082226"/>
</kw>
<msg time="2026-10-16T01:25:41.416323" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:41.416367" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:41.333151" elapsed="0.083250"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:41.416684" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:41.416473" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:41.416455" elapsed="0.000346"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:41.417341" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:41.416980" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:41.417685" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:41.417487" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:41.417470" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:41.417827" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:41.420343" 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-10-16T01:25:41.422082" elapsed="0.000474"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:41.423967" 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-10-16T01:25:41.418624" elapsed="0.005738"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:41.418123" elapsed="0.006355"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:41.296772" elapsed="0.127783"/>
</kw>
<msg time="2026-10-16T01:25:41.424696" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:41.424755" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:41.295377" elapsed="0.129412"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:41.424944" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:25:41.424859" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:41.424842" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:41.425362" 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-10-16T01:25:41.425660" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:41.425817" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:25:41.294010" elapsed="0.131895"/>
</kw>
<msg time="2026-10-16T01:25:41.425989" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:41.426029" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:41.290228" elapsed="0.135869"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:41.426385" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:41.426167" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:41.426151" elapsed="0.000341"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:25:41.289900" elapsed="0.136614"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:41.428899" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:41.428815" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:41.428797" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:41.430071" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:41.429974" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:41.429957" elapsed="0.000177"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:41.430498" level="INFO">${karaf_connection_index} = 600</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:25:41.430276" elapsed="0.000246"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:41.430879" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:41.430681" elapsed="0.000222"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:41.464022" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:41.431483" elapsed="0.032725"/>
</kw>
<msg time="2026-10-16T01:25:41.464363" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:41.464404" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:41.431069" elapsed="0.033368"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:41.556632" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:41.465059" elapsed="0.091779"/>
</kw>
<msg time="2026-10-16T01:25:41.556994" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:41.557035" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:41.464602" elapsed="0.092481"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:41.557359" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:41.557153" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:41.557136" elapsed="0.000317"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:41.557992" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:41.557640" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:41.558372" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:41.558174" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:41.558158" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:41.558495" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:41.561119" elapsed="0.000471"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:25:41.562828" elapsed="0.000475"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:41.564505" 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-10-16T01:25:41.559439" elapsed="0.005484"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:41.558787" elapsed="0.006252"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:41.429716" elapsed="0.135414"/>
</kw>
<msg time="2026-10-16T01:25:41.565249" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:41.565289" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:41.429123" elapsed="0.136202"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:41.565481" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:25:41.565394" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:41.565378" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:41.566146" 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-10-16T01:25:41.566445" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:41.566508" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:25:41.428504" elapsed="0.138088"/>
</kw>
<msg time="2026-10-16T01:25:41.566673" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:41.566728" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:41.426778" elapsed="0.139986"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:41.567059" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:41.566832" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:41.566816" elapsed="0.000316"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:25:41.426623" elapsed="0.140530"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:41.569515" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:41.569429" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:41.569411" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:41.570669" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:41.570586" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:41.570570" elapsed="0.000185"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:41.571135" 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-10-16T01:25:41.570898" elapsed="0.000262"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:41.571501" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:41.571322" elapsed="0.000203"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:41.594959" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:41.572121" elapsed="0.023052"/>
</kw>
<msg time="2026-10-16T01:25:41.595338" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:41.595380" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:41.571679" elapsed="0.023739"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:41.659821" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:41.596114" elapsed="0.063887"/>
</kw>
<msg time="2026-10-16T01:25:41.660171" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:41.660211" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:41.595610" elapsed="0.064635"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:41.660514" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:41.660314" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:41.660296" elapsed="0.000345"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:41.661206" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:41.660844" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:41.661556" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:41.661354" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:41.661337" elapsed="0.000312"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:41.661679" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:41.664156" 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-10-16T01:25:41.665883" elapsed="0.000606"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:41.667674" elapsed="0.000563"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:25:41.662472" elapsed="0.005832"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:41.661966" elapsed="0.006454"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:41.570327" elapsed="0.098175"/>
</kw>
<msg time="2026-10-16T01:25:41.668585" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:41.668623" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:41.569739" elapsed="0.098919"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:41.668830" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:25:41.668744" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:41.668726" elapsed="0.000182"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:41.669240" 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-10-16T01:25:41.669542" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:41.669608" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:25:41.569138" elapsed="0.100554"/>
</kw>
<msg time="2026-10-16T01:25:41.669870" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:41.669909" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:41.567394" elapsed="0.102550"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:41.670242" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:41.670011" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:41.669995" elapsed="0.000318"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:25:41.567260" elapsed="0.103075"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:25:41.289563" elapsed="0.380798"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:25:41.284569" elapsed="0.385842"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:25:41.279266" elapsed="0.391194"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:41.278333" elapsed="0.392168"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:25:41.275338" elapsed="0.395211"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:41.673997" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:41.673725" elapsed="0.000339"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:41.673693" elapsed="0.000396"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:41.674412" 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-10-16T01:25:41.674510" 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-10-16T01:25:41.674281" elapsed="0.000253"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:41.675025" level="INFO">Attempting to execute command "sudo ovs-vsctl del-br br-s1" on remote system "10.30.171.104" 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-10-16T01:25:41.674735" elapsed="0.000348"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:41.675563" level="INFO">${conn_id} = 639</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-10-16T01:25:41.675259" elapsed="0.000328"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:25:41.676436" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:25:41.676505" 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-10-16T01:25:41.676168" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:41.676675" elapsed="0.000300"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:25:41.677775" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:25:42.045709" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:25:29 UTC 2026

  System load:  0.02               Processes:             107
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%

 * Canonical Workshop gives developers fast, composable, reproducible, and
   secure developer environments that are perfect for agentic workflows.

   https://ubuntu.com/workshop

Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:25:35 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:25:41.677522" elapsed="0.368282"/>
</kw>
<msg time="2026-10-16T01:25:42.045864" 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-10-16T01:25:41.677151" elapsed="0.368766"/>
</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-10-16T01:25:41.675796" elapsed="0.370201"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:25:42.046403" level="INFO">Executing command 'sudo ovs-vsctl del-br br-s1'.</msg>
<msg time="2026-10-16T01:25:42.130155" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:25:42.130377" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:25:42.130464" 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-10-16T01:25:42.046231" elapsed="0.084279"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:42.130899" elapsed="0.000431"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:42.132385" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:25:42.131828" elapsed="0.000642"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:25:42.132860" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:42.132614" elapsed="0.000346"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:42.132573" elapsed="0.000434"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:25:42.133315" elapsed="0.000051"/>
</return>
<status status="PASS" start="2026-10-16T01:25:42.133138" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:42.133107" elapsed="0.000374"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:25:42.133548" elapsed="0.000028"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:42.135139" 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-10-16T01:25:42.136219" elapsed="0.000302"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:42.136864" 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-10-16T01:25:42.134223" elapsed="0.003044"/>
</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-10-16T01:25:41.673296" elapsed="0.464128"/>
</kw>
<msg time="2026-10-16T01:25:42.137528" 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-10-16T01:25:41.672768" elapsed="0.464856"/>
</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-10-16T01:25:41.672337" elapsed="0.465482"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:25:42.138958" 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-10-16T01:25:42.138275" elapsed="0.000737"/>
</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-10-16T01:25:42.146283" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:25:42.145496" elapsed="0.000843"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:25:42.147334" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:25:42.146671" elapsed="0.000716"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:25:42.147478" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:25:42.147791" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:25:42.144661" elapsed="0.003182"/>
</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-10-16T01:25:42.153749" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:25:42.153118" elapsed="0.000688"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:25:42.153898" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:25:42.154195" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:25:42.152356" elapsed="0.001891"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:42.156963" 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-10-16T01:25:42.156432" elapsed="0.000648"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:42.158392" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:25:42.157494" elapsed="0.000991"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:25:42.164863" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:25:42.164977" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:25:42.165238" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:25:42.159184" elapsed="0.006917">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:25:42.158621" elapsed="0.007648">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:25:42.166671" elapsed="0.000090"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:42.166337" elapsed="0.000511"/>
</branch>
<status status="FAIL" start="2026-10-16T01:25:42.158584" elapsed="0.008313">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:25:42.167811" elapsed="0.000055"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:25:42.168111" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:42.168010" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:25:42.167974" 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-10-16T01:25:42.168546" elapsed="0.000044"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:25:42.168687" elapsed="0.000059"/>
</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-10-16T01:25:42.154930" elapsed="0.014003">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:25:42.169069" 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-10-16T01:25:42.151397" elapsed="0.017864">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:25:42.169750" elapsed="0.000050"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:25:42.148225" elapsed="0.021682">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:25:42.147954" elapsed="0.022067">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:25:42.143557" elapsed="0.026669">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:25:43.176682" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:25:43.175895" elapsed="0.000879"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:25:43.177778" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:25:43.177134" elapsed="0.000701"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:25:43.177928" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:25:43.178241" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:25:43.175074" elapsed="0.003220"/>
</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-10-16T01:25:43.184148" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:25:43.183484" elapsed="0.000720"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:25:43.184300" elapsed="0.000057"/>
</return>
<msg time="2026-10-16T01:25:43.184568" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:25:43.182756" elapsed="0.001862"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:43.187265" 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-10-16T01:25:43.186742" elapsed="0.000617"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:43.191903" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:25:43.187807" elapsed="0.004193"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:25:43.198324" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:25:43.198438" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:25:43.198787" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:25:43.192686" elapsed="0.006859">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:25:43.192167" elapsed="0.007572">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:25:43.200172" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:43.199812" elapsed="0.000493"/>
</branch>
<status status="FAIL" start="2026-10-16T01:25:43.192127" elapsed="0.008226">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:25:43.201136" elapsed="0.000052"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:25:43.201400" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:43.201329" elapsed="0.000155"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:25:43.201294" 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-10-16T01:25:43.201862" elapsed="0.000044"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:25:43.202005" elapsed="0.000048"/>
</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-10-16T01:25:43.185316" elapsed="0.016920">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:25:43.202355" elapsed="0.000031"/>
</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-10-16T01:25:43.181799" elapsed="0.020742">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:25:43.203030" elapsed="0.000071"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:25:43.178639" elapsed="0.024568">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:25:43.178399" elapsed="0.024923">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:25:43.173920" elapsed="0.029585">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:25:44.210573" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:25:44.209684" elapsed="0.000953"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:25:44.211675" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:25:44.211051" elapsed="0.000711"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:25:44.211860" elapsed="0.000074"/>
</return>
<msg time="2026-10-16T01:25:44.212196" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:25:44.208850" elapsed="0.003398"/>
</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-10-16T01:25:44.218357" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:25:44.217690" elapsed="0.000723"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:25:44.218509" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:25:44.218820" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:25:44.216953" elapsed="0.001919"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:44.221556" 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-10-16T01:25:44.221025" elapsed="0.000626"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:44.222753" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:25:44.222227" 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-10-16T01:25:44.229975" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:25:44.230124" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:25:44.230341" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:25:44.223534" elapsed="0.007626">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:25:44.222991" elapsed="0.008336">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:25:44.231768" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:44.231396" elapsed="0.000507"/>
</branch>
<status status="FAIL" start="2026-10-16T01:25:44.222951" elapsed="0.009003">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:25:44.232748" elapsed="0.000054"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:25:44.233019" elapsed="0.000047"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:44.232946" elapsed="0.000178"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:25:44.232911" 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-10-16T01:25:44.233529" elapsed="0.000045"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:25:44.233674" elapsed="0.000061"/>
</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-10-16T01:25:44.219571" elapsed="0.014348">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:25:44.234063" 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-10-16T01:25:44.215977" elapsed="0.018277">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:25:44.234794" elapsed="0.000052"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:25:44.212620" elapsed="0.022333">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:25:44.212367" elapsed="0.022722">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:25:44.207526" elapsed="0.027748">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:25:45.242242" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:25:45.241375" elapsed="0.000931"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:25:45.243634" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:25:45.242655" elapsed="0.001036"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:25:45.243831" elapsed="0.000072"/>
</return>
<msg time="2026-10-16T01:25:45.244163" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:25:45.240509" elapsed="0.003812"/>
</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-10-16T01:25:45.250266" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:25:45.249595" elapsed="0.000727"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:25:45.250417" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:25:45.250685" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:25:45.248855" elapsed="0.001915"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:45.253432" 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-10-16T01:25:45.252897" elapsed="0.000633"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:45.254492" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:25:45.253982" elapsed="0.000601"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:25:45.260959" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:25:45.261102" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:25:45.261320" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:25:45.255297" elapsed="0.006835">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:25:45.254757" elapsed="0.007540">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:25:45.263158" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:45.262367" elapsed="0.000933"/>
</branch>
<status status="FAIL" start="2026-10-16T01:25:45.254687" elapsed="0.008665">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:25:45.264142" elapsed="0.000054"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:25:45.264410" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:45.264337" elapsed="0.000159"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:25:45.264302" elapsed="0.000239"/>
</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-10-16T01:25:45.264877" elapsed="0.000045"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:25:45.265019" elapsed="0.000081"/>
</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-10-16T01:25:45.251457" elapsed="0.013827">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:25:45.265405" elapsed="0.000031"/>
</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-10-16T01:25:45.247891" elapsed="0.017701">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:25:45.266137" elapsed="0.000052"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:25:45.244728" elapsed="0.021570">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:25:45.244441" elapsed="0.021972">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:25:45.239267" elapsed="0.027405">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:25:46.273154" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:25:46.272330" elapsed="0.000884"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:25:46.274233" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:25:46.273555" elapsed="0.000734"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:25:46.274384" elapsed="0.000063"/>
</return>
<msg time="2026-10-16T01:25:46.274674" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:25:46.271485" elapsed="0.003272"/>
</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-10-16T01:25:46.280666" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:25:46.280057" elapsed="0.000697"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:25:46.280857" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:25:46.281154" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:25:46.279263" elapsed="0.001943"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:46.283861" 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-10-16T01:25:46.283325" elapsed="0.000632"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:46.284927" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:25:46.284401" elapsed="0.000641"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:25:46.290752" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:25:46.290869" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:25:46.291146" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:25:46.285687" elapsed="0.006205">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:25:46.285184" elapsed="0.006893">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:25:46.292485" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:46.292149" elapsed="0.000466"/>
</branch>
<status status="FAIL" start="2026-10-16T01:25:46.285146" elapsed="0.007518">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:25:46.293861" elapsed="0.000055"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:25:46.294158" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:46.294084" elapsed="0.000159"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:25:46.294047" 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-10-16T01:25:46.294592" elapsed="0.000043"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:25:46.294763" 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-10-16T01:25:46.281891" elapsed="0.013183">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:25:46.295198" 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-10-16T01:25:46.278302" elapsed="0.017085">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:25:46.295883" elapsed="0.000052"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:25:46.275139" elapsed="0.020922">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:25:46.274868" elapsed="0.021309">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:25:46.270350" elapsed="0.026008">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:25:47.302868" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:25:47.302069" elapsed="0.000861"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:25:47.303937" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:25:47.303292" elapsed="0.000699"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:25:47.304110" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:25:47.304401" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:25:47.301222" elapsed="0.003230"/>
</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-10-16T01:25:47.310353" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:25:47.309691" elapsed="0.000718"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:25:47.310505" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:25:47.310810" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:25:47.308958" elapsed="0.001904"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:47.313487" 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-10-16T01:25:47.312965" elapsed="0.000616"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:47.314537" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:25:47.314052" elapsed="0.000574"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:25:47.320963" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:25:47.321104" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:25:47.321309" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:25:47.315329" elapsed="0.006747">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:25:47.314795" elapsed="0.007446">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:25:47.322646" elapsed="0.000163"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:47.322310" elapsed="0.000595"/>
</branch>
<status status="FAIL" start="2026-10-16T01:25:47.314756" elapsed="0.008199">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:25:47.323742" elapsed="0.000055"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:25:47.324029" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:47.323937" elapsed="0.000180"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:25:47.323902" elapsed="0.000259"/>
</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-10-16T01:25:47.324467" elapsed="0.000043"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:25:47.324606" elapsed="0.000031"/>
</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-10-16T01:25:47.311535" elapsed="0.013313">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:25:47.324970" 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-10-16T01:25:47.307998" elapsed="0.017183">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:25:47.326077" elapsed="0.000054"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:25:47.304836" elapsed="0.021405">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:25:47.304557" elapsed="0.021799">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:25:47.300083" elapsed="0.026456">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<msg time="2026-10-16T01:25:47.326757" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</msg>
<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="FAIL" start="2026-10-16T01:25:42.139466" elapsed="5.187487">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<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-10-16T01:25:41.671958" elapsed="5.655234">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<doc>Delete bridge with OVS command and verify it gets deleted from all instances.</doc>
<status status="FAIL" start="2026-10-16T01:25:41.274186" elapsed="6.053296">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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-10-16T01:25:47.330830" elapsed="0.000487"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:25:47.330247" elapsed="0.001185"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:47.333604" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:47.333411" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:47.333372" elapsed="0.000423"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:47.338158" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:47.337948" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:47.337911" elapsed="0.000389"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:25:47.340350" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:25:47.339577" elapsed="0.000830"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:25:47.341489" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:25:47.340848" elapsed="0.000696"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:25:47.341637" elapsed="0.000060"/>
</return>
<msg time="2026-10-16T01:25:47.341960" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:25:47.338771" elapsed="0.003307"/>
</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-10-16T01:25:47.347849" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:47.347626" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:47.347586" elapsed="0.000405"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:47.350864" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:47.350643" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:47.350597" elapsed="0.000358"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:47.351521" level="INFO">${karaf_connection_index} = 598</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:25:47.351190" elapsed="0.000367"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:47.352110" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:47.351816" elapsed="0.000330"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:47.384399" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:47.353361" elapsed="0.031210"/>
</kw>
<msg time="2026-10-16T01:25:47.384759" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:47.384801" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:47.352362" elapsed="0.032473"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:47.446912" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:47.385440" elapsed="0.061666"/>
</kw>
<msg time="2026-10-16T01:25:47.447261" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:47.447302" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:47.384999" elapsed="0.062336"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:47.447607" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:47.447404" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:47.447386" elapsed="0.000337"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:47.448253" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:47.447903" elapsed="0.000434"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:47.448593" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:47.448397" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:47.448381" elapsed="0.000305"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:47.448736" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:47.451244" elapsed="0.000494"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:25:47.452982" elapsed="0.000557"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:47.454756" 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-10-16T01:25:47.449544" elapsed="0.005608"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:47.449043" elapsed="0.006272"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:47.349800" elapsed="0.105592"/>
</kw>
<msg time="2026-10-16T01:25:47.455474" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:47.455514" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:47.348339" elapsed="0.107208"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:47.455986" elapsed="0.000066"/>
</return>
<status status="PASS" start="2026-10-16T01:25:47.455616" elapsed="0.000470"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:47.455600" elapsed="0.000510"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:47.456431" 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-10-16T01:25:47.456738" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:47.456804" 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-10-16T01:25:47.346914" elapsed="0.109974"/>
</kw>
<msg time="2026-10-16T01:25:47.456973" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:47.457026" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:47.342834" elapsed="0.114227"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:47.457346" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:47.457129" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:47.457114" elapsed="0.000303"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:25:47.342495" elapsed="0.114944"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:47.460160" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:47.460075" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:47.460058" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:47.461313" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:47.461230" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:47.461213" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:47.461764" level="INFO">${karaf_connection_index} = 600</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:25:47.461518" elapsed="0.000270"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:47.462142" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:47.461949" elapsed="0.000217"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:47.496561" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:47.462745" elapsed="0.034009"/>
</kw>
<msg time="2026-10-16T01:25:47.496924" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:47.496966" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:47.462318" elapsed="0.034681"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:47.575231" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:47.497610" elapsed="0.077804"/>
</kw>
<msg time="2026-10-16T01:25:47.575569" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:47.575610" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:47.497182" elapsed="0.078463"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:47.575978" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:47.575768" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:47.575749" elapsed="0.000380"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:47.576655" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:47.576317" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:47.577034" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:47.576819" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:47.576803" elapsed="0.000325"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:47.577159" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:47.579600" 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-10-16T01:25:47.581329" elapsed="0.000473"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:47.583177" elapsed="0.000303"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:25:47.577943" elapsed="0.005604"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:47.577424" elapsed="0.006239"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:47.460958" elapsed="0.122797"/>
</kw>
<msg time="2026-10-16T01:25:47.583837" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:47.583877" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:47.460369" elapsed="0.123543"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:47.584079" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:25:47.583980" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:47.583963" elapsed="0.000193"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:47.584465" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:47.584848" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:47.584914" 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-10-16T01:25:47.459770" elapsed="0.125229"/>
</kw>
<msg time="2026-10-16T01:25:47.585100" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:47.585140" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:47.457681" elapsed="0.127494"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:47.585455" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:47.585241" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:47.585225" elapsed="0.000302"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:25:47.457546" elapsed="0.128003"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:47.588118" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:47.588032" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:47.587999" elapsed="0.000183"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:47.589277" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:47.589194" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:47.589178" elapsed="0.000161"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:47.589756" 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-10-16T01:25:47.589514" elapsed="0.000267"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:47.590137" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:47.589943" elapsed="0.000218"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:47.624775" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:47.590752" elapsed="0.034193"/>
</kw>
<msg time="2026-10-16T01:25:47.625131" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:47.625172" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:47.590316" elapsed="0.034891"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:47.710052" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:47.625802" elapsed="0.084433"/>
</kw>
<msg time="2026-10-16T01:25:47.710390" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:47.710431" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:47.625368" elapsed="0.085098"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:47.710765" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:47.710534" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:47.710517" elapsed="0.000345"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:47.711409" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:47.711069" elapsed="0.000426"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:47.711772" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:47.711555" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:47.711538" elapsed="0.000329"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:47.711897" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:47.714382" 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-10-16T01:25:47.716119" elapsed="0.000452"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:47.717773" 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-10-16T01:25:47.712676" elapsed="0.005495"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:47.712183" elapsed="0.006105"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:47.588923" elapsed="0.129443"/>
</kw>
<msg time="2026-10-16T01:25:47.718447" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:47.718486" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:47.588327" elapsed="0.130195"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:47.718676" elapsed="0.000301"/>
</return>
<status status="PASS" start="2026-10-16T01:25:47.718590" elapsed="0.000438"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:47.718574" elapsed="0.000478"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:47.719364" 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-10-16T01:25:47.719720" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:47.719787" 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-10-16T01:25:47.587721" elapsed="0.132153"/>
</kw>
<msg time="2026-10-16T01:25:47.719957" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:47.719997" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:47.585805" elapsed="0.134243"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:47.720332" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:47.720116" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:47.720100" elapsed="0.000304"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:25:47.585654" elapsed="0.134771"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:25:47.342186" elapsed="0.378266"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:25:47.337260" elapsed="0.383243"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:25:47.332803" elapsed="0.387752"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:47.331833" elapsed="0.388763"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:25:47.329432" elapsed="0.391213"/>
</kw>
<kw name="Create Sample Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:25:47.724739" 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-10-16T01:25:47.723493" elapsed="0.001283">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-10-16T01:25:47.328229" elapsed="0.396677">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-10-16T01:25:47.726336" elapsed="0.000200"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:25:47.726091" elapsed="0.000495"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:47.727488" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:47.727400" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:47.727383" elapsed="0.000168"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:47.729420" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:47.729338" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:47.729321" elapsed="0.000163"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:25:47.730399" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:25:47.730071" elapsed="0.000354"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:25:47.730860" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:25:47.730573" elapsed="0.000311"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:25:47.730924" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:25:47.731069" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:25:47.729682" elapsed="0.001410"/>
</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-10-16T01:25:47.733620" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:47.733536" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:47.733518" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:47.734802" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:47.734695" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:47.734679" elapsed="0.000185"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:47.735247" level="INFO">${karaf_connection_index} = 598</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:25:47.735022" elapsed="0.000250"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:47.735654" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:47.735471" elapsed="0.000207"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:47.759276" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:47.736276" elapsed="0.023170"/>
</kw>
<msg time="2026-10-16T01:25:47.759641" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:47.759682" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:47.735849" elapsed="0.023885"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:47.803787" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:47.760422" elapsed="0.043549"/>
</kw>
<msg time="2026-10-16T01:25:47.804144" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:47.804186" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:47.759924" elapsed="0.044298"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:47.804501" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:47.804292" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:47.804274" elapsed="0.000320"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:47.805159" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:47.804802" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:47.805501" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:47.805303" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:47.805287" elapsed="0.000306"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:47.805623" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:47.808058" 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-10-16T01:25:47.809752" elapsed="0.000466"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:47.811398" 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-10-16T01:25:47.806419" elapsed="0.005374"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:47.805914" elapsed="0.005994"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:47.734438" elapsed="0.077545"/>
</kw>
<msg time="2026-10-16T01:25:47.812078" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:47.812117" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:47.733846" elapsed="0.078306"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:47.812302" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:25:47.812219" elapsed="0.000136"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:47.812202" elapsed="0.000175"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:47.812687" elapsed="0.000311"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:47.813288" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:47.813390" 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-10-16T01:25:47.733246" elapsed="0.080233"/>
</kw>
<msg time="2026-10-16T01:25:47.813560" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:47.813599" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:47.731417" elapsed="0.082217"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:47.813931" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:47.813715" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:47.813685" elapsed="0.000318"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:25:47.731279" elapsed="0.082762"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:47.816508" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:47.816424" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:47.816406" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:47.817804" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:47.817717" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:47.817682" elapsed="0.000185"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:47.818246" level="INFO">${karaf_connection_index} = 600</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:25:47.818023" elapsed="0.000248"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:47.818648" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:47.818431" elapsed="0.000241"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:47.851181" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:47.819275" elapsed="0.032094"/>
</kw>
<msg time="2026-10-16T01:25:47.851521" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:47.851562" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:47.818844" elapsed="0.032752"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:47.921937" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:47.852206" elapsed="0.069923"/>
</kw>
<msg time="2026-10-16T01:25:47.922283" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:47.922324" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:47.851776" elapsed="0.070582"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:47.922623" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:47.922426" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:47.922409" elapsed="0.000328"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:47.923267" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:47.922917" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:47.923611" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:47.923417" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:47.923401" elapsed="0.000318"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:47.923751" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:47.926200" 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-10-16T01:25:47.927944" elapsed="0.000462"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:47.929584" elapsed="0.000570"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:25:47.924517" elapsed="0.005704"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:47.924031" elapsed="0.006306"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:47.817441" elapsed="0.112972"/>
</kw>
<msg time="2026-10-16T01:25:47.930494" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:47.930532" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:47.816823" elapsed="0.113744"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:47.930735" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:25:47.930635" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:47.930619" elapsed="0.000193"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:47.931134" 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-10-16T01:25:47.931430" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:47.931493" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:25:47.816133" elapsed="0.115444"/>
</kw>
<msg time="2026-10-16T01:25:47.931659" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:47.931739" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:47.814282" elapsed="0.117495"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:47.932074" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:47.931845" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:47.931829" elapsed="0.000317"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:25:47.814149" elapsed="0.118019"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:47.934680" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:47.934592" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:47.934575" elapsed="0.000188"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:47.935856" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:47.935772" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:47.935756" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:47.936296" 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-10-16T01:25:47.936073" elapsed="0.000247"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:47.936655" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:47.936477" elapsed="0.000201"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:47.972906" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:47.937273" elapsed="0.035818"/>
</kw>
<msg time="2026-10-16T01:25:47.973246" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:47.973287" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:47.936847" elapsed="0.036475"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:48.053485" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:47.973936" elapsed="0.079760"/>
</kw>
<msg time="2026-10-16T01:25:48.053870" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:48.053911" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:47.973483" elapsed="0.080464"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:48.054254" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:48.054051" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:48.053998" elapsed="0.000351"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:48.054886" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:48.054524" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:48.055237" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:48.055042" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:48.055025" elapsed="0.000304"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:48.055359" elapsed="0.000024"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:48.057760" elapsed="0.000474"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:25:48.059443" elapsed="0.000486"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:48.061123" elapsed="0.000306"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:25:48.056137" elapsed="0.005357"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:48.055620" elapsed="0.005993"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:47.935495" elapsed="0.126193"/>
</kw>
<msg time="2026-10-16T01:25:48.061923" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:48.061962" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:47.934909" elapsed="0.127088"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:48.062162" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:25:48.062079" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:48.062062" elapsed="0.000176"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:48.062544" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:48.062853" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:48.062919" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:25:47.934304" elapsed="0.128711"/>
</kw>
<msg time="2026-10-16T01:25:48.063100" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:48.063139" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:47.932410" elapsed="0.130764"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:48.063453" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:48.063241" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:48.063225" elapsed="0.000299"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:25:47.932275" elapsed="0.131269"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:25:47.731140" elapsed="0.332430"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:25:47.729041" elapsed="0.334579"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:25:47.727148" elapsed="0.336660"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:47.726748" elapsed="0.337102"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:25:47.725732" elapsed="0.338166"/>
</kw>
<kw name="Create Sample Port And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:25:48.069434" 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-10-16T01:25:48.068207" elapsed="0.001263">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-10-16T01:25:47.725209" elapsed="0.344386">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-10-16T01:25:48.071024" elapsed="0.000201"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:25:48.070767" elapsed="0.000507"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:48.072175" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:48.072090" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:48.072073" elapsed="0.000166"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:48.074119" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:48.073982" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:48.073966" elapsed="0.000215"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:25:48.075077" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:25:48.074738" elapsed="0.000363"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:25:48.075516" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:25:48.075248" elapsed="0.000292"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:25:48.075580" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:25:48.075720" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:25:48.074377" elapsed="0.001367"/>
</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-10-16T01:25:48.078242" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:48.078157" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:48.078140" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:48.079387" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:48.079305" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:48.079289" elapsed="0.000161"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:48.079838" level="INFO">${karaf_connection_index} = 598</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:25:48.079590" elapsed="0.000273"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:48.080211" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:48.080033" elapsed="0.000202"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:48.104243" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:48.080805" elapsed="0.023607"/>
</kw>
<msg time="2026-10-16T01:25:48.104597" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:48.104642" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:48.080386" elapsed="0.024289"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:48.165513" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:48.105340" elapsed="0.060350"/>
</kw>
<msg time="2026-10-16T01:25:48.165898" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:48.165939" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:48.104866" elapsed="0.061105"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:48.166259" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:48.166054" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:48.166036" elapsed="0.000315"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:48.166887" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:48.166525" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:48.167240" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:48.167045" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:48.167028" elapsed="0.000304"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:48.167363" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:48.169789" 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-10-16T01:25:48.171516" elapsed="0.000478"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:48.173184" elapsed="0.000307"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:25:48.168142" elapsed="0.005413"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:48.167625" elapsed="0.006050"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:48.079051" elapsed="0.094715"/>
</kw>
<msg time="2026-10-16T01:25:48.173847" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:48.173887" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:48.078450" elapsed="0.095470"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:48.174089" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:25:48.173987" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:48.173971" elapsed="0.000194"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:48.174473" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:48.174796" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:48.174861" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:25:48.077854" elapsed="0.097090"/>
</kw>
<msg time="2026-10-16T01:25:48.175137" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:48.175176" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:48.076078" elapsed="0.099131"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:48.175491" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:48.175276" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:48.175261" elapsed="0.000300"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:25:48.075928" elapsed="0.099654"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:48.178224" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:48.178140" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:48.178122" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:48.179427" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:48.179344" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:48.179328" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:48.180053" level="INFO">${karaf_connection_index} = 600</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:25:48.179629" elapsed="0.000449"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:48.180416" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:48.180238" elapsed="0.000202"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:48.214270" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:48.181039" elapsed="0.033409"/>
</kw>
<msg time="2026-10-16T01:25:48.214606" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:48.214657" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:48.180596" elapsed="0.034132"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:48.310978" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:48.215371" elapsed="0.095810"/>
</kw>
<msg time="2026-10-16T01:25:48.311338" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:48.311379" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:48.214911" elapsed="0.096504"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:48.311690" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:48.311485" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:48.311468" elapsed="0.000354"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:48.312377" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:48.312023" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:48.312758" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:48.312532" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:48.312515" elapsed="0.000344"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:48.312891" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:48.315425" 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-10-16T01:25:48.317207" elapsed="0.000457"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:48.319130" 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-10-16T01:25:48.313689" elapsed="0.005823"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:48.313182" elapsed="0.006449"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:48.179091" elapsed="0.140641"/>
</kw>
<msg time="2026-10-16T01:25:48.319826" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:48.319867" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:48.178470" elapsed="0.141435"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:48.320082" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-16T01:25:48.319975" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:48.319958" 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-10-16T01:25:48.320534" 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-10-16T01:25:48.320943" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:48.321032" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:25:48.177836" elapsed="0.143289"/>
</kw>
<msg time="2026-10-16T01:25:48.321210" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:48.321251" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:48.175978" elapsed="0.145310"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:48.321580" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:48.321357" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:48.321340" elapsed="0.000315"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:25:48.175690" elapsed="0.145987"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:48.324271" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:48.324186" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:48.324169" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:48.325421" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:48.325338" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:48.325321" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:48.325889" 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-10-16T01:25:48.325625" elapsed="0.000291"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:48.326283" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:48.326097" elapsed="0.000212"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:48.361939" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:48.326924" elapsed="0.035224"/>
</kw>
<msg time="2026-10-16T01:25:48.362308" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:48.362349" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:48.326467" elapsed="0.035918"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:48.473158" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:48.363055" elapsed="0.110289"/>
</kw>
<msg time="2026-10-16T01:25:48.473501" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:48.473542" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:48.362551" elapsed="0.111027"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:48.473875" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:48.473646" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:48.473628" elapsed="0.000341"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:48.474500" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:48.474165" elapsed="0.000424"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:48.474905" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:48.474689" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:48.474671" elapsed="0.000342"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:48.475045" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:48.477462" elapsed="0.000488"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:25:48.479176" elapsed="0.000449"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:48.480828" 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-10-16T01:25:48.475815" elapsed="0.005401"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:48.475312" elapsed="0.006022"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:48.325083" elapsed="0.156327"/>
</kw>
<msg time="2026-10-16T01:25:48.481491" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:48.481530" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:48.324479" elapsed="0.157087"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:48.481739" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:25:48.481634" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:48.481618" elapsed="0.000198"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:48.482138" 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-10-16T01:25:48.482434" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:48.482497" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:25:48.323878" elapsed="0.158704"/>
</kw>
<msg time="2026-10-16T01:25:48.482664" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:48.482729" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:48.321961" elapsed="0.160805"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:48.483063" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:48.482834" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:48.482818" elapsed="0.000318"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:25:48.321820" elapsed="0.161337"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:25:48.075791" elapsed="0.407391"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:25:48.073681" elapsed="0.409553"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:25:48.071824" elapsed="0.411460"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:48.071424" elapsed="0.411900"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:25:48.070421" elapsed="0.412951"/>
</kw>
<kw name="Modify the destination IP of Sample Port" owner="ClusterOvsdb">
<msg time="2026-10-16T01:25:48.486559" 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-10-16T01:25:48.485317" elapsed="0.001279">Variable '${original_owner}' not found.</status>
</kw>
<doc>Modify the dst ip of existing port in Owner.</doc>
<status status="FAIL" start="2026-10-16T01:25:48.069963" elapsed="0.416777">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-10-16T01:25:48.488013" elapsed="0.000200"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:25:48.487757" elapsed="0.000506"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:48.489266" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:48.489182" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:48.489165" elapsed="0.000165"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:48.491181" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:48.491099" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:48.491082" elapsed="0.000162"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:25:48.492155" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:25:48.491811" elapsed="0.000368"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:25:48.492595" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:25:48.492328" elapsed="0.000290"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:25:48.492658" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:25:48.492804" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:25:48.491442" elapsed="0.001385"/>
</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-10-16T01:25:48.495344" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:48.495261" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:48.495244" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:48.496506" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:48.496425" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:48.496408" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:48.496957" level="INFO">${karaf_connection_index} = 598</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:25:48.496733" elapsed="0.000248"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:48.497335" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:48.497156" elapsed="0.000204"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:48.522020" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:48.497941" elapsed="0.024286"/>
</kw>
<msg time="2026-10-16T01:25:48.522396" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:48.522439" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:48.497513" elapsed="0.024961"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:48.562562" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:48.523153" elapsed="0.039619"/>
</kw>
<msg time="2026-10-16T01:25:48.562934" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:48.562976" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:48.522640" elapsed="0.040387"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:48.563302" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:48.563098" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:48.563081" elapsed="0.000318"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:48.563955" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:48.563578" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:48.564333" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:48.564118" elapsed="0.000366"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:48.564102" elapsed="0.000419"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:48.564569" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:48.567362" 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-10-16T01:25:48.569105" elapsed="0.000549"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:48.570925" 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-10-16T01:25:48.565658" elapsed="0.005670"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:48.564901" elapsed="0.006547"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:48.496168" elapsed="0.075359"/>
</kw>
<msg time="2026-10-16T01:25:48.571610" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:48.571650" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:48.495555" elapsed="0.076131"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:48.572112" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-10-16T01:25:48.572011" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:48.571980" 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-10-16T01:25:48.572511" 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-10-16T01:25:48.572840" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:48.572909" 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-10-16T01:25:48.494936" elapsed="0.078061"/>
</kw>
<msg time="2026-10-16T01:25:48.573101" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:48.573141" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:48.493161" elapsed="0.080018"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:48.573467" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:48.573247" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:48.573230" elapsed="0.000309"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:25:48.493023" elapsed="0.080537"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:48.576182" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:48.576094" elapsed="0.000131"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:48.576076" elapsed="0.000170"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:48.577423" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:48.577336" elapsed="0.000132"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:48.577317" elapsed="0.000172"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:48.577903" level="INFO">${karaf_connection_index} = 600</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:25:48.577633" elapsed="0.000296"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:48.578300" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:48.578114" elapsed="0.000211"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:48.612361" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:48.578928" elapsed="0.033614"/>
</kw>
<msg time="2026-10-16T01:25:48.612771" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:48.612817" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:48.578482" elapsed="0.034372"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:48.682365" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:48.613562" elapsed="0.068981"/>
</kw>
<msg time="2026-10-16T01:25:48.682725" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:48.682771" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:48.613113" elapsed="0.069694"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:48.683094" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:48.682877" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:48.682859" elapsed="0.000331"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:48.683718" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:48.683370" elapsed="0.000432"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:48.684075" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:48.683863" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:48.683847" elapsed="0.000323"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:48.684201" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:48.686637" 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-10-16T01:25:48.688386" elapsed="0.000482"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:48.690065" elapsed="0.000311"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:25:48.684982" elapsed="0.005461"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:48.684468" elapsed="0.006091"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:48.577023" elapsed="0.113614"/>
</kw>
<msg time="2026-10-16T01:25:48.690735" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:48.690776" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:48.576395" elapsed="0.114417"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:48.690966" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:25:48.690881" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:48.690865" elapsed="0.000193"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:48.691372" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:48.691668" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:48.691748" 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-10-16T01:25:48.575761" elapsed="0.116072"/>
</kw>
<msg time="2026-10-16T01:25:48.691917" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:48.691957" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:48.573872" elapsed="0.118120"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:48.692290" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:48.692073" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:48.692057" elapsed="0.000363"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:25:48.573669" elapsed="0.118778"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:48.694973" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:48.694888" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:48.694871" elapsed="0.000180"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:48.696155" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:48.696072" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:48.696055" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:48.696582" 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-10-16T01:25:48.696360" elapsed="0.000246"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:48.696989" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:48.696808" elapsed="0.000217"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:48.731233" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:48.697593" elapsed="0.033812"/>
</kw>
<msg time="2026-10-16T01:25:48.731562" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:48.731603" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:48.697181" elapsed="0.034457"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:48.798623" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:48.732263" elapsed="0.066555"/>
</kw>
<msg time="2026-10-16T01:25:48.798971" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:48.799025" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:48.731822" elapsed="0.067240"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:48.799331" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:48.799131" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:48.799113" elapsed="0.000312"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:48.799963" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:48.799607" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:48.800341" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:48.800143" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:48.800126" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:48.800465" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:48.802931" elapsed="0.000488"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:25:48.804647" elapsed="0.000492"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:48.806492" 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-10-16T01:25:48.801261" elapsed="0.005622"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:48.800751" elapsed="0.006261"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:48.695801" elapsed="0.111290"/>
</kw>
<msg time="2026-10-16T01:25:48.807172" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:48.807212" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:48.695198" elapsed="0.112083"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:48.807439" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:25:48.807353" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:48.807336" elapsed="0.000181"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:48.807913" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:48.808224" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:48.808289" 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-10-16T01:25:48.694570" elapsed="0.113804"/>
</kw>
<msg time="2026-10-16T01:25:48.808457" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:48.808497" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:48.692722" elapsed="0.115810"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:48.808836" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:48.808600" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:48.808584" elapsed="0.000325"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:25:48.692559" elapsed="0.116372"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:25:48.492874" elapsed="0.316084"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:25:48.490792" elapsed="0.318229"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:25:48.488910" elapsed="0.320165"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:48.488407" elapsed="0.320709"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:25:48.487404" elapsed="0.321760"/>
</kw>
<kw name="Verify Sample Port Is Modified" owner="ClusterOvsdb">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:25:48.811507" 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-10-16T01:25:48.811170" elapsed="0.000362"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:25:48.816071" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:25:48.814770" elapsed="0.001336">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:25:49.825284" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:25:49.822365" elapsed="0.003001">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:25:50.834582" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:25:50.831652" elapsed="0.003011">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:25:51.844106" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:25:51.841163" elapsed="0.003031">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:25:52.853495" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:25:52.850550" elapsed="0.003028">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:25:53.863364" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:25:53.860428" elapsed="0.003016">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<msg time="2026-10-16T01:25:53.863641" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: Variable '${ovsdb_uuid}' not found.</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-10-16T01:25:48.811756" elapsed="5.052207">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: Variable '${ovsdb_uuid}' not found.</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-10-16T01:25:48.810771" elapsed="5.053472">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: Variable '${ovsdb_uuid}' not found.</status>
</kw>
<doc>Verify port is modified in all instances.</doc>
<status status="FAIL" start="2026-10-16T01:25:48.486971" elapsed="5.377569">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: Variable '${ovsdb_uuid}' not found.</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-10-16T01:25:53.867864" elapsed="0.000547"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:25:53.867270" elapsed="0.001254"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:53.870738" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:53.870482" elapsed="0.000364"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:53.870437" elapsed="0.000458"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:53.875291" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:53.875074" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:53.875035" elapsed="0.000400"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:25:53.877771" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:25:53.876964" elapsed="0.000873"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:25:53.878843" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:25:53.878199" elapsed="0.000698"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:25:53.879007" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:25:53.879299" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:25:53.875996" elapsed="0.003355"/>
</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-10-16T01:25:53.885245" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:53.885052" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:53.885012" elapsed="0.000376"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:53.888194" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:53.888003" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:53.887940" elapsed="0.000395"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:53.889236" level="INFO">${karaf_connection_index} = 598</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:25:53.888661" elapsed="0.000630"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:53.890129" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:53.889652" elapsed="0.000531"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:53.924915" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:53.891524" elapsed="0.033655"/>
</kw>
<msg time="2026-10-16T01:25:53.925403" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:53.925461" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:53.890525" elapsed="0.034986"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:53.988351" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:53.926480" elapsed="0.062270"/>
</kw>
<msg time="2026-10-16T01:25:53.989018" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:53.989063" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:53.925829" elapsed="0.063272"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:53.989607" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:53.989233" elapsed="0.000454"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:53.989191" elapsed="0.000545"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:53.990434" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:53.989933" elapsed="0.000594"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:53.990806" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:53.990590" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:53.990572" elapsed="0.000332"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:53.990944" elapsed="0.000060"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:53.993869" 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-10-16T01:25:53.995647" elapsed="0.000525"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:53.997385" 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-10-16T01:25:53.991915" elapsed="0.005930"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:53.991336" elapsed="0.006644"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:53.887353" elapsed="0.110709"/>
</kw>
<msg time="2026-10-16T01:25:53.998154" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:53.998196" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:53.885746" elapsed="0.112487"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:53.998393" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:25:53.998306" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:53.998288" elapsed="0.000185"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:53.998840" 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-10-16T01:25:53.999177" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:53.999243" 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-10-16T01:25:53.884346" elapsed="0.114988"/>
</kw>
<msg time="2026-10-16T01:25:53.999428" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:53.999511" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:53.880149" elapsed="0.119401"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:53.999863" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:53.999623" elapsed="0.000378"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:53.999607" elapsed="0.000422"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:25:53.879815" elapsed="0.120237"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:54.003070" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:54.002910" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.002892" elapsed="0.000243"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:54.004245" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:54.004162" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.004145" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:54.004687" level="INFO">${karaf_connection_index} = 600</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:25:54.004452" elapsed="0.000288"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:54.005111" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:54.004902" elapsed="0.000234"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:54.040959" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:54.005697" elapsed="0.035464"/>
</kw>
<msg time="2026-10-16T01:25:54.041320" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:54.041362" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:54.005288" elapsed="0.036109"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:54.103399" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:54.042063" elapsed="0.061595"/>
</kw>
<msg time="2026-10-16T01:25:54.103900" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:54.103944" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:54.041558" elapsed="0.062440"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:54.104383" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:54.104104" elapsed="0.000356"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.104071" elapsed="0.000418"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:54.105137" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:54.104680" elapsed="0.000544"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:54.105485" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:54.105286" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.105269" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:54.105612" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:54.108362" 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-10-16T01:25:54.110203" elapsed="0.000673"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:54.112096" 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-10-16T01:25:54.106550" elapsed="0.005934"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:54.105993" elapsed="0.006609"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:54.003886" elapsed="0.108797"/>
</kw>
<msg time="2026-10-16T01:25:54.112953" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:54.113011" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:54.003283" elapsed="0.109814"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:54.113264" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:25:54.113174" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.113156" elapsed="0.000187"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:54.113687" 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-10-16T01:25:54.114034" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:54.114099" 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-10-16T01:25:54.002586" elapsed="0.111605"/>
</kw>
<msg time="2026-10-16T01:25:54.114285" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:54.114326" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:54.000332" elapsed="0.114031"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:54.114657" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:54.114435" elapsed="0.000386"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.114419" elapsed="0.000428"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:25:54.000190" elapsed="0.114681"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:54.118887" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:54.118799" elapsed="0.000131"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.118782" elapsed="0.000169"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:54.120090" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:54.120005" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.119987" elapsed="0.000167"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:54.120526" 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-10-16T01:25:54.120296" elapsed="0.000255"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:54.120935" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:54.120745" elapsed="0.000215"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:54.153205" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:54.121541" elapsed="0.031840"/>
</kw>
<msg time="2026-10-16T01:25:54.153536" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:54.153578" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:54.121128" elapsed="0.032486"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:54.217135" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:54.154233" elapsed="0.063085"/>
</kw>
<msg time="2026-10-16T01:25:54.217481" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:54.217523" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:54.153793" elapsed="0.063767"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:54.217864" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:54.217631" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.217612" elapsed="0.000348"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:54.218503" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:54.218156" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:54.218899" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:54.218680" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.218664" elapsed="0.000350"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:54.219045" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:54.221509" 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-10-16T01:25:54.223249" elapsed="0.000482"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:54.225147" elapsed="0.000306"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:25:54.219826" elapsed="0.005693"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:54.219310" elapsed="0.006325"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:54.119697" elapsed="0.106032"/>
</kw>
<msg time="2026-10-16T01:25:54.225812" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:54.225854" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:54.119119" elapsed="0.106771"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:54.226058" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:25:54.225957" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.225941" elapsed="0.000196"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:54.226452" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:54.226844" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:54.226911" 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-10-16T01:25:54.118483" elapsed="0.108527"/>
</kw>
<msg time="2026-10-16T01:25:54.227094" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:54.227136" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:54.115153" elapsed="0.112020"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:54.227459" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:54.227241" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.227224" elapsed="0.000308"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:25:54.115013" elapsed="0.112541"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:25:53.879463" elapsed="0.348118"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:25:53.874349" elapsed="0.353285"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:25:53.869871" elapsed="0.357817"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:53.868894" elapsed="0.358854"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:25:53.866432" elapsed="0.361365"/>
</kw>
<kw name="Delete Sample Port And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:25:54.232029" 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-10-16T01:25:54.230782" elapsed="0.001283">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-10-16T01:25:53.865281" elapsed="0.366920">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-10-16T01:25:54.234291" elapsed="0.000385"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:25:54.233620" elapsed="0.001158"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:54.235696" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:54.235611" elapsed="0.000145"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.235593" elapsed="0.000184"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:54.237632" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:54.237550" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.237534" elapsed="0.000160"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:25:54.238602" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:25:54.238278" elapsed="0.000349"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:25:54.239086" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:25:54.238794" elapsed="0.000317"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:25:54.239152" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:25:54.239277" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:25:54.237912" elapsed="0.001389"/>
</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-10-16T01:25:54.241818" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:54.241733" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.241715" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:54.242996" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:54.242896" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.242880" elapsed="0.000179"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:54.243428" level="INFO">${karaf_connection_index} = 598</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:25:54.243203" elapsed="0.000249"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:54.243810" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:54.243611" elapsed="0.000224"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:54.276184" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:54.244428" elapsed="0.031927"/>
</kw>
<msg time="2026-10-16T01:25:54.276554" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:54.276598" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:54.244018" elapsed="0.032615"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:54.356195" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:54.277253" elapsed="0.079129"/>
</kw>
<msg time="2026-10-16T01:25:54.356538" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:54.356579" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:54.276810" elapsed="0.079805"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:54.356910" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:54.356684" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.356666" elapsed="0.000354"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:54.357538" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:54.357198" elapsed="0.000426"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:54.357932" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:54.357684" elapsed="0.000338"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.357668" elapsed="0.000378"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:54.358078" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:54.360528" 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-10-16T01:25:54.362282" elapsed="0.000481"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:54.364153" 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-10-16T01:25:54.358859" elapsed="0.005671"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:54.358344" elapsed="0.006303"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:54.242615" elapsed="0.122126"/>
</kw>
<msg time="2026-10-16T01:25:54.364826" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:54.364865" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:54.242042" elapsed="0.122859"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:54.365069" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:25:54.364983" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.364953" elapsed="0.000193"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:54.365455" 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-10-16T01:25:54.365803" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:54.365868" 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-10-16T01:25:54.241427" elapsed="0.124526"/>
</kw>
<msg time="2026-10-16T01:25:54.366056" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:54.366094" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:54.239625" elapsed="0.126505"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:54.366411" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:54.366197" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.366181" elapsed="0.000301"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:25:54.239487" elapsed="0.127017"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:54.369109" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:54.369024" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.369006" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:54.370276" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:54.370193" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.370176" elapsed="0.000164"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:54.370724" level="INFO">${karaf_connection_index} = 600</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:25:54.370482" elapsed="0.000268"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:54.371109" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:54.370910" elapsed="0.000224"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:54.404864" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:54.371722" elapsed="0.033344"/>
</kw>
<msg time="2026-10-16T01:25:54.405224" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:54.405266" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:54.371287" elapsed="0.034055"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:54.489858" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:54.405957" elapsed="0.084102"/>
</kw>
<msg time="2026-10-16T01:25:54.490217" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:54.490259" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:54.405510" elapsed="0.084785"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:54.490571" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:54.490365" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.490347" elapsed="0.000320"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:54.491235" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:54.490874" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:54.491580" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:54.491383" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.491366" elapsed="0.000306"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:54.491720" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:54.494219" 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-10-16T01:25:54.496112" elapsed="0.000451"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:54.497818" 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-10-16T01:25:54.492499" elapsed="0.005708"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:54.492008" elapsed="0.006315"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:54.369920" elapsed="0.128480"/>
</kw>
<msg time="2026-10-16T01:25:54.498482" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:54.498522" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:54.369320" elapsed="0.129238"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:54.498730" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-16T01:25:54.498628" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.498611" elapsed="0.000200"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:54.499140" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:54.499438" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:54.499502" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:25:54.368697" elapsed="0.130890"/>
</kw>
<msg time="2026-10-16T01:25:54.499669" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:54.499947" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:54.366843" elapsed="0.133160"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:54.500295" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:54.500074" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.500058" elapsed="0.000347"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:25:54.366610" elapsed="0.133817"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:54.502980" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:54.502880" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.502863" elapsed="0.000183"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:54.504154" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:54.504071" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.504054" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:54.504581" 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-10-16T01:25:54.504357" elapsed="0.000248"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:54.504962" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:54.504781" elapsed="0.000219"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:54.539143" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:54.505569" elapsed="0.033751"/>
</kw>
<msg time="2026-10-16T01:25:54.539493" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:54.539535" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:54.505158" elapsed="0.034413"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:54.622028" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:54.540227" elapsed="0.081988"/>
</kw>
<msg time="2026-10-16T01:25:54.622372" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:54.622414" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:54.539791" elapsed="0.082658"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:54.622742" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:54.622518" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.622500" elapsed="0.000338"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:54.623393" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:54.623057" elapsed="0.000423"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:54.623772" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:54.623541" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.623524" elapsed="0.000343"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:54.623898" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:54.626328" elapsed="0.000488"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:25:54.628035" elapsed="0.000442"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:54.629637" 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-10-16T01:25:54.624667" elapsed="0.005390"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:54.624182" elapsed="0.005991"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:54.503794" elapsed="0.126456"/>
</kw>
<msg time="2026-10-16T01:25:54.630375" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:54.630416" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:54.503194" elapsed="0.127259"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:54.630607" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:25:54.630522" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.630505" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:54.631302" 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-10-16T01:25:54.631599" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:54.631662" 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-10-16T01:25:54.502563" elapsed="0.129202"/>
</kw>
<msg time="2026-10-16T01:25:54.631848" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:54.631887" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:54.500676" elapsed="0.131246"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:54.632241" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:54.632025" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.632007" elapsed="0.000305"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:25:54.500538" elapsed="0.131796"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:25:54.239348" elapsed="0.393011"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:25:54.237259" elapsed="0.395151"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:25:54.235355" elapsed="0.397103"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:54.234928" elapsed="0.397571"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:25:54.233280" elapsed="0.399265"/>
</kw>
<kw name="Delete Sample Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:25:54.636547" 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-10-16T01:25:54.635316" elapsed="0.001266">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-10-16T01:25:54.232629" elapsed="0.404085">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-10-16T01:25:54.638435" elapsed="0.000363"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:25:54.638043" elapsed="0.000942"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:54.640056" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:54.639954" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.639937" elapsed="0.000182"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:54.641981" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:54.641886" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.641869" elapsed="0.000177"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:25:54.642949" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:25:54.642598" elapsed="0.000412"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:25:54.643435" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:25:54.643164" elapsed="0.000296"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:25:54.643501" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:25:54.643625" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:25:54.642245" elapsed="0.001402"/>
</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-10-16T01:25:54.646221" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:54.646137" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.646121" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:54.647361" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:54.647279" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.647263" elapsed="0.000159"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:54.647812" level="INFO">${karaf_connection_index} = 598</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:25:54.647565" elapsed="0.000272"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:54.648191" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:54.648011" elapsed="0.000205"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:54.690358" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:54.648795" elapsed="0.041741"/>
</kw>
<msg time="2026-10-16T01:25:54.690726" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:54.690770" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:54.648369" elapsed="0.042437"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:54.750594" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:54.691407" elapsed="0.059385"/>
</kw>
<msg time="2026-10-16T01:25:54.750949" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:54.751004" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:54.690986" elapsed="0.060055"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:54.751310" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:54.751110" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.751092" elapsed="0.000311"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:54.751938" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:54.751583" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:54.752297" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:54.752095" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.752079" elapsed="0.000311"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:54.752420" elapsed="0.000024"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:54.754894" elapsed="0.000495"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:25:54.756615" elapsed="0.000487"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:54.758458" 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-10-16T01:25:54.753229" elapsed="0.005621"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:54.752681" elapsed="0.006300"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:54.647026" elapsed="0.112033"/>
</kw>
<msg time="2026-10-16T01:25:54.759140" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:54.759178" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:54.646429" elapsed="0.112785"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:54.759405" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:25:54.759319" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.759302" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:54.759848" 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-10-16T01:25:54.760169" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:54.760234" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:25:54.645834" elapsed="0.114485"/>
</kw>
<msg time="2026-10-16T01:25:54.760401" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:54.760440" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:54.644046" elapsed="0.116429"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:54.760799" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:54.760541" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.760526" elapsed="0.000346"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:25:54.643892" elapsed="0.117002"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:54.763454" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:54.763369" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.763352" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:54.764628" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:54.764545" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.764529" elapsed="0.000161"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:54.765096" level="INFO">${karaf_connection_index} = 600</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:25:54.764856" elapsed="0.000265"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:54.765459" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:54.765280" elapsed="0.000204"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:54.799293" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:54.766086" elapsed="0.033405"/>
</kw>
<msg time="2026-10-16T01:25:54.799650" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:54.799693" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:54.765635" elapsed="0.034116"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:54.851198" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:54.800417" elapsed="0.050954"/>
</kw>
<msg time="2026-10-16T01:25:54.851530" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:54.851572" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:54.799920" elapsed="0.051688"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:54.851909" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:54.851678" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.851660" elapsed="0.000358"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:54.852540" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:54.852199" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:54.852933" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:54.852730" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.852712" elapsed="0.000337"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:54.853081" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:54.855547" 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-10-16T01:25:54.857305" elapsed="0.000481"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:54.859188" 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-10-16T01:25:54.853869" elapsed="0.005699"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:54.853350" elapsed="0.006338"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:54.764291" elapsed="0.095493"/>
</kw>
<msg time="2026-10-16T01:25:54.859867" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:54.859908" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:54.763662" elapsed="0.096283"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:54.860117" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:25:54.860031" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.860014" elapsed="0.000182"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:54.860508" 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-10-16T01:25:54.860904" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:54.860983" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:25:54.763077" elapsed="0.097994"/>
</kw>
<msg time="2026-10-16T01:25:54.861155" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:54.861196" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:54.761152" elapsed="0.100080"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:54.861516" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:54.861299" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.861283" elapsed="0.000306"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:25:54.761016" elapsed="0.100594"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:54.864173" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:54.864087" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.864070" elapsed="0.000167"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:54.865330" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:54.865246" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.865229" elapsed="0.000165"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:54.865787" 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-10-16T01:25:54.865537" elapsed="0.000275"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:54.866170" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:54.865987" elapsed="0.000208"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:54.901210" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:54.866776" elapsed="0.034613"/>
</kw>
<msg time="2026-10-16T01:25:54.901607" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:54.901649" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:54.866347" elapsed="0.035338"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:54.958090" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:54.902321" elapsed="0.055948"/>
</kw>
<msg time="2026-10-16T01:25:54.958425" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:54.958466" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:54.901875" elapsed="0.056626"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:54.958830" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:54.958570" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.958553" elapsed="0.000375"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:54.959465" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:54.959130" elapsed="0.000413"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:54.959820" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:54.959604" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.959588" elapsed="0.000327"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:54.959946" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:54.962404" 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-10-16T01:25:54.964143" elapsed="0.000453"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:54.965788" 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-10-16T01:25:54.960738" elapsed="0.005466"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:54.960223" elapsed="0.006101"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:54.864987" elapsed="0.101416"/>
</kw>
<msg time="2026-10-16T01:25:54.966485" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:54.966525" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:54.864383" elapsed="0.102178"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:54.966736" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:25:54.966629" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.966613" 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 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-10-16T01:25:54.967145" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:54.967446" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:54.967511" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:25:54.863777" elapsed="0.103818"/>
</kw>
<msg time="2026-10-16T01:25:54.967679" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:54.968039" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:54.861872" elapsed="0.106206"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:54.968404" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:54.968182" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.968164" elapsed="0.000312"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:25:54.861736" elapsed="0.106762"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:25:54.643749" elapsed="0.324776"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:25:54.641579" elapsed="0.326997"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:25:54.639677" elapsed="0.328950"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:54.639284" elapsed="0.329385"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:25:54.637639" elapsed="0.331099"/>
</kw>
<kw name="Kill_Single_Member" owner="ClusterManagement">
<msg time="2026-10-16T01:25:54.970441" 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-10-16T01:25:54.968977" elapsed="0.001500">Variable '${original_candidate}' not found.</status>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${new_cluster_list}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:54.970676" elapsed="0.000020"/>
</kw>
<doc>Kill Owner Instance and verify it is dead</doc>
<status status="FAIL" start="2026-10-16T01:25:54.637134" elapsed="0.333694">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-10-16T01:25:54.972082" elapsed="0.000201"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:25:54.971821" 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-10-16T01:25:54.973232" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:54.973148" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.973131" elapsed="0.000164"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:54.975166" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:54.975083" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.975066" elapsed="0.000162"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:25:54.976140" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:25:54.975799" elapsed="0.000367"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:25:54.976585" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:25:54.976316" elapsed="0.000293"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:25:54.976650" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:25:54.976794" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:25:54.975427" elapsed="0.001390"/>
</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-10-16T01:25:54.979325" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:54.979241" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.979224" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:54.980481" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:54.980398" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:54.980382" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:54.980935" level="INFO">${karaf_connection_index} = 598</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:25:54.980686" elapsed="0.000287"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:54.981315" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:54.981136" elapsed="0.000203"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:55.015290" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:54.981920" elapsed="0.033549"/>
</kw>
<msg time="2026-10-16T01:25:55.015685" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:55.015755" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:54.981492" elapsed="0.034301"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:55.078504" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:55.016396" elapsed="0.062289"/>
</kw>
<msg time="2026-10-16T01:25:55.078867" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:55.078908" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:55.015958" elapsed="0.062985"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:55.079231" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:55.079028" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:55.079010" elapsed="0.000315"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:55.079874" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:55.079505" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:55.080230" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:55.080032" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:55.080015" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:55.080353" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:55.082866" elapsed="0.000487"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:25:55.084592" elapsed="0.000495"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:55.086247" elapsed="0.000301"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:25:55.081151" elapsed="0.005463"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:55.080617" elapsed="0.006364"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:54.980143" elapsed="0.106919"/>
</kw>
<msg time="2026-10-16T01:25:55.087142" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:55.087182" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:54.979532" elapsed="0.107686"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:55.087370" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:25:55.087286" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:55.087269" elapsed="0.000176"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:55.087895" 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-10-16T01:25:55.088209" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:55.088274" 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-10-16T01:25:54.978937" elapsed="0.109423"/>
</kw>
<msg time="2026-10-16T01:25:55.088442" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:55.088481" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:54.977153" elapsed="0.111364"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:55.088925" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:55.088620" elapsed="0.000371"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:55.088602" elapsed="0.000413"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:25:54.977016" elapsed="0.112020"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:55.091516" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:55.091433" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:55.091416" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:55.092670" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:55.092588" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:55.092572" elapsed="0.000186"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:55.093138" level="INFO">${karaf_connection_index} = 600</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:25:55.092901" elapsed="0.000262"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:55.093497" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:55.093320" elapsed="0.000201"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:55.125788" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:55.094118" elapsed="0.031872"/>
</kw>
<msg time="2026-10-16T01:25:55.126152" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:55.126193" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:55.093672" elapsed="0.032557"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:55.186402" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:55.126836" elapsed="0.059755"/>
</kw>
<msg time="2026-10-16T01:25:55.186783" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:55.186826" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:55.126391" elapsed="0.060472"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:55.187161" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:55.186935" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:55.186916" elapsed="0.000341"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:55.187820" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:55.187438" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:55.188180" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:55.187979" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:55.187948" elapsed="0.000327"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:55.188306" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:55.190800" elapsed="0.000489"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:25:55.192510" elapsed="0.000548"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:55.194255" 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-10-16T01:25:55.189126" elapsed="0.005507"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:55.188574" elapsed="0.006196"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:55.092336" elapsed="0.102511"/>
</kw>
<msg time="2026-10-16T01:25:55.194989" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:55.195032" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:55.091745" elapsed="0.103325"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:55.195226" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:25:55.195141" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:55.195124" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:55.195619" 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-10-16T01:25:55.195958" elapsed="0.000037"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:55.196039" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:25:55.091143" elapsed="0.104982"/>
</kw>
<msg time="2026-10-16T01:25:55.196209" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:55.196250" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:55.089284" elapsed="0.107002"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:55.196575" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:55.196353" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:55.196337" elapsed="0.000310"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:25:55.089148" elapsed="0.107521"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:55.200415" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:55.200328" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:55.200311" elapsed="0.000169"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:55.201696" elapsed="0.000041"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:55.201612" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:55.201595" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:55.202174" 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-10-16T01:25:55.201931" elapsed="0.000268"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:55.202539" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:55.202359" elapsed="0.000204"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:55.235509" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:55.203184" elapsed="0.032504"/>
</kw>
<msg time="2026-10-16T01:25:55.235892" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:55.235935" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:55.202732" elapsed="0.033253"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:55.296898" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:55.236573" elapsed="0.060522"/>
</kw>
<msg time="2026-10-16T01:25:55.297253" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:55.297295" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:55.236149" elapsed="0.061182"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:55.297605" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:55.297402" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:55.297383" elapsed="0.000375"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:55.298297" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:55.297942" elapsed="0.000436"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:55.298634" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:55.298439" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:55.298422" elapsed="0.000327"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:55.298780" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:55.301276" 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-10-16T01:25:55.303022" elapsed="0.000456"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:55.304949" 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-10-16T01:25:55.299554" elapsed="0.006016"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:55.299062" elapsed="0.006651"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:55.201355" elapsed="0.104439"/>
</kw>
<msg time="2026-10-16T01:25:55.305878" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:55.305918" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:55.200628" elapsed="0.105326"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:55.306126" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:25:55.306040" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:55.306023" elapsed="0.000181"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:55.306523" 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-10-16T01:25:55.306920" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:55.307000" 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-10-16T01:25:55.199979" elapsed="0.107108"/>
</kw>
<msg time="2026-10-16T01:25:55.307171" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:55.307211" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:55.197140" elapsed="0.110107"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:55.307529" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:55.307314" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:55.307298" elapsed="0.000304"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:25:55.197001" elapsed="0.110622"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:25:54.976863" elapsed="0.330788"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:25:54.974776" elapsed="0.332943"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:25:54.972881" elapsed="0.334892"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:54.972480" elapsed="0.335335"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:25:54.971469" elapsed="0.336395"/>
</kw>
<kw name="Check Ovsdb Shards Status After Cluster Event" owner="ClusterOvsdb">
<msg time="2026-10-16T01:25:55.309507" 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-10-16T01:25:55.308058" elapsed="0.001484">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-10-16T01:25:54.971021" elapsed="0.338677">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-10-16T01:25:55.311129" elapsed="0.000204"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:25:55.310866" 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-10-16T01:25:55.312338" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:55.312253" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:55.312236" elapsed="0.000166"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:55.314260" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:55.314178" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:55.314161" elapsed="0.000163"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:25:55.315281" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:25:55.314914" elapsed="0.000394"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:25:55.315756" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:25:55.315456" elapsed="0.000326"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:25:55.315823" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:25:55.315951" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:25:55.314540" elapsed="0.001449"/>
</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-10-16T01:25:55.318486" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:55.318401" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:55.318384" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:55.319647" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:55.319564" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:55.319547" elapsed="0.000188"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:55.320120" level="INFO">${karaf_connection_index} = 598</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:25:55.319880" elapsed="0.000267"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:55.320489" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:55.320307" elapsed="0.000206"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:55.355783" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:55.321162" elapsed="0.034819"/>
</kw>
<msg time="2026-10-16T01:25:55.356141" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:55.356182" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:55.320667" elapsed="0.035550"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:55.459912" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:55.356826" elapsed="0.103299"/>
</kw>
<msg time="2026-10-16T01:25:55.460283" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:55.460324" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:55.356382" elapsed="0.103977"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:55.460631" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:55.460428" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:55.460410" elapsed="0.000349"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:55.461294" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:55.460939" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:55.461688" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:55.461491" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:55.461474" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:55.461831" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:55.464290" elapsed="0.000495"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:25:55.466027" elapsed="0.000452"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:55.467661" 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-10-16T01:25:55.462608" elapsed="0.005461"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:55.462115" elapsed="0.006072"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:55.319305" elapsed="0.148959"/>
</kw>
<msg time="2026-10-16T01:25:55.468346" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:55.468385" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:55.318712" elapsed="0.149709"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:55.468573" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:25:55.468489" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:55.468472" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:55.469002" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:55.469303" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:55.469366" 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-10-16T01:25:55.318112" elapsed="0.151339"/>
</kw>
<msg time="2026-10-16T01:25:55.469535" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:55.469574" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:55.316314" elapsed="0.153295"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:55.469908" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:55.469675" elapsed="0.000835"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:55.469659" elapsed="0.000879"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:25:55.316175" elapsed="0.154386"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:55.473114" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:55.473029" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:55.473012" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:55.474280" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:55.474197" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:55.474180" elapsed="0.000161"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:55.475025" level="INFO">${karaf_connection_index} = 600</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:25:55.474482" elapsed="0.000571"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:55.475394" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:55.475213" elapsed="0.000205"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:55.509386" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:55.476060" elapsed="0.033505"/>
</kw>
<msg time="2026-10-16T01:25:55.509742" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:55.509785" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:55.475605" elapsed="0.034216"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:55.618061" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:55.510430" elapsed="0.107829"/>
</kw>
<msg time="2026-10-16T01:25:55.618420" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:55.618463" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:55.510005" elapsed="0.108495"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:55.618799" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:55.618570" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:55.618552" elapsed="0.000343"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:55.619433" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:55.619089" elapsed="0.000439"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:55.619803" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:55.619590" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:55.619573" elapsed="0.000324"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:55.619929" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:55.622451" 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-10-16T01:25:55.624170" elapsed="0.000447"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:55.625825" 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-10-16T01:25:55.620735" elapsed="0.005478"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:55.620215" elapsed="0.006114"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:55.473922" elapsed="0.152486"/>
</kw>
<msg time="2026-10-16T01:25:55.626492" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:55.626534" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:55.473323" elapsed="0.153248"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:55.627017" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-10-16T01:25:55.626641" elapsed="0.000448"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:55.626624" elapsed="0.000488"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:55.627431" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:55.627748" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:55.627813" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:25:55.472722" elapsed="0.155177"/>
</kw>
<msg time="2026-10-16T01:25:55.628037" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:55.628078" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:55.470838" elapsed="0.157277"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:55.628400" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:55.628184" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:55.628168" elapsed="0.000305"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:25:55.470672" elapsed="0.157824"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:55.631143" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:55.631057" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:55.631040" elapsed="0.000168"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:55.632320" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:55.632236" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:55.632219" elapsed="0.000165"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:55.632773" 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-10-16T01:25:55.632524" elapsed="0.000274"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:55.633156" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:55.632973" elapsed="0.000208"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:55.666120" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:55.633762" elapsed="0.032549"/>
</kw>
<msg time="2026-10-16T01:25:55.666467" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:55.666510" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:55.633333" elapsed="0.033213"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:55.766654" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:55.667165" elapsed="0.099712"/>
</kw>
<msg time="2026-10-16T01:25:55.767051" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:55.767092" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:55.666729" elapsed="0.100400"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:55.767400" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:55.767199" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:55.767181" elapsed="0.000313"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:55.768067" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:55.767672" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:55.768418" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:55.768222" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:55.768206" elapsed="0.000305"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:55.768542" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:55.771003" 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-10-16T01:25:55.774361" elapsed="0.000654"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:55.776248" elapsed="0.000311"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:25:55.769335" elapsed="0.007298"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:55.768832" elapsed="0.007942"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:55.631976" elapsed="0.144894"/>
</kw>
<msg time="2026-10-16T01:25:55.776979" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:55.777023" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:55.631356" elapsed="0.145705"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:55.777259" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-10-16T01:25:55.777146" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:55.777124" 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 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-10-16T01:25:55.777909" 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-10-16T01:25:55.778242" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:55.778307" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:25:55.630747" elapsed="0.147650"/>
</kw>
<msg time="2026-10-16T01:25:55.778485" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:55.778526" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:55.628859" elapsed="0.149703"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:55.778876" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:55.778632" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:55.778616" elapsed="0.000337"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:25:55.628604" elapsed="0.150418"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:25:55.316037" elapsed="0.463019"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:25:55.313872" elapsed="0.465244"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:25:55.311995" elapsed="0.467178"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:55.311527" elapsed="0.467691"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:25:55.310513" elapsed="0.468760"/>
</kw>
<kw name="Get Ovsdb Entity Owner Status For One Device" owner="ClusterOvsdb">
<msg time="2026-10-16T01:25:55.783393" level="FAIL">Variable '${ovsdb_uuid}' 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-10-16T01:25:55.782165" elapsed="0.001264">Variable '${ovsdb_uuid}' 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-10-16T01:25:55.783608" elapsed="0.000020"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${new_owner}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:55.783829" elapsed="0.000020"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${new_candidate}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:55.784033" elapsed="0.000019"/>
</kw>
<doc>Check Entity Owner Status and identify owner and candidate.</doc>
<status status="FAIL" start="2026-10-16T01:25:55.310027" elapsed="0.474168">Variable '${ovsdb_uuid}' 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-10-16T01:25:55.785770" elapsed="0.000258"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:25:55.785511" elapsed="0.000567"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:55.787021" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:55.786917" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:55.786899" elapsed="0.000226"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:55.789030" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:55.788930" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:55.788911" elapsed="0.000183"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:25:55.790056" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:25:55.789661" elapsed="0.000421"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:25:55.790504" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:25:55.790234" elapsed="0.000294"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:25:55.790569" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:25:55.790697" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:25:55.789305" elapsed="0.001433"/>
</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-10-16T01:25:55.793316" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:55.793232" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:55.793214" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:55.794501" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:55.794418" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:55.794401" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:55.794980" level="INFO">${karaf_connection_index} = 598</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:25:55.794730" elapsed="0.000276"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:55.795359" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:55.795169" elapsed="0.000214"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:55.827951" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:55.795984" elapsed="0.032162"/>
</kw>
<msg time="2026-10-16T01:25:55.828305" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:55.828347" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:55.795536" elapsed="0.032847"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:55.908189" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:55.829017" elapsed="0.079361"/>
</kw>
<msg time="2026-10-16T01:25:55.908534" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:55.908576" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:55.828547" elapsed="0.080065"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:55.908920" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:55.908682" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:55.908664" elapsed="0.000368"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:55.909561" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:55.909220" elapsed="0.000430"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:55.909926" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:55.909728" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:55.909694" elapsed="0.000382"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:55.910112" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:55.912743" 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-10-16T01:25:55.914477" elapsed="0.000492"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:55.916165" 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-10-16T01:25:55.910919" elapsed="0.005629"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:55.910404" elapsed="0.006263"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:55.794163" elapsed="0.122607"/>
</kw>
<msg time="2026-10-16T01:25:55.916854" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:55.916894" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:55.793561" elapsed="0.123370"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:55.917101" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:25:55.917017" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:55.917000" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:55.917491" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:55.917819" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:55.917884" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:25:55.792926" elapsed="0.125059"/>
</kw>
<msg time="2026-10-16T01:25:55.918071" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:55.918111" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:55.791104" elapsed="0.127043"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:55.918432" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:55.918214" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:55.918198" elapsed="0.000305"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:25:55.790944" elapsed="0.127580"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:55.921368" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:55.921284" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:55.921266" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:55.922607" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:55.922470" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:55.922453" elapsed="0.000221"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:55.923082" level="INFO">${karaf_connection_index} = 600</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:25:55.922839" elapsed="0.000269"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:55.923444" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:55.923265" elapsed="0.000203"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:55.957382" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:55.924072" elapsed="0.033488"/>
</kw>
<msg time="2026-10-16T01:25:55.957758" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:55.957800" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:55.923619" elapsed="0.034217"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:56.035265" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:55.958495" elapsed="0.078136"/>
</kw>
<msg time="2026-10-16T01:25:56.036903" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:56.036953" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:55.958068" elapsed="0.078942"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:56.038031" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:56.037128" elapsed="0.000985"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.037093" elapsed="0.001049"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:56.039349" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:56.038331" elapsed="0.001120"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:56.039748" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:56.039518" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.039500" elapsed="0.000344"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:56.039881" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:56.042625" 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-10-16T01:25:56.044419" elapsed="0.000584"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:56.046262" 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-10-16T01:25:56.040844" elapsed="0.005840"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:56.040267" elapsed="0.006588"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:55.922214" elapsed="0.124729"/>
</kw>
<msg time="2026-10-16T01:25:56.047059" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:56.047106" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:55.921578" elapsed="0.125565"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:56.047311" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-16T01:25:56.047215" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.047198" elapsed="0.000198"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:56.047810" 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-10-16T01:25:56.048157" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:56.048226" 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-10-16T01:25:55.920990" elapsed="0.127333"/>
</kw>
<msg time="2026-10-16T01:25:56.048424" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:56.048471" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:55.919089" elapsed="0.129423"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:56.048826" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:56.048583" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.048567" elapsed="0.001987"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:25:55.918632" elapsed="0.131990"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:56.054236" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:56.054129" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.054110" 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-10-16T01:25:56.055585" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:56.055499" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.055482" elapsed="0.000168"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:56.056093" 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-10-16T01:25:56.055824" elapsed="0.000295"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:56.056475" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:56.056285" elapsed="0.000214"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:56.089006" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:56.057095" elapsed="0.032101"/>
</kw>
<msg time="2026-10-16T01:25:56.089350" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:56.089392" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:56.056651" elapsed="0.032775"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:56.161495" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:56.090075" elapsed="0.071600"/>
</kw>
<msg time="2026-10-16T01:25:56.161853" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:56.161894" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:56.089594" elapsed="0.072334"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:56.162218" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:56.162013" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.161995" elapsed="0.000318"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:56.162868" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:56.162498" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:56.163226" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:56.163031" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.163015" elapsed="0.000303"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:56.163348" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:56.165871" 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-10-16T01:25:56.167604" elapsed="0.000513"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:56.169303" 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-10-16T01:25:56.164187" elapsed="0.005505"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:56.163653" elapsed="0.006174"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:56.055239" elapsed="0.114665"/>
</kw>
<msg time="2026-10-16T01:25:56.170001" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:56.170042" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:56.054454" elapsed="0.115670"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:56.170283" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:25:56.170196" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.170179" elapsed="0.000183"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:56.170692" elapsed="0.000051"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:56.171043" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:56.171109" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:25:56.053768" elapsed="0.117427"/>
</kw>
<msg time="2026-10-16T01:25:56.171278" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:56.171318" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:56.051417" elapsed="0.119936"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:56.171635" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:56.171420" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.171405" elapsed="0.000442"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:25:56.051203" elapsed="0.120669"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:25:55.790792" elapsed="0.381109"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:25:55.788617" elapsed="0.383355"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:25:55.786635" elapsed="0.385397"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:55.786221" elapsed="0.385858"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:25:55.785163" elapsed="0.386970"/>
</kw>
<kw name="Create Sample Bridge Manually And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:25:56.175054" 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-10-16T01:25:56.173729" elapsed="0.001363">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-10-16T01:25:55.784566" elapsed="0.390675">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-10-16T01:25:56.177714" elapsed="0.000756"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:25:56.176730" elapsed="0.001793"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:56.180607" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:56.180487" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.180455" elapsed="0.000224"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:56.182687" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:56.182604" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.182587" elapsed="0.000181"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:25:56.183716" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:25:56.183357" elapsed="0.000389"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:25:56.184187" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:25:56.183897" elapsed="0.000314"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:25:56.184253" elapsed="0.000037"/>
</return>
<msg time="2026-10-16T01:25:56.184391" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:25:56.182992" elapsed="0.001422"/>
</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-10-16T01:25:56.187193" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:56.187109" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.187091" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:56.188382" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:56.188300" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.188283" elapsed="0.000161"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:56.188869" level="INFO">${karaf_connection_index} = 598</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:25:56.188590" elapsed="0.000304"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:56.189264" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:56.189072" elapsed="0.000216"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:56.221311" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:56.189868" elapsed="0.031621"/>
</kw>
<msg time="2026-10-16T01:25:56.221670" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:56.221728" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:56.189440" elapsed="0.032332"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:56.291123" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:56.222374" elapsed="0.068951"/>
</kw>
<msg time="2026-10-16T01:25:56.291492" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:56.291534" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:56.221935" elapsed="0.069637"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:56.291912" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:56.291653" elapsed="0.000343"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.291631" elapsed="0.000391"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:56.292573" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:56.292206" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:56.292930" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:56.292734" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.292717" elapsed="0.000319"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:56.293068" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:56.295619" 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-10-16T01:25:56.297431" elapsed="0.000493"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:56.299123" 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-10-16T01:25:56.293910" elapsed="0.005590"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:56.293384" elapsed="0.006233"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:56.188045" elapsed="0.111671"/>
</kw>
<msg time="2026-10-16T01:25:56.299804" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:56.299845" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:56.187401" elapsed="0.112480"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:56.300153" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-16T01:25:56.300067" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.300048" elapsed="0.000184"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:56.300564" 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-10-16T01:25:56.300894" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:56.300976" 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-10-16T01:25:56.186752" elapsed="0.114312"/>
</kw>
<msg time="2026-10-16T01:25:56.301154" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:56.301194" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:56.184883" elapsed="0.116346"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:56.301514" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:56.301297" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.301282" elapsed="0.000304"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:25:56.184739" elapsed="0.116868"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:56.304504" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:56.304420" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.304403" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:56.305667" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:56.305584" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.305568" elapsed="0.000186"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:56.306150" level="INFO">${karaf_connection_index} = 600</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:25:56.305899" elapsed="0.000276"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:56.306541" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:56.306334" elapsed="0.000232"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:56.343432" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:56.307182" elapsed="0.036431"/>
</kw>
<msg time="2026-10-16T01:25:56.343827" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:56.343870" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:56.306751" elapsed="0.037154"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:56.421008" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:56.344517" elapsed="0.076681"/>
</kw>
<msg time="2026-10-16T01:25:56.421361" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:56.421403" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:56.344086" elapsed="0.077353"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:56.421759" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:56.421517" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.421495" elapsed="0.000360"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:56.422409" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:56.422058" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:56.422830" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:56.422612" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.422595" elapsed="0.000331"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:56.422972" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:56.425514" 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-10-16T01:25:56.427302" elapsed="0.000486"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:56.428992" 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-10-16T01:25:56.423809" elapsed="0.005565"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:56.423279" elapsed="0.006215"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:56.305330" elapsed="0.124239"/>
</kw>
<msg time="2026-10-16T01:25:56.429654" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:56.429693" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:56.304732" elapsed="0.125288"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:56.430176" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:25:56.430090" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.430074" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:56.430574" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:56.430886" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:56.430951" 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-10-16T01:25:56.304120" elapsed="0.126935"/>
</kw>
<msg time="2026-10-16T01:25:56.431140" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:56.431181" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:56.301894" elapsed="0.129322"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:56.431499" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:56.431283" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.431268" elapsed="0.000301"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:25:56.301754" elapsed="0.129836"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:56.435843" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:56.435758" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.435740" elapsed="0.000167"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:56.437016" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:56.436921" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.436905" elapsed="0.000173"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:56.437454" 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-10-16T01:25:56.437220" elapsed="0.000259"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:56.437839" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:56.437638" elapsed="0.000226"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:56.471179" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:56.438444" elapsed="0.032903"/>
</kw>
<msg time="2026-10-16T01:25:56.471550" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:56.471591" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:56.438034" elapsed="0.033592"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:56.543407" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:56.472244" elapsed="0.071348"/>
</kw>
<msg time="2026-10-16T01:25:56.543776" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:56.543818" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:56.471806" elapsed="0.072047"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:56.544145" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:56.543924" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.543905" elapsed="0.000335"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:56.544777" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:56.544420" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:56.545141" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:56.544921" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.544904" elapsed="0.000331"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:56.545266" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:56.547743" elapsed="0.000497"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:25:56.549459" elapsed="0.000479"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:56.551342" elapsed="0.000309"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:25:56.546070" elapsed="0.005664"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:56.545532" elapsed="0.006321"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:56.436642" elapsed="0.115289"/>
</kw>
<msg time="2026-10-16T01:25:56.552032" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:56.552073" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:56.436068" elapsed="0.116040"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:56.552262" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:25:56.552177" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.552160" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:56.552656" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:56.553069" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:56.553135" 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-10-16T01:25:56.435444" elapsed="0.117777"/>
</kw>
<msg time="2026-10-16T01:25:56.553303" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:56.553342" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:56.431908" elapsed="0.121469"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:56.553712" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:56.553477" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.553460" elapsed="0.000326"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:25:56.431766" elapsed="0.122041"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:25:56.184469" elapsed="0.369366"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:25:56.182311" elapsed="0.371577"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:25:56.179116" elapsed="0.374820"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:56.178677" elapsed="0.375318"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:25:56.176374" elapsed="0.377669"/>
</kw>
<kw name="Add Sample Port To The Manual Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:25:56.556946" 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-10-16T01:25:56.555607" elapsed="0.001390">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-10-16T01:25:56.175605" elapsed="0.381538">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-10-16T01:25:56.558680" elapsed="0.000217"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:25:56.558438" elapsed="0.000510"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:56.559849" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:56.559764" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.559747" elapsed="0.000166"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:56.561816" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:56.561732" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.561695" elapsed="0.000184"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:25:56.562792" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:25:56.562448" elapsed="0.000369"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:25:56.563253" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:25:56.562983" elapsed="0.000294"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:25:56.563317" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:25:56.563442" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:25:56.562096" elapsed="0.001368"/>
</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-10-16T01:25:56.566075" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:56.565988" elapsed="0.000130"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.565970" elapsed="0.000168"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:56.567258" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:56.567175" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.567158" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:56.567686" level="INFO">${karaf_connection_index} = 598</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:25:56.567464" elapsed="0.000289"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:56.568117" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:56.567921" elapsed="0.000220"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:56.600026" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:56.568731" elapsed="0.031596"/>
</kw>
<msg time="2026-10-16T01:25:56.600574" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:56.600619" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:56.568296" elapsed="0.032540"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:56.675754" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:56.601729" elapsed="0.074217"/>
</kw>
<msg time="2026-10-16T01:25:56.676120" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:56.676162" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:56.601135" elapsed="0.075063"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:56.676551" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:56.676293" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.676266" elapsed="0.000386"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:56.677238" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:56.676864" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:56.677591" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:56.677392" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.677375" elapsed="0.000311"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:56.677742" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:56.680421" 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-10-16T01:25:56.682176" elapsed="0.000471"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:56.684057" 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-10-16T01:25:56.678651" elapsed="0.005787"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:56.678117" elapsed="0.006437"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:56.566900" elapsed="0.117735"/>
</kw>
<msg time="2026-10-16T01:25:56.684744" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:56.684787" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:56.566286" elapsed="0.118538"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:56.684995" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:25:56.684895" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.684878" elapsed="0.000198"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:56.685423" 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-10-16T01:25:56.685837" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:56.685904" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:25:56.565667" elapsed="0.120343"/>
</kw>
<msg time="2026-10-16T01:25:56.686103" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:56.686145" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:56.563807" elapsed="0.122377"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:56.686476" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:56.686254" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.686238" elapsed="0.000349"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:25:56.563654" elapsed="0.122957"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:56.689359" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:56.689275" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.689257" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:56.690523" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:56.690439" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.690423" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:56.691003" level="INFO">${karaf_connection_index} = 600</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:25:56.690753" elapsed="0.000275"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:56.691378" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:56.691190" elapsed="0.000212"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:56.723603" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:56.692008" elapsed="0.031793"/>
</kw>
<msg time="2026-10-16T01:25:56.723971" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:56.724015" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:56.691556" elapsed="0.032494"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:56.808330" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:56.724636" elapsed="0.083902"/>
</kw>
<msg time="2026-10-16T01:25:56.808695" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:56.808758" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:56.724214" elapsed="0.084580"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:56.809084" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:56.808865" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.808847" elapsed="0.000332"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:56.809713" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:56.809362" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:56.810076" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:56.809863" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.809847" elapsed="0.000322"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:56.810200" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:56.812640" 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-10-16T01:25:56.814586" elapsed="0.000492"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:56.816440" 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-10-16T01:25:56.810995" elapsed="0.005840"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:56.810469" elapsed="0.006494"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:56.690184" elapsed="0.126857"/>
</kw>
<msg time="2026-10-16T01:25:56.817169" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:56.817209" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:56.689570" elapsed="0.127675"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:56.817401" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:25:56.817314" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.817297" elapsed="0.000181"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:56.817878" 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-10-16T01:25:56.818194" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:56.818259" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:25:56.688972" elapsed="0.129372"/>
</kw>
<msg time="2026-10-16T01:25:56.818426" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:56.818467" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:56.686902" elapsed="0.131600"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:56.818804" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:56.818569" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.818553" elapsed="0.000324"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:25:56.686759" elapsed="0.132140"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:56.821657" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:56.821573" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.821556" elapsed="0.000182"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:56.822849" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:56.822764" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.822747" elapsed="0.000165"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:56.823294" 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-10-16T01:25:56.823070" elapsed="0.000248"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:56.823656" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:56.823478" elapsed="0.000202"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:56.857080" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:56.824287" elapsed="0.032968"/>
</kw>
<msg time="2026-10-16T01:25:56.857427" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:56.857467" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:56.823851" elapsed="0.033651"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:56.949360" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:56.858121" elapsed="0.091421"/>
</kw>
<msg time="2026-10-16T01:25:56.949717" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:56.949761" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:56.857664" elapsed="0.092132"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:56.950084" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:56.949866" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.949848" elapsed="0.000360"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:56.950746" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:56.950392" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:56.951105" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:56.950894" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.950877" elapsed="0.000323"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:56.951230" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:56.953674" 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-10-16T01:25:56.955456" elapsed="0.000463"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:56.957114" 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-10-16T01:25:56.952026" elapsed="0.005467"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:56.951495" elapsed="0.006115"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:56.822485" elapsed="0.135203"/>
</kw>
<msg time="2026-10-16T01:25:56.958056" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:56.958096" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:56.821885" elapsed="0.136246"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:56.958284" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:25:56.958200" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.958183" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:56.958672" 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-10-16T01:25:56.959029" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:56.959095" 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-10-16T01:25:56.821284" elapsed="0.137897"/>
</kw>
<msg time="2026-10-16T01:25:56.959264" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:56.959303" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:56.819157" elapsed="0.140181"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:56.959620" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:56.959404" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.959389" elapsed="0.000302"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:25:56.819021" elapsed="0.140737"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:25:56.563514" elapsed="0.396272"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:25:56.561420" elapsed="0.398426"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:25:56.559496" elapsed="0.400406"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:56.559108" elapsed="0.400839"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:25:56.558101" elapsed="0.401918"/>
</kw>
<kw name="Delete Sample Bridge Manually And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:25:56.962997" 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-10-16T01:25:56.961635" elapsed="0.001400">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-10-16T01:25:56.557514" elapsed="0.405706">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-10-16T01:25:56.965401" elapsed="0.000201"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:25:56.965156" elapsed="0.000496"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:56.966555" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:56.966468" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.966451" elapsed="0.000167"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:56.968490" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:56.968407" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.968391" elapsed="0.000162"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:25:56.969469" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:25:56.969141" elapsed="0.000353"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:25:56.969936" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:25:56.969645" elapsed="0.000352"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:25:56.970039" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:25:56.970167" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:25:56.968772" elapsed="0.001417"/>
</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-10-16T01:25:56.972720" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:56.972622" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.972605" elapsed="0.000181"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:56.973886" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:56.973803" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:56.973786" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:56.974330" level="INFO">${karaf_connection_index} = 598</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:25:56.974107" elapsed="0.000248"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:56.974695" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:56.974515" elapsed="0.000221"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:57.007849" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:56.975339" elapsed="0.032712"/>
</kw>
<msg time="2026-10-16T01:25:57.008208" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:57.008249" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:56.974890" elapsed="0.033393"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:57.101349" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:57.008892" elapsed="0.092653"/>
</kw>
<msg time="2026-10-16T01:25:57.101730" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:57.101775" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:57.008445" elapsed="0.093365"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:57.102110" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:57.101882" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:57.101864" elapsed="0.000343"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:57.102799" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:57.102391" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:57.103172" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:57.102963" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:57.102931" elapsed="0.000335"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:57.103298" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:57.105796" 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-10-16T01:25:57.107526" elapsed="0.000506"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:57.109503" 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-10-16T01:25:57.104114" elapsed="0.005794"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:57.103574" elapsed="0.006468"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:56.973522" elapsed="0.136599"/>
</kw>
<msg time="2026-10-16T01:25:57.110204" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:57.110243" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:56.972933" elapsed="0.137346"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:57.110432" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:25:57.110347" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:57.110330" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:57.110915" 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-10-16T01:25:57.111231" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:57.111296" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:25:56.972336" elapsed="0.139046"/>
</kw>
<msg time="2026-10-16T01:25:57.111465" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:57.111504" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:56.970520" elapsed="0.141023"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:57.111847" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:57.111610" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:57.111594" elapsed="0.000325"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:25:56.970384" elapsed="0.141556"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:57.114545" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:57.114461" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:57.114443" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:57.115748" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:57.115640" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:57.115623" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:57.116201" level="INFO">${karaf_connection_index} = 600</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:25:57.115968" elapsed="0.000258"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:57.116564" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:57.116384" elapsed="0.000204"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:57.152159" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:57.117234" elapsed="0.035116"/>
</kw>
<msg time="2026-10-16T01:25:57.152508" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:57.152550" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:57.116799" elapsed="0.035786"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:57.227577" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:57.153222" elapsed="0.074601"/>
</kw>
<msg time="2026-10-16T01:25:57.228566" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:57.228611" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:57.152780" elapsed="0.075868"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:57.229084" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:57.228777" elapsed="0.000383"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:57.228747" elapsed="0.000440"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:57.229811" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:57.229373" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:57.230176" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:57.229979" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:57.229946" elapsed="0.000324"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:57.230305" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:57.233030" elapsed="0.000486"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:25:57.234765" elapsed="0.000492"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:57.236443" elapsed="0.000364"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:25:57.231227" elapsed="0.005650"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:57.230643" elapsed="0.006368"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:57.115381" elapsed="0.121710"/>
</kw>
<msg time="2026-10-16T01:25:57.237180" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:57.237222" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:57.114782" elapsed="0.122476"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:57.237416" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:25:57.237329" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:57.237312" elapsed="0.000184"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:57.237962" 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-10-16T01:25:57.238279" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:57.238343" 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-10-16T01:25:57.114168" elapsed="0.124264"/>
</kw>
<msg time="2026-10-16T01:25:57.238594" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:57.238637" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:57.112201" elapsed="0.126471"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:57.239001" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:57.238762" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:57.238744" elapsed="0.000335"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:25:57.112065" elapsed="0.127038"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:57.242013" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:57.241692" elapsed="0.000369"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:57.241674" elapsed="0.000408"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:57.243180" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:57.243097" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:57.243080" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:57.243624" 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-10-16T01:25:57.243388" elapsed="0.000352"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:57.244113" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:57.243908" elapsed="0.000230"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:57.278643" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:57.244730" elapsed="0.034109"/>
</kw>
<msg time="2026-10-16T01:25:57.279010" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:57.279052" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:57.244290" elapsed="0.034797"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:57.355788" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:57.279670" elapsed="0.076319"/>
</kw>
<msg time="2026-10-16T01:25:57.356153" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:57.356196" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:57.279248" elapsed="0.076984"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:57.356513" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:57.356304" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:57.356286" elapsed="0.000321"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:57.357208" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:57.356820" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:57.357555" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:57.357356" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:57.357340" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:57.357678" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:57.360140" elapsed="0.000470"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:25:57.361851" elapsed="0.000465"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:57.363488" elapsed="0.000364"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:25:57.358468" elapsed="0.005452"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:57.357974" elapsed="0.006081"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:57.242826" elapsed="0.121307"/>
</kw>
<msg time="2026-10-16T01:25:57.364217" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:57.364257" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:57.242229" elapsed="0.122063"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:57.364447" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:25:57.364362" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:57.364345" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:57.364861" 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-10-16T01:25:57.365226" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:57.365301" 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-10-16T01:25:57.241388" elapsed="0.124015"/>
</kw>
<msg time="2026-10-16T01:25:57.365495" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:57.365538" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:57.239372" elapsed="0.126201"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:57.365873" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:57.365640" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:57.365624" elapsed="0.000321"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:25:57.239231" elapsed="0.126752"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:25:56.970240" elapsed="0.395772"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:25:56.968118" elapsed="0.397950"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:25:56.966218" elapsed="0.399906"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:56.965813" elapsed="0.400357"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:25:56.964800" elapsed="0.401425"/>
</kw>
<kw name="Create Sample Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:25:57.370325" 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-10-16T01:25:57.369144" elapsed="0.001219">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-10-16T01:25:56.964247" elapsed="0.406278">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-10-16T01:25:57.377032" elapsed="0.000352"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:25:57.374485" elapsed="0.002978"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:57.378588" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:57.378469" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:57.378447" 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-10-16T01:25:57.380736" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:57.380635" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:57.380618" elapsed="0.000182"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:25:57.381746" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:25:57.381384" elapsed="0.000391"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:25:57.382310" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:25:57.382027" elapsed="0.000308"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:25:57.382376" elapsed="0.000034"/>
</return>
<msg time="2026-10-16T01:25:57.382512" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:25:57.381028" 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-10-16T01:25:57.385142" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:57.385056" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:57.385039" elapsed="0.000167"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:57.386353" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:57.386269" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:57.386251" elapsed="0.000166"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:57.386830" level="INFO">${karaf_connection_index} = 598</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:25:57.386569" elapsed="0.000286"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:57.387261" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:57.387065" elapsed="0.000221"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:57.420201" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:57.387877" elapsed="0.032647"/>
</kw>
<msg time="2026-10-16T01:25:57.420740" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:57.420790" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:57.387440" elapsed="0.033387"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:57.495413" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:57.421485" elapsed="0.074111"/>
</kw>
<msg time="2026-10-16T01:25:57.495776" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:57.495819" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:57.421035" elapsed="0.074819"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:57.496162" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:57.495925" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:57.495907" elapsed="0.000350"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:57.496800" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:57.496438" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:57.497156" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:57.496960" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:57.496930" elapsed="0.000319"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:57.497280" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:57.499822" 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-10-16T01:25:57.501583" elapsed="0.000509"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:57.503280" 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-10-16T01:25:57.498113" elapsed="0.005554"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:57.497574" elapsed="0.006287"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:57.386010" elapsed="0.117930"/>
</kw>
<msg time="2026-10-16T01:25:57.504042" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:57.504084" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:57.385354" elapsed="0.118766"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:57.504273" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:25:57.504189" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:57.504172" elapsed="0.000181"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:57.504688" elapsed="0.000045"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:57.505024" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:57.505088" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:25:57.384748" elapsed="0.120423"/>
</kw>
<msg time="2026-10-16T01:25:57.505255" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:57.505295" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:57.382895" elapsed="0.122435"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:57.505613" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:57.505397" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:57.505381" elapsed="0.000302"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:25:57.382754" elapsed="0.123273"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:57.508528" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:57.508443" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:57.508425" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:57.509676" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:57.509592" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:57.509576" elapsed="0.000188"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:57.510154" level="INFO">${karaf_connection_index} = 600</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:25:57.509907" elapsed="0.000272"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:57.510521" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:57.510339" elapsed="0.000206"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:57.543101" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:57.511161" elapsed="0.032124"/>
</kw>
<msg time="2026-10-16T01:25:57.543438" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:57.543480" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:57.510696" elapsed="0.032819"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:57.613161" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:57.544175" elapsed="0.069215"/>
</kw>
<msg time="2026-10-16T01:25:57.613557" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:57.613598" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:57.543679" elapsed="0.069954"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:57.614011" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:57.613792" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:57.613767" elapsed="0.000342"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:57.614641" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:57.614287" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:57.615015" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:57.614803" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:57.614787" elapsed="0.000323"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:57.615141" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:57.617597" 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-10-16T01:25:57.619397" elapsed="0.000473"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:57.621143" elapsed="0.000309"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:25:57.615921" elapsed="0.005595"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:57.615408" elapsed="0.006227"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:57.509336" elapsed="0.112564"/>
</kw>
<msg time="2026-10-16T01:25:57.621999" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:57.622039" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:57.508752" elapsed="0.113323"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:57.622227" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:25:57.622143" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:57.622127" elapsed="0.000177"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:57.622611" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:57.622922" elapsed="0.000036"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:57.623002" 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-10-16T01:25:57.508151" elapsed="0.114937"/>
</kw>
<msg time="2026-10-16T01:25:57.623171" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:57.623211" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:57.506284" elapsed="0.116962"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:57.623527" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:57.623313" elapsed="0.000576"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:57.623297" elapsed="0.000618"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:25:57.506143" elapsed="0.117794"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:57.627851" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:57.627765" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:57.627747" elapsed="0.000167"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:57.629049" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:57.628928" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:57.628911" elapsed="0.000202"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:57.629542" 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-10-16T01:25:57.629318" elapsed="0.000249"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:57.629924" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:57.629742" elapsed="0.000221"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:57.665229" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:57.630528" elapsed="0.034876"/>
</kw>
<msg time="2026-10-16T01:25:57.665562" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:57.665604" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:57.630122" elapsed="0.035518"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:57.734535" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:57.666266" elapsed="0.068467"/>
</kw>
<msg time="2026-10-16T01:25:57.734887" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:57.734928" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:57.665829" elapsed="0.069148"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:57.735246" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:57.735047" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:57.735029" elapsed="0.000310"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:57.735860" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:57.735513" elapsed="0.000430"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:57.736211" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:57.736018" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:57.736001" elapsed="0.000302"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:57.736334" elapsed="0.000024"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:57.738764" 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-10-16T01:25:57.740456" elapsed="0.000462"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:57.742304" elapsed="0.000303"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:25:57.737126" elapsed="0.005546"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:57.736595" elapsed="0.006211"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:57.628649" elapsed="0.114235"/>
</kw>
<msg time="2026-10-16T01:25:57.742979" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:57.743021" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:57.628075" elapsed="0.114985"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:57.743216" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:25:57.743132" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:57.743115" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:57.743601" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:57.744038" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:57.744105" 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-10-16T01:25:57.627459" elapsed="0.116731"/>
</kw>
<msg time="2026-10-16T01:25:57.744272" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:57.744311" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:57.624207" elapsed="0.120139"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:57.744629" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:57.744413" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:57.744397" elapsed="0.000319"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:25:57.624068" elapsed="0.120671"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:25:57.382588" elapsed="0.362178"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:25:57.380340" elapsed="0.364476"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:25:57.378146" elapsed="0.366720"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:57.377645" elapsed="0.367261"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:25:57.374061" elapsed="0.370906"/>
</kw>
<kw name="Create Sample Port And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:25:57.748935" 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-10-16T01:25:57.747781" elapsed="0.001204">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-10-16T01:25:57.373378" elapsed="0.375754">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-10-16T01:25:57.750496" elapsed="0.000199"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:25:57.750254" 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-10-16T01:25:57.751650" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:57.751565" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:57.751548" elapsed="0.000182"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:57.753607" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:57.753526" elapsed="0.000122"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:57.753509" elapsed="0.000159"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:25:57.754580" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:25:57.754256" elapsed="0.000348"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:25:57.755055" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:25:57.754769" elapsed="0.000310"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:25:57.755119" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:25:57.755244" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:25:57.753886" elapsed="0.001380"/>
</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-10-16T01:25:57.757768" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:57.757669" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:57.757651" elapsed="0.000180"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:57.758923" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:57.758840" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:57.758823" elapsed="0.000176"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:57.759366" level="INFO">${karaf_connection_index} = 598</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:25:57.759145" elapsed="0.000245"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:57.759782" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:57.759584" elapsed="0.000222"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:57.792305" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:57.760388" elapsed="0.032090"/>
</kw>
<msg time="2026-10-16T01:25:57.792652" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:57.792694" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:57.759978" elapsed="0.032767"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:57.878962" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:57.793342" elapsed="0.085863"/>
</kw>
<msg time="2026-10-16T01:25:57.879390" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:57.879431" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:57.792910" elapsed="0.086556"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:57.879838" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:57.879554" elapsed="0.000358"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:57.879528" elapsed="0.000410"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:57.880520" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:57.880132" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:57.880888" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:57.880670" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:57.880654" elapsed="0.000340"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:57.881026" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:57.884189" 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-10-16T01:25:57.885964" elapsed="0.000476"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:57.887790" 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-10-16T01:25:57.882445" elapsed="0.005744"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:57.881890" elapsed="0.006414"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:57.758561" elapsed="0.129823"/>
</kw>
<msg time="2026-10-16T01:25:57.888474" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:57.888514" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:57.757991" elapsed="0.130560"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:57.888782" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-10-16T01:25:57.888621" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:57.888604" elapsed="0.000262"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:57.889237" 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-10-16T01:25:57.889554" elapsed="0.000100"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:57.889715" 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-10-16T01:25:57.757381" elapsed="0.132429"/>
</kw>
<msg time="2026-10-16T01:25:57.889900" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:57.889940" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:57.755590" elapsed="0.134404"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:57.890284" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:57.890064" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:57.890048" elapsed="0.000308"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:25:57.755454" elapsed="0.134925"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:57.893170" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:57.893086" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:57.893068" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:57.894321" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:57.894238" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:57.894222" elapsed="0.000161"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:57.894784" level="INFO">${karaf_connection_index} = 600</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:25:57.894525" elapsed="0.000283"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:57.895172" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:57.894983" elapsed="0.000213"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:57.930576" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:57.895776" elapsed="0.034994"/>
</kw>
<msg time="2026-10-16T01:25:57.930942" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:57.930999" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:57.895350" elapsed="0.035685"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:58.028734" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:57.931616" elapsed="0.097499"/>
</kw>
<msg time="2026-10-16T01:25:58.029356" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:58.029399" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:57.931199" elapsed="0.098237"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:58.030367" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:58.030062" elapsed="0.000383"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.030019" elapsed="0.000452"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:58.031109" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:58.030653" elapsed="0.000550"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:58.031461" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:58.031265" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.031248" elapsed="0.000306"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:58.031589" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:58.034396" 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-10-16T01:25:58.036267" elapsed="0.000495"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:58.037970" 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-10-16T01:25:58.032602" elapsed="0.005761"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:58.031973" elapsed="0.006506"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:57.893980" elapsed="0.144578"/>
</kw>
<msg time="2026-10-16T01:25:58.038645" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:58.038686" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:57.893379" elapsed="0.145392"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:58.039118" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-10-16T01:25:58.038843" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.038826" elapsed="0.000376"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:58.039535" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:58.039861" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:58.039926" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:25:57.892773" elapsed="0.147260"/>
</kw>
<msg time="2026-10-16T01:25:58.040120" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:58.040161" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:57.890646" elapsed="0.149550"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:58.040481" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:58.040264" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.040249" elapsed="0.000303"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:25:57.890506" elapsed="0.150067"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:58.043294" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:58.043209" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.043191" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:58.044446" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:58.044362" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.044346" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:58.044901" 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-10-16T01:25:58.044647" elapsed="0.000279"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:58.045283" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:58.045096" elapsed="0.000212"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:58.077655" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:58.045889" elapsed="0.031961"/>
</kw>
<msg time="2026-10-16T01:25:58.078019" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:58.078061" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:58.045460" elapsed="0.032636"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:58.161981" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:58.078675" elapsed="0.083523"/>
</kw>
<msg time="2026-10-16T01:25:58.162353" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:58.162395" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:58.078257" elapsed="0.084174"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:58.162732" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:58.162499" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.162482" elapsed="0.000347"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:58.163363" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:58.163024" elapsed="0.000428"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:58.163725" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:58.163512" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.163496" elapsed="0.000323"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:58.163850" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:58.166290" elapsed="0.000493"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:25:58.167996" elapsed="0.000441"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:58.169614" elapsed="0.000546"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:25:58.164625" elapsed="0.005601"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:58.164135" elapsed="0.006205"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:58.044106" elapsed="0.126311"/>
</kw>
<msg time="2026-10-16T01:25:58.170498" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:58.170538" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:58.043501" elapsed="0.127072"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:58.170744" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:25:58.170642" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.170625" elapsed="0.000198"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:58.171151" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:58.171454" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:58.171519" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:25:58.042896" elapsed="0.128708"/>
</kw>
<msg time="2026-10-16T01:25:58.171687" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:58.171820" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:58.040966" elapsed="0.130891"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:58.172179" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:58.171926" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.171910" elapsed="0.000342"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:25:58.040812" elapsed="0.131461"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:25:57.755315" elapsed="0.416986"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:25:57.753235" elapsed="0.419120"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:25:57.751315" elapsed="0.421131"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:57.750910" elapsed="0.421582"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:25:57.749906" elapsed="0.422640"/>
</kw>
<kw name="Modify the destination IP of Sample Port" owner="ClusterOvsdb">
<msg time="2026-10-16T01:25:58.175413" 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-10-16T01:25:58.174232" elapsed="0.001217">Variable '${new_owner}' not found.</status>
</kw>
<doc>Modify the dst ip of existing port in Owner.</doc>
<status status="FAIL" start="2026-10-16T01:25:57.749402" elapsed="0.426199">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-10-16T01:25:58.177048" elapsed="0.000203"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:25:58.176781" 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-10-16T01:25:58.178205" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:58.178120" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.178103" elapsed="0.000165"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:58.180157" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:58.180073" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.180056" elapsed="0.000163"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:25:58.181137" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:25:58.180791" elapsed="0.000371"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:25:58.181587" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:25:58.181313" elapsed="0.000298"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:25:58.181652" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:25:58.181796" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:25:58.180422" elapsed="0.001397"/>
</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-10-16T01:25:58.184463" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:58.184302" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.184285" 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-10-16T01:25:58.185627" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:58.185544" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.185527" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:58.186099" level="INFO">${karaf_connection_index} = 598</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:25:58.185858" elapsed="0.000266"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:58.186464" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:58.186287" elapsed="0.000201"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:58.213616" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:58.187086" elapsed="0.026723"/>
</kw>
<msg time="2026-10-16T01:25:58.213987" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:58.214031" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:58.186642" elapsed="0.027425"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:58.284189" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:58.214671" elapsed="0.069816"/>
</kw>
<msg time="2026-10-16T01:25:58.284734" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:58.284871" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:58.214235" elapsed="0.070674"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:58.285344" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:58.285038" elapsed="0.000385"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.285002" elapsed="0.000449"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:58.286093" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:58.285634" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:58.286435" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:58.286235" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.286218" elapsed="0.000311"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:58.286563" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:58.289194" 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-10-16T01:25:58.290926" elapsed="0.000484"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:58.292583" 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-10-16T01:25:58.287465" elapsed="0.005533"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:58.286917" elapsed="0.006197"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:58.185288" elapsed="0.107904"/>
</kw>
<msg time="2026-10-16T01:25:58.293281" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:58.293322" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:58.184674" elapsed="0.108682"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:58.293511" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-16T01:25:58.293426" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.293410" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:58.293954" 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-10-16T01:25:58.294268" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:58.294333" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:25:58.184011" elapsed="0.110412"/>
</kw>
<msg time="2026-10-16T01:25:58.294513" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:58.294553" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:58.182170" elapsed="0.112419"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:58.294906" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:58.294657" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.294642" elapsed="0.000351"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:25:58.182030" elapsed="0.112985"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:58.297827" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:58.297742" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.297724" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:58.299044" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:58.298913" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.298896" elapsed="0.000219"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:58.299493" level="INFO">${karaf_connection_index} = 600</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:25:58.299260" elapsed="0.000258"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:58.300024" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:58.299678" elapsed="0.000371"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:58.331791" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:58.300616" elapsed="0.031364"/>
</kw>
<msg time="2026-10-16T01:25:58.332139" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:58.332180" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:58.300204" elapsed="0.032040"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:58.395657" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:58.332859" elapsed="0.062994"/>
</kw>
<msg time="2026-10-16T01:25:58.396025" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:58.396067" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:58.332412" elapsed="0.063688"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:58.396369" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:58.396169" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.396152" elapsed="0.000309"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:58.397023" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:58.396642" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:58.397355" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:58.397161" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.397145" elapsed="0.000303"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:58.397478" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:58.399922" elapsed="0.000489"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:25:58.401637" elapsed="0.000489"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:58.403298" elapsed="0.000310"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:25:58.398270" elapsed="0.005403"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:58.397762" elapsed="0.006047"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:58.298627" elapsed="0.105258"/>
</kw>
<msg time="2026-10-16T01:25:58.403983" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:58.404025" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:58.298050" elapsed="0.106009"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:58.404212" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:25:58.404128" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.404111" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:58.404601" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:58.404980" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:58.405047" 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-10-16T01:25:58.297428" elapsed="0.107705"/>
</kw>
<msg time="2026-10-16T01:25:58.405215" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:58.405255" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:58.295278" elapsed="0.110011"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:58.405575" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:58.405358" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.405342" elapsed="0.000304"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:25:58.295139" elapsed="0.110528"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:58.408304" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:58.408220" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.408202" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:58.409468" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:58.409386" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.409370" elapsed="0.000160"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:58.410102" 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-10-16T01:25:58.409671" elapsed="0.000456"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:58.410463" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:58.410285" elapsed="0.000202"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:58.452082" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:58.411079" elapsed="0.041175"/>
</kw>
<msg time="2026-10-16T01:25:58.452429" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:58.452471" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:58.410638" elapsed="0.041866"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:58.519539" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:58.453172" elapsed="0.067020"/>
</kw>
<msg time="2026-10-16T01:25:58.520636" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:58.520770" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:58.452669" elapsed="0.068186"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:58.521795" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:58.521102" elapsed="0.000891"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.521032" elapsed="0.001027"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:58.523474" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:58.522473" elapsed="0.001189"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:58.524324" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:58.523848" elapsed="0.000635"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.523809" elapsed="0.000728"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:58.524612" elapsed="0.000075"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:58.531117" elapsed="0.001192"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:25:58.535429" elapsed="0.001482"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:58.538635" elapsed="0.000583"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:25:58.527038" elapsed="0.012275"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:58.525579" elapsed="0.013899"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:58.409133" elapsed="0.130456"/>
</kw>
<msg time="2026-10-16T01:25:58.539732" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:58.539792" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:58.408514" elapsed="0.131331"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:58.540085" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-10-16T01:25:58.539960" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.539920" 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 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-10-16T01:25:58.540663" 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-10-16T01:25:58.541225" elapsed="0.000032"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:58.541316" elapsed="0.000021"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:25:58.407917" elapsed="0.133524"/>
</kw>
<msg time="2026-10-16T01:25:58.541563" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:58.541621" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:58.406077" elapsed="0.135594"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:58.542114" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:58.541791" elapsed="0.000393"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.541768" elapsed="0.000449"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:25:58.405920" elapsed="0.136328"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:25:58.181870" elapsed="0.360423"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:25:58.179767" elapsed="0.362605"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:25:58.177850" elapsed="0.364600"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:58.177446" elapsed="0.365065"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:25:58.176384" elapsed="0.366199"/>
</kw>
<kw name="Verify Sample Port Is Modified" owner="ClusterOvsdb">
<msg time="2026-10-16T01:25:58.546726" 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-10-16T01:25:58.544892" elapsed="0.001885">Variable '${new_cluster_list}' not found.</status>
</kw>
<doc>Verify port is modified in all instances.</doc>
<status status="FAIL" start="2026-10-16T01:25:58.175921" elapsed="0.371101">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-10-16T01:25:58.550066" elapsed="0.000286"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:25:58.549371" elapsed="0.001053"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:58.551772" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:58.551593" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.551570" elapsed="0.000298"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:58.554493" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:58.554376" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.554353" elapsed="0.000319"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:25:58.556011" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:25:58.555506" elapsed="0.000540"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:25:58.556636" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:25:58.556258" elapsed="0.000411"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:25:58.556748" elapsed="0.000042"/>
</return>
<msg time="2026-10-16T01:25:58.556932" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:25:58.555006" elapsed="0.002013"/>
</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-10-16T01:25:58.560608" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:58.560490" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.560467" elapsed="0.000228"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:58.562212" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:58.562129" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.562113" elapsed="0.000161"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:58.562648" level="INFO">${karaf_connection_index} = 598</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:25:58.562417" elapsed="0.000255"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:58.563063" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:58.562851" elapsed="0.000236"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:58.597123" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:58.563653" elapsed="0.033650"/>
</kw>
<msg time="2026-10-16T01:25:58.597481" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:58.597524" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:58.563241" elapsed="0.034318"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:58.655937" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:58.598225" elapsed="0.057904"/>
</kw>
<msg time="2026-10-16T01:25:58.656288" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:58.656328" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:58.597771" elapsed="0.058592"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:58.656657" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:58.656433" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.656415" elapsed="0.000365"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:58.657322" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:58.656979" elapsed="0.000422"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:58.657658" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:58.657461" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.657445" elapsed="0.000329"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:58.657805" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:58.660256" elapsed="0.000496"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:25:58.662185" elapsed="0.000460"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:58.663846" 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-10-16T01:25:58.658587" elapsed="0.005658"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:58.658096" elapsed="0.006266"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:58.561793" elapsed="0.102646"/>
</kw>
<msg time="2026-10-16T01:25:58.664521" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:58.664560" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:58.560924" elapsed="0.103672"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:58.664764" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:25:58.664662" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.664646" elapsed="0.000195"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:58.665226" elapsed="0.000034"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:58.665538" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:58.665602" 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-10-16T01:25:58.560086" elapsed="0.105601"/>
</kw>
<msg time="2026-10-16T01:25:58.665789" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:58.665829" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:58.557492" elapsed="0.108372"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:58.666163" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:58.665930" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.665915" elapsed="0.000319"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:25:58.557297" elapsed="0.108959"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:58.668784" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:58.668676" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.668659" elapsed="0.000188"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:58.669998" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:58.669897" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.669880" elapsed="0.000181"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:58.670426" level="INFO">${karaf_connection_index} = 600</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:25:58.670201" elapsed="0.000250"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:58.671122" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:58.670608" elapsed="0.000539"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:58.702732" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:58.671733" elapsed="0.031186"/>
</kw>
<msg time="2026-10-16T01:25:58.703102" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:58.703143" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:58.671302" elapsed="0.031876"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:58.762410" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:58.703787" elapsed="0.058842"/>
</kw>
<msg time="2026-10-16T01:25:58.762819" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:58.762863" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:58.703343" elapsed="0.059557"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:58.763202" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:58.762987" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.762968" elapsed="0.000331"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:58.763848" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:58.763480" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:58.764203" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:58.764005" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.763989" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:58.764329" elapsed="0.000024"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:58.766827" 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-10-16T01:25:58.768539" elapsed="0.000493"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:58.770227" 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-10-16T01:25:58.765154" elapsed="0.005455"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:58.764599" elapsed="0.006155"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:58.669614" elapsed="0.101219"/>
</kw>
<msg time="2026-10-16T01:25:58.770915" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:58.770970" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:58.669038" elapsed="0.101970"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:58.771165" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:25:58.771079" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.771061" elapsed="0.000182"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:58.771553" 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-10-16T01:25:58.771880" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:58.771961" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:25:58.668381" elapsed="0.103669"/>
</kw>
<msg time="2026-10-16T01:25:58.772133" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:58.772173" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:58.666499" elapsed="0.105711"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:58.772497" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:58.772278" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.772263" elapsed="0.000307"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:25:58.666365" elapsed="0.106226"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:58.776931" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:58.776844" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.776827" elapsed="0.000186"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:58.778169" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:58.778083" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.778066" elapsed="0.000167"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:58.778604" 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-10-16T01:25:58.778377" elapsed="0.000252"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:58.779011" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:58.778808" elapsed="0.000229"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:58.811352" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:58.779610" elapsed="0.031931"/>
</kw>
<msg time="2026-10-16T01:25:58.811719" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:58.811766" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:58.779193" elapsed="0.032607"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:58.869330" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:58.812412" elapsed="0.057092"/>
</kw>
<msg time="2026-10-16T01:25:58.869661" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:58.869727" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:58.811985" elapsed="0.057778"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:58.870054" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:58.869835" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.869815" elapsed="0.000334"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:58.870659" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:58.870328" elapsed="0.000424"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:58.871025" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:58.870813" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.870797" elapsed="0.000322"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:58.871150" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:58.873576" 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-10-16T01:25:58.875327" elapsed="0.000474"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:58.877234" elapsed="0.000306"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:25:58.871922" elapsed="0.005687"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:58.871414" elapsed="0.006329"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:58.777804" elapsed="0.100017"/>
</kw>
<msg time="2026-10-16T01:25:58.877902" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:58.877957" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:58.777196" elapsed="0.100797"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:58.878146" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-10-16T01:25:58.878061" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.878045" elapsed="0.000195"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:58.878553" 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-10-16T01:25:58.879013" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:58.879082" 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-10-16T01:25:58.776528" elapsed="0.102641"/>
</kw>
<msg time="2026-10-16T01:25:58.879251" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:58.879291" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:58.772865" elapsed="0.106459"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:58.879607" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:58.879390" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.879375" elapsed="0.000303"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:25:58.772726" elapsed="0.106990"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:25:58.557092" elapsed="0.322652"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:25:58.553966" elapsed="0.325829"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:25:58.551235" elapsed="0.328610"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:58.550629" elapsed="0.329256"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:25:58.548502" elapsed="0.331431"/>
</kw>
<kw name="Start_Single_Member" owner="ClusterManagement">
<msg time="2026-10-16T01:25:58.926730" 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-10-16T01:25:58.880175" elapsed="0.046638">Variable '${original_candidate}' not found.</status>
</kw>
<doc>Start Owner Instance and verify it is active</doc>
<status status="FAIL" start="2026-10-16T01:25:58.547691" elapsed="0.379343">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-10-16T01:25:58.929659" elapsed="0.000311"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:25:58.929180" elapsed="0.000846"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:58.931113" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:58.930992" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.930930" 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-10-16T01:25:58.933114" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:58.933032" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.933015" elapsed="0.000161"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:25:58.934099" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:25:58.933747" elapsed="0.000377"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:25:58.934541" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:25:58.934273" elapsed="0.000292"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:25:58.934605" elapsed="0.000030"/>
</return>
<msg time="2026-10-16T01:25:58.934751" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:25:58.933379" elapsed="0.001395"/>
</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-10-16T01:25:58.937400" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:58.937317" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.937300" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:58.938602" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:58.938520" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:58.938504" elapsed="0.000251"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:58.939158" level="INFO">${karaf_connection_index} = 598</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:25:58.938904" elapsed="0.000279"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:58.939534" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:58.939346" elapsed="0.000212"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:58.972676" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:58.940163" elapsed="0.032721"/>
</kw>
<msg time="2026-10-16T01:25:58.973060" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:58.973102" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:58.939728" elapsed="0.033407"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:59.038440" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:58.973740" elapsed="0.064876"/>
</kw>
<msg time="2026-10-16T01:25:59.038798" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:59.038840" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:58.973298" elapsed="0.065575"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:59.039168" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:59.038958" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:59.038925" elapsed="0.000337"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:59.039799" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:59.039441" elapsed="0.000434"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:59.040146" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:59.039936" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:59.039919" elapsed="0.000320"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:59.040269" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:59.042794" 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-10-16T01:25:59.044539" elapsed="0.000578"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:59.046411" elapsed="0.000579"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:25:59.041087" elapsed="0.005972"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:59.040555" elapsed="0.006616"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:58.938266" elapsed="0.108981"/>
</kw>
<msg time="2026-10-16T01:25:59.047328" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:59.047367" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:58.937610" elapsed="0.109790"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:59.047551" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:25:59.047468" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:59.047451" elapsed="0.000176"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:59.047982" 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-10-16T01:25:59.048516" elapsed="0.000044"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:59.048607" 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-10-16T01:25:58.937029" elapsed="0.111665"/>
</kw>
<msg time="2026-10-16T01:25:59.048857" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:59.048896" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:58.935155" elapsed="0.113774"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:59.049237" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:59.049013" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:59.048997" elapsed="0.000312"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:25:58.935014" elapsed="0.114316"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:59.051814" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:59.051728" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:59.051690" elapsed="0.000186"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:59.052980" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:59.052882" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:59.052866" elapsed="0.000178"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:59.053457" level="INFO">${karaf_connection_index} = 600</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:25:59.053229" elapsed="0.000253"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:59.053840" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:59.053640" elapsed="0.000224"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:59.086585" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:59.054441" elapsed="0.032358"/>
</kw>
<msg time="2026-10-16T01:25:59.086967" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:59.087009" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:59.054033" elapsed="0.033010"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:59.160824" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:59.087625" elapsed="0.073389"/>
</kw>
<msg time="2026-10-16T01:25:59.161170" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:59.161211" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:59.087206" elapsed="0.074038"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:59.161514" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:59.161313" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:59.161295" elapsed="0.000311"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:59.162165" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:59.161811" elapsed="0.000431"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:59.162493" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:59.162301" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:59.162285" elapsed="0.000299"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:59.162615" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:59.165097" 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-10-16T01:25:59.166815" elapsed="0.000465"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:59.168449" 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-10-16T01:25:59.163437" elapsed="0.005419"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:59.162932" elapsed="0.006057"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:59.052605" elapsed="0.116461"/>
</kw>
<msg time="2026-10-16T01:25:59.169147" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:59.169186" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:59.052037" elapsed="0.117182"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:59.169371" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:25:59.169288" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:59.169270" elapsed="0.000177"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:59.169780" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:59.170088" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:59.170152" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:25:59.051417" elapsed="0.118819"/>
</kw>
<msg time="2026-10-16T01:25:59.170317" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:59.170357" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:59.049575" elapsed="0.120815"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:59.170670" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:59.170457" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:59.170441" elapsed="0.000325"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:25:59.049441" elapsed="0.121346"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:59.173272" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:59.173190" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:59.173172" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:25:59.174749" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:59.174645" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:59.174629" elapsed="0.000183"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:25:59.175189" 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-10-16T01:25:59.174965" elapsed="0.000248"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:25:59.175550" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:25:59.175371" elapsed="0.000203"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:25:59.207690" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:25:59.176168" elapsed="0.031827"/>
</kw>
<msg time="2026-10-16T01:25:59.208150" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:25:59.208191" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:59.175742" elapsed="0.032483"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:25:59.270926" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:59.208821" elapsed="0.062332"/>
</kw>
<msg time="2026-10-16T01:25:59.271309" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:25:59.271351" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:59.208386" elapsed="0.062998"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:59.271653" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:59.271452" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:59.271434" elapsed="0.000338"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:59.272300" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:25:59.271964" elapsed="0.000413"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:59.272631" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:59.272437" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:59.272420" elapsed="0.000322"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:25:59.272773" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:59.275236" elapsed="0.000494"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:25:59.276965" elapsed="0.000474"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:25:59.278621" elapsed="0.000358"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:25:59.273554" elapsed="0.005492"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:25:59.273061" elapsed="0.006100"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:25:59.174390" elapsed="0.104847"/>
</kw>
<msg time="2026-10-16T01:25:59.279316" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:59.279355" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:59.173481" elapsed="0.105908"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:25:59.279541" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:25:59.279456" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:59.279440" elapsed="0.000177"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:25:59.280144" 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-10-16T01:25:59.280440" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:25:59.280503" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:25:59.172887" elapsed="0.107699"/>
</kw>
<msg time="2026-10-16T01:25:59.280669" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:25:59.280726" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:59.171044" elapsed="0.109717"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:59.281060" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:59.280829" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:59.280813" elapsed="0.000320"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:25:59.170895" elapsed="0.110259"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:25:58.934825" elapsed="0.346356"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:25:58.932686" elapsed="0.348553"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:25:58.930605" elapsed="0.350722"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:25:58.930177" elapsed="0.351195"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:25:58.928480" elapsed="0.352941"/>
</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-10-16T01:25:59.290269" elapsed="0.000190"/>
</kw>
<msg time="2026-10-16T01:25:59.290502" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:59.289737" elapsed="0.000811"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:25:59.289335" elapsed="0.001281"/>
</kw>
<msg time="2026-10-16T01:25:59.290656" 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-10-16T01:25:59.286506" elapsed="0.004204"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:25:59.286148" elapsed="0.004632"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:59.291224" 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-10-16T01:25:59.290999" elapsed="0.000265"/>
</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-10-16T01:25:59.294110" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:25:59.293769" elapsed="0.000367"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:25:59.294561" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:25:59.294283" elapsed="0.000302"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:25:59.294626" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:25:59.294778" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:25:59.293406" elapsed="0.001396"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:25:59.294962" elapsed="0.000129"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:25:59.295549" 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-10-16T01:25:59.295252" elapsed="0.000322"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:25:59.295974" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:25:59.295733" elapsed="0.000266"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:25:59.296357" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:25:59.296136" elapsed="0.000245"/>
</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-10-16T01:25:59.300074" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:25:59.299466" elapsed="0.000656"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:25:59.300177" elapsed="0.000060"/>
</return>
<msg time="2026-10-16T01:25:59.300425" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:25:59.298110" elapsed="0.002370"/>
</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-10-16T01:25:59.316330" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:25:59.316026" elapsed="0.000330"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:25:59.319861" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:25:59.316848" elapsed="0.003163">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:25:59.320158" 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-10-16T01:25:59.316512" elapsed="0.003672"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:25:59.320923" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:25:59.320460" elapsed="0.000505"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:25:59.321269" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:25:59.321450" 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-10-16T01:25:59.321134" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:59.321913" 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-10-16T01:25:59.321669" 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-10-16T01:25:59.323183" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:25:59.322933" elapsed="0.000293"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:25:59.323655" 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-10-16T01:25:59.323400" elapsed="0.000280"/>
</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-10-16T01:25:59.324011" 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-10-16T01:25:59.324195" elapsed="0.000022"/>
</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-10-16T01:25:59.324376" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:25:59.323862" elapsed="0.000566"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:25:59.323745" elapsed="0.000711"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:25:59.324500" elapsed="0.000030"/>
</return>
<msg time="2026-10-16T01:25:59.324637" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:25:59.322556" elapsed="0.002104"/>
</kw>
<status status="PASS" start="2026-10-16T01:25:59.322057" elapsed="0.002633"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:59.324877" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:59.324730" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:59.322032" elapsed="0.002929"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:25:59.325510" 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-10-16T01:25:59.325116" elapsed="0.000419"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:25:59.325579" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:25:59.315500" elapsed="0.010177"/>
</kw>
<msg time="2026-10-16T01:25:59.325743" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:25:59.311472" elapsed="0.014319"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:59.329649" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:59.333599" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:59.337508" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:59.337687" 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-10-16T01:25:59.337880" elapsed="0.000019"/>
</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-10-16T01:25:59.338233" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:59.338091" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:25:59.338078" elapsed="0.000229"/>
</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-10-16T01:25:59.338458" elapsed="0.000019"/>
</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-10-16T01:25:59.338632" elapsed="0.000018"/>
</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-10-16T01:25:59.338811" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:25:59.338052" elapsed="0.000809"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:25:59.337961" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:59.339044" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:25:59.339112" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:25:59.339221" 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-10-16T01:25:59.310866" elapsed="0.028378"/>
</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-10-16T01:25:59.340434" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:25:59.340164" elapsed="0.000331">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:25:59.340578" 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-10-16T01:25:59.339825" elapsed="0.000776"/>
</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-10-16T01:25:59.340898" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:59.340664" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:25:59.341433" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:25:59.341164" elapsed="0.000293"/>
</kw>
<status status="PASS" start="2026-10-16T01:25:59.340989" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:59.340647" elapsed="0.000861"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:25:59.342036" 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-10-16T01:25:59.341664" elapsed="0.000397"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:25:59.342106" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:25:59.342230" 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-manganese/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-10-16T01:25:59.339507" elapsed="0.002746"/>
</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-10-16T01:25:59.343386" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:25:59.343188" elapsed="0.000258">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:25:59.343683" 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-10-16T01:25:59.342857" elapsed="0.000868"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:25:59.343892" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:25:59.343792" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-10-16T01:25:59.343775" elapsed="0.000208"/>
</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-10-16T01:25:59.344133" elapsed="0.000020"/>
</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-10-16T01:25:59.344304" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:25:59.344364" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:25:59.344488" 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-manganese/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-10-16T01:25:59.342499" elapsed="0.002013"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:59.345750" 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-10-16T01:25:59.345511" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:25:59.346216" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:25:59.345996" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:25:59.353434" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:25:59.353488" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:25:59.353606" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:25:59.346537" elapsed="0.008021">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:25:59.346316" elapsed="0.008326">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:25:59.354859" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:59.354674" elapsed="0.000245"/>
</branch>
<status status="FAIL" start="2026-10-16T01:25:59.346300" elapsed="0.008658">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:25:59.355319" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:25:59.355457" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:25:59.355423" elapsed="0.000073"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:25:59.355406" elapsed="0.000111"/>
</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-10-16T01:25:59.355653" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:25:59.355734" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:25:59.344805" elapsed="0.011034">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:25:59.355962" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:25:59.303991" elapsed="0.052134">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:25:59.356527" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:59.356300" elapsed="0.000312"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:25:59.356250" elapsed="0.000405"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:25:59.356781" elapsed="0.000038"/>
</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="FAIL" start="2026-10-16T01:25:59.302358" elapsed="0.054609">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:25:59.300677" elapsed="0.056396">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:25:59.300659" elapsed="0.056491">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:59.357403" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:25:59.357781" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:59.358116" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:25:59.358471" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:25:59.358924" elapsed="0.000034"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:25:59.359253" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:25:59.359603" elapsed="0.000019"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:25:59.359876" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:25:59.297521" elapsed="0.062469">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:25:59.360056" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:25:59.296749" elapsed="0.063398">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:59.360369" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:59.360227" elapsed="0.000192"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:59.360576" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:59.360441" elapsed="0.000183"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:59.360808" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:59.360646" elapsed="0.000211"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:25:59.360211" elapsed="0.000669"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:25:59.296586" elapsed="0.064332">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:25:59.296422" elapsed="0.064562">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:25:59.361034" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:25:59.292811" elapsed="0.068314">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:59.361376" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:59.361594" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:25:59.361456" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:25:59.361441" elapsed="0.000222"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:59.361876" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:59.362059" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:25:59.362118" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:25:59.292115" elapsed="0.070097">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:25:59.291906" elapsed="0.070369">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:25:59.291801" elapsed="0.070523">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:25:59.291461" elapsed="0.070946">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:25:59.362618" elapsed="0.000021"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:25:59.282557" elapsed="0.080228">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:00.382693" elapsed="0.000513"/>
</kw>
<msg time="2026-10-16T01:26:00.383337" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:00.381306" elapsed="0.002161"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:00.380251" elapsed="0.003384"/>
</kw>
<msg time="2026-10-16T01:26:00.383766" 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-10-16T01:26:00.373168" elapsed="0.010698"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:00.372285" elapsed="0.011764"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:00.385184" 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-10-16T01:26:00.384574" elapsed="0.000709"/>
</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-10-16T01:26:00.392324" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:00.391476" elapsed="0.000908"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:00.393449" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:00.392767" elapsed="0.000739"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:00.393609" elapsed="0.000069"/>
</return>
<msg time="2026-10-16T01:26:00.394100" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:00.390596" elapsed="0.003560"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:00.394507" elapsed="0.000335"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:00.396026" 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-10-16T01:26:00.395258" elapsed="0.000828"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:00.397051" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:00.396435" elapsed="0.000673"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:00.398028" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:00.397437" elapsed="0.000648"/>
</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-10-16T01:26:00.407428" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:00.405989" elapsed="0.001556"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:00.407683" elapsed="0.000334"/>
</return>
<msg time="2026-10-16T01:26:00.408479" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:00.402459" elapsed="0.006156"/>
</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-10-16T01:26:00.432585" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:00.432141" elapsed="0.000482"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:00.433645" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:00.433334" elapsed="0.000434">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:00.433886" 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-10-16T01:26:00.432866" elapsed="0.001051"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:00.434601" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:00.434171" elapsed="0.000465"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:00.435070" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:00.435373" 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-10-16T01:26:00.434884" elapsed="0.000522"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:00.436020" 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-10-16T01:26:00.435670" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:00.437572" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:00.437252" elapsed="0.000378"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:00.438318" 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-10-16T01:26:00.437888" elapsed="0.000473"/>
</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-10-16T01:26:00.438686" 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-10-16T01:26:00.438888" elapsed="0.000022"/>
</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-10-16T01:26:00.439082" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:00.438557" elapsed="0.000576"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:00.438433" elapsed="0.000730"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:00.439207" elapsed="0.000030"/>
</return>
<msg time="2026-10-16T01:26:00.439342" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:00.436762" elapsed="0.002667"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:00.436171" elapsed="0.003289"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:00.439631" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:00.439486" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:00.436143" elapsed="0.003577"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:00.440285" 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-10-16T01:26:00.439877" elapsed="0.000434"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:00.440355" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:00.431371" elapsed="0.009171"/>
</kw>
<msg time="2026-10-16T01:26:00.440593" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:00.425530" elapsed="0.015112"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:00.444506" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:00.448520" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:00.452285" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:00.452481" elapsed="0.000020"/>
</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-10-16T01:26:00.452657" elapsed="0.000019"/>
</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-10-16T01:26:00.453026" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:00.452874" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:00.452860" 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-10-16T01:26:00.453250" 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-10-16T01:26:00.453423" elapsed="0.000018"/>
</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-10-16T01:26:00.453581" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:00.452834" elapsed="0.000795"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:00.452742" elapsed="0.000910"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:00.453814" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:00.453883" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:00.454000" 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-10-16T01:26:00.424680" elapsed="0.029345"/>
</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-10-16T01:26:00.455384" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:00.455136" elapsed="0.000310">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:00.455529" 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-10-16T01:26:00.454653" elapsed="0.000899"/>
</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-10-16T01:26:00.455848" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:00.455615" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:00.456369" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:00.456106" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:00.455923" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:00.455598" elapsed="0.000848"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:00.456968" 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-10-16T01:26:00.456600" elapsed="0.000393"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:00.457039" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:26:00.457164" 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-manganese/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-10-16T01:26:00.454335" elapsed="0.002852"/>
</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-10-16T01:26:00.458269" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:00.458073" elapsed="0.000255">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:00.458410" 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-10-16T01:26:00.457745" elapsed="0.000689"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:00.458775" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:26:00.458653" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:00.458480" elapsed="0.000374"/>
</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-10-16T01:26:00.459018" 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-10-16T01:26:00.459196" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:00.459255" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:00.459379" 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-manganese/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-10-16T01:26:00.457433" elapsed="0.001969"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:00.460619" 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-10-16T01:26:00.460396" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:00.461094" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:00.460861" 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-10-16T01:26:00.465518" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:00.465571" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:00.465718" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:00.461566" elapsed="0.004530">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:00.461343" elapsed="0.004837">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:00.466360" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:00.466210" elapsed="0.000208"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:00.461326" elapsed="0.005120">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:00.466809" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:00.466945" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:00.466897" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:00.466881" elapsed="0.000126"/>
</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-10-16T01:26:00.467143" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:00.467207" elapsed="0.000141"/>
</return>
<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="FAIL" start="2026-10-16T01:26:00.459674" elapsed="0.007763">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:00.467504" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:26:00.415052" elapsed="0.052599">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:00.468086" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:00.467847" elapsed="0.000327"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:00.467798" elapsed="0.000416"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:00.468299" elapsed="0.000037"/>
</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="FAIL" start="2026-10-16T01:26:00.412861" elapsed="0.055605">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:00.409289" elapsed="0.059276">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:00.409241" elapsed="0.059399">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:00.468908" elapsed="0.000038"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:00.469275" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:00.469594" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:00.469987" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:00.470417" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:00.470749" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:00.471118" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:00.471415" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:26:00.401056" elapsed="0.070463">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:00.471581" elapsed="0.000014"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:00.399024" elapsed="0.072646">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:00.471916" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:00.471775" elapsed="0.000205"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:00.472139" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:00.472002" elapsed="0.000186"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:00.472351" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:00.472210" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:00.471758" elapsed="0.000660"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:00.398618" elapsed="0.073839">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:00.398188" elapsed="0.074323">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:00.472560" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:00.389146" elapsed="0.083505">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:00.472909" elapsed="0.000034"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:00.473146" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:00.473006" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:00.472990" elapsed="0.000224"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:00.473339" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:00.473504" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:00.473561" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:00.387412" elapsed="0.086242">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:00.386906" elapsed="0.086887">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:00.386608" elapsed="0.087239">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:00.385791" elapsed="0.088152">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:00.474154" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:00.363596" elapsed="0.110663">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:01.495788" elapsed="0.000428"/>
</kw>
<msg time="2026-10-16T01:26:01.496335" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:01.494502" elapsed="0.001946"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:01.493564" elapsed="0.003041"/>
</kw>
<msg time="2026-10-16T01:26:01.496694" 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-10-16T01:26:01.487040" elapsed="0.009778"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:01.486005" elapsed="0.010983"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:01.498037" 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-10-16T01:26:01.497463" elapsed="0.000667"/>
</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-10-16T01:26:01.504995" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:01.504176" elapsed="0.000879"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:01.506047" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:01.505386" elapsed="0.000717"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:01.506198" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:26:01.506487" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:01.503329" elapsed="0.003208"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:01.506893" elapsed="0.000315"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:01.508295" 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-10-16T01:26:01.507574" elapsed="0.000775"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:01.509232" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:01.508672" elapsed="0.000613"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:01.510134" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:01.509588" elapsed="0.000598"/>
</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-10-16T01:26:01.519062" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:01.517575" elapsed="0.001614"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:01.519316" elapsed="0.000086"/>
</return>
<msg time="2026-10-16T01:26:01.519669" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:01.514229" elapsed="0.005630"/>
</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-10-16T01:26:01.542171" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:01.541727" elapsed="0.000480"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:01.543207" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:01.542880" elapsed="0.000426">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:01.543425" 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-10-16T01:26:01.542422" elapsed="0.001035"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:01.544291" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:01.543831" elapsed="0.000496"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:01.544746" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:01.544962" 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-10-16T01:26:01.544551" elapsed="0.000447"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:01.545604" 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-10-16T01:26:01.545306" elapsed="0.000339"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:01.546567" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:01.546339" elapsed="0.000268"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:01.547213" 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-10-16T01:26:01.546795" elapsed="0.000444"/>
</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-10-16T01:26:01.547519" elapsed="0.000020"/>
</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-10-16T01:26:01.547714" 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-10-16T01:26:01.547900" elapsed="0.000047"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:01.547392" elapsed="0.000590"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:01.547284" elapsed="0.000727"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:01.548055" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:26:01.548185" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:01.546005" elapsed="0.002203"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:01.545739" elapsed="0.002498"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:01.548404" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:01.548262" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:01.545690" elapsed="0.002783"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:01.549049" 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-10-16T01:26:01.548625" elapsed="0.000450"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:01.549119" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:01.541016" elapsed="0.008203"/>
</kw>
<msg time="2026-10-16T01:26:01.549266" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:01.535336" elapsed="0.013977"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:01.553152" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:01.557043" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:01.560962" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:01.561174" elapsed="0.000020"/>
</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-10-16T01:26:01.561354" elapsed="0.000019"/>
</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-10-16T01:26:01.561692" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:01.561552" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:01.561538" 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-10-16T01:26:01.561953" 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-10-16T01:26:01.562133" 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-10-16T01:26:01.562295" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:01.561512" elapsed="0.000831"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:01.561422" elapsed="0.000944"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:01.562515" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:01.562582" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:26:01.562686" 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-10-16T01:26:01.534482" elapsed="0.028244"/>
</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-10-16T01:26:01.563831" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:01.563615" elapsed="0.000276">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:01.563989" 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-10-16T01:26:01.563293" elapsed="0.000719"/>
</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-10-16T01:26:01.564288" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:01.564076" elapsed="0.000264"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:01.564800" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:01.564520" elapsed="0.000305"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:01.564363" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:01.564059" elapsed="0.000818"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:01.565387" 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-10-16T01:26:01.565049" elapsed="0.000362"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:01.565456" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:26:01.565578" 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-manganese/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-10-16T01:26:01.562998" elapsed="0.002603"/>
</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-10-16T01:26:01.566789" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:01.566490" elapsed="0.000359">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:01.566945" 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-10-16T01:26:01.566176" elapsed="0.000793"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:01.567172" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:26:01.567072" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:01.567054" elapsed="0.000195"/>
</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-10-16T01:26:01.567398" elapsed="0.000020"/>
</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-10-16T01:26:01.567568" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:01.567627" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:01.567768" 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-manganese/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-10-16T01:26:01.565861" elapsed="0.001930"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:01.569190" 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-10-16T01:26:01.568964" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:01.569636" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:01.569418" elapsed="0.000258"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:26:01.573819" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:01.573873" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:01.573991" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:01.569990" elapsed="0.004359">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:01.569753" elapsed="0.004675">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:01.574607" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:01.574458" elapsed="0.000208"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:01.569735" elapsed="0.004952">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:01.575051" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:01.575172" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:01.575139" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:01.575122" elapsed="0.000107"/>
</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-10-16T01:26:01.575364" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:01.575426" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:26:01.568076" elapsed="0.007450">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:01.575592" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:26:01.524657" elapsed="0.051085">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:01.576146" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:01.575912" elapsed="0.000352"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:01.575864" elapsed="0.000441"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:01.576390" elapsed="0.000037"/>
</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="FAIL" start="2026-10-16T01:26:01.522562" elapsed="0.053994">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:01.520169" elapsed="0.056488">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:01.520141" elapsed="0.056607">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:01.577010" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:01.577357" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:01.577671" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:01.578058" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:01.578490" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:01.578818" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:01.579182" elapsed="0.000019"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:01.579425" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:26:01.512900" elapsed="0.066626">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:01.579586" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:01.511035" elapsed="0.068639">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:01.579918" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:01.579779" elapsed="0.000202"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:01.580143" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:01.580005" elapsed="0.000187"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:01.580354" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:01.580213" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:01.579762" elapsed="0.000659"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:01.510648" elapsed="0.069812">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:01.510279" elapsed="0.070233">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:01.580560" elapsed="0.000013"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:01.501896" elapsed="0.078753">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:01.580969" elapsed="0.000049"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:01.581225" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:01.581083" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:01.581067" elapsed="0.000226"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:01.581419" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:01.581587" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:01.581646" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:01.500120" elapsed="0.081635">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:01.499608" elapsed="0.082210">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:01.499366" elapsed="0.082501">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:01.498573" elapsed="0.083390">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:01.582176" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:01.475089" elapsed="0.107190">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:02.601324" elapsed="0.000425"/>
</kw>
<msg time="2026-10-16T01:26:02.601865" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:02.600075" elapsed="0.001934"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:02.599147" elapsed="0.003018"/>
</kw>
<msg time="2026-10-16T01:26:02.602255" 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-10-16T01:26:02.592599" elapsed="0.009743"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:02.591751" elapsed="0.010734"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:02.603511" 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-10-16T01:26:02.603009" elapsed="0.000592"/>
</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-10-16T01:26:02.610057" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:02.609292" elapsed="0.000821"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:02.611084" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:02.610444" elapsed="0.000693"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:02.611228" elapsed="0.000059"/>
</return>
<msg time="2026-10-16T01:26:02.611505" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:02.608474" elapsed="0.003080"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:02.611910" elapsed="0.000300"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:02.613397" 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-10-16T01:26:02.612572" elapsed="0.000881"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:02.614351" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:02.613814" elapsed="0.000591"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:02.615265" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:02.614743" elapsed="0.000574"/>
</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-10-16T01:26:02.623911" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:02.622516" elapsed="0.001524"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:02.624165" elapsed="0.000129"/>
</return>
<msg time="2026-10-16T01:26:02.625015" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:02.619305" elapsed="0.005846"/>
</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-10-16T01:26:02.649442" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:02.649018" elapsed="0.000461"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:02.650482" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:02.650176" elapsed="0.000406">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:02.650723" 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-10-16T01:26:02.649695" elapsed="0.001061"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:02.651438" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:02.651008" elapsed="0.000465"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:02.651879" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:02.652101" 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-10-16T01:26:02.651719" elapsed="0.000415"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:02.652726" 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-10-16T01:26:02.652397" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:02.654279" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:02.653737" elapsed="0.000613"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:02.654872" 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-10-16T01:26:02.654597" 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-10-16T01:26:02.655193" elapsed="0.000020"/>
</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-10-16T01:26:02.655391" elapsed="0.000022"/>
</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-10-16T01:26:02.655572" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:02.655064" elapsed="0.000559"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:02.654951" elapsed="0.000700"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:02.655692" elapsed="0.000045"/>
</return>
<msg time="2026-10-16T01:26:02.655841" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:02.653248" elapsed="0.002616"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:02.652871" elapsed="0.003021"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:02.656129" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:02.655985" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:02.652848" elapsed="0.003352"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:02.656786" 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-10-16T01:26:02.656384" elapsed="0.000471"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:02.656902" elapsed="0.000041"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:02.648288" elapsed="0.008733"/>
</kw>
<msg time="2026-10-16T01:26:02.657068" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:02.642208" elapsed="0.014906"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:02.661119" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:02.664896" elapsed="0.000034"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:02.668684" elapsed="0.000038"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:02.668876" elapsed="0.000020"/>
</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-10-16T01:26:02.669063" elapsed="0.000019"/>
</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-10-16T01:26:02.669404" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:02.669265" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:02.669251" elapsed="0.000227"/>
</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-10-16T01:26:02.669628" elapsed="0.000019"/>
</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-10-16T01:26:02.669818" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:02.669992" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:02.669226" elapsed="0.000816"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:02.669132" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:02.670212" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:02.670279" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:02.670382" 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-10-16T01:26:02.641307" elapsed="0.029099"/>
</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-10-16T01:26:02.671540" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:02.671350" elapsed="0.000249">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:02.671681" 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-10-16T01:26:02.671027" elapsed="0.000691"/>
</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-10-16T01:26:02.672007" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:02.671783" elapsed="0.000277"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:02.672512" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:02.672250" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:02.672083" elapsed="0.000486"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:02.671766" elapsed="0.000822"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:02.673111" 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-10-16T01:26:02.672759" elapsed="0.000376"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:02.673181" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:26:02.673315" 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-manganese/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-10-16T01:26:02.670665" elapsed="0.002674"/>
</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-10-16T01:26:02.674492" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:02.674241" elapsed="0.000324">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:02.674667" 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-10-16T01:26:02.673899" elapsed="0.000792"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:02.674874" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:26:02.674775" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:02.674758" elapsed="0.000206"/>
</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-10-16T01:26:02.675114" elapsed="0.000020"/>
</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-10-16T01:26:02.675284" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:02.675344" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:02.675468" 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-manganese/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-10-16T01:26:02.673585" elapsed="0.001906"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:02.676901" 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-10-16T01:26:02.676660" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:02.677355" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:02.677139" elapsed="0.000256"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:26:02.681853" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:02.681907" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:02.682026" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:02.677674" elapsed="0.004715">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:02.677454" elapsed="0.005046">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:02.682681" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:02.682532" elapsed="0.000226"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:02.677438" elapsed="0.005342">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:02.683130" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:02.683249" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:02.683216" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:02.683200" elapsed="0.000107"/>
</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-10-16T01:26:02.683441" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:02.683504" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:26:02.675965" elapsed="0.007641">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:02.683674" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:26:02.631007" elapsed="0.052815">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:02.684226" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:02.684005" elapsed="0.000303"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:02.683954" elapsed="0.000394"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:02.684431" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:26:02.628635" elapsed="0.055958">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:02.625600" elapsed="0.059093">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:02.625556" elapsed="0.059232">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:02.685049" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:02.685397" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:02.685720" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:02.686078" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:02.686504" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:02.686837" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:02.687204" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:02.687441" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:26:02.617960" elapsed="0.069581">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:02.687633" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:02.616145" elapsed="0.071621">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:02.688005" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:02.687849" elapsed="0.000207"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:02.688215" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:02.688079" elapsed="0.000186"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:02.688426" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:02.688286" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:02.687833" elapsed="0.000662"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:02.615804" elapsed="0.072728">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:02.615411" elapsed="0.073174">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:02.688633" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:02.607136" elapsed="0.081610">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:02.688934" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:02.689153" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:02.689014" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:02.688999" elapsed="0.000222"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:02.689345" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:02.689510" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:02.689568" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:02.605530" elapsed="0.084128">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:02.605100" elapsed="0.084731">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:02.604844" elapsed="0.085040">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:02.604082" elapsed="0.085898">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:02.690193" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:02.583091" elapsed="0.107205">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:03.710524" elapsed="0.000452"/>
</kw>
<msg time="2026-10-16T01:26:03.711096" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:03.709284" elapsed="0.002043"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:03.708359" elapsed="0.003131"/>
</kw>
<msg time="2026-10-16T01:26:03.711580" 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-10-16T01:26:03.701519" elapsed="0.010149"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:03.700569" elapsed="0.011279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:03.712881" 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-10-16T01:26:03.712346" elapsed="0.000678"/>
</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-10-16T01:26:03.719618" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:03.718872" elapsed="0.000802"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:03.720645" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:03.720057" elapsed="0.000640"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:03.720825" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:26:03.721134" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:03.718076" elapsed="0.003107"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:03.721506" elapsed="0.000312"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:03.722884" 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-10-16T01:26:03.722197" elapsed="0.000762"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:03.723807" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:03.723282" elapsed="0.000578"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:03.724681" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:03.724185" elapsed="0.000578"/>
</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-10-16T01:26:03.733937" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:03.732450" elapsed="0.001599"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:03.734179" elapsed="0.000133"/>
</return>
<msg time="2026-10-16T01:26:03.734906" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:03.728952" elapsed="0.006106"/>
</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-10-16T01:26:03.759620" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:03.759199" elapsed="0.000457"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:03.760747" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:03.760420" elapsed="0.000430">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:03.760989" 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-10-16T01:26:03.759940" elapsed="0.001081"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:03.761684" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:03.761256" elapsed="0.000484"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:03.762149" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:03.762455" 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-10-16T01:26:03.761986" elapsed="0.000511"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:03.763266" 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-10-16T01:26:03.762874" elapsed="0.000465"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:03.764808" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:03.764544" elapsed="0.000306"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:03.765295" 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-10-16T01:26:03.765037" 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-10-16T01:26:03.765603" elapsed="0.000020"/>
</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-10-16T01:26:03.765804" elapsed="0.000022"/>
</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-10-16T01:26:03.765995" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:03.765475" elapsed="0.000574"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:03.765365" elapsed="0.000730"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:03.766148" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:26:03.766305" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:03.764004" elapsed="0.002325"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:03.763446" elapsed="0.002912"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:03.766528" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:03.766383" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:03.763416" elapsed="0.003182"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:03.767169" 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-10-16T01:26:03.766765" elapsed="0.000430"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:03.767238" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:03.758472" elapsed="0.008870"/>
</kw>
<msg time="2026-10-16T01:26:03.767390" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:03.752550" elapsed="0.014887"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:03.771401" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:03.775268" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:03.779027" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:03.779237" elapsed="0.000020"/>
</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-10-16T01:26:03.779416" elapsed="0.000019"/>
</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-10-16T01:26:03.779772" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:03.779615" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:03.779602" elapsed="0.000245"/>
</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-10-16T01:26:03.780010" 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-10-16T01:26:03.780187" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:03.780346" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:03.779575" elapsed="0.000820"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:03.779485" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:03.780568" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:03.780636" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:03.780754" 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-10-16T01:26:03.751601" elapsed="0.029177"/>
</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-10-16T01:26:03.781880" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:03.781670" elapsed="0.000282">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:03.782035" 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-10-16T01:26:03.781350" elapsed="0.000708"/>
</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-10-16T01:26:03.782333" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:03.782119" elapsed="0.000266"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:03.782860" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:03.782581" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:03.782408" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:03.782103" elapsed="0.000847"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:03.783439" 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-10-16T01:26:03.783106" elapsed="0.000358"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:03.783508" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:26:03.783629" 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-manganese/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-10-16T01:26:03.781054" elapsed="0.002598"/>
</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-10-16T01:26:03.784754" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:03.784541" elapsed="0.000272">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:03.784896" 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-10-16T01:26:03.784225" elapsed="0.000722"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:03.785271" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:26:03.785169" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:03.784995" elapsed="0.000353"/>
</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-10-16T01:26:03.785496" elapsed="0.000020"/>
</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-10-16T01:26:03.785725" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:03.785789" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:03.785926" 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-manganese/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-10-16T01:26:03.783929" elapsed="0.002021"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:03.787162" 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-10-16T01:26:03.786939" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:03.787603" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:03.787388" elapsed="0.000254"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:26:03.791940" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:03.791993" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:03.792091" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:03.787950" elapsed="0.004493">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:03.787717" elapsed="0.004804">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:03.792715" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:03.792552" elapsed="0.000224"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:03.787686" elapsed="0.005111">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:03.793149" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:03.793269" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:03.793236" elapsed="0.000075"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:03.793219" 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-10-16T01:26:03.793467" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:03.793530" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:26:03.786225" elapsed="0.007406">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:03.793713" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:26:03.741398" elapsed="0.052443">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:03.794241" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:03.794022" elapsed="0.000302"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:03.793974" elapsed="0.000389"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:03.794447" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:26:03.739084" elapsed="0.055560">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:03.735519" elapsed="0.059249">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:03.735477" elapsed="0.059366">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:03.795104" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:03.795453" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:03.795781" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:03.796167" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:03.796591" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:03.796952" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:03.797301" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:03.797546" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:26:03.727443" elapsed="0.070203">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:03.797746" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:03.725575" elapsed="0.072263">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:03.798072" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:03.797932" elapsed="0.000190"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:03.798278" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:03.798144" elapsed="0.000184"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:03.798489" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:03.798349" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:03.797903" elapsed="0.000653"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:03.725252" elapsed="0.073341">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:03.724859" elapsed="0.073787">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:03.798694" elapsed="0.000036"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:03.716693" elapsed="0.082116">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:03.798998" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:03.799217" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:03.799076" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:03.799061" elapsed="0.000224"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:03.799450" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:03.799619" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:03.799677" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:03.715155" elapsed="0.084728">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:03.714659" elapsed="0.085311">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:03.714418" elapsed="0.085602">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:03.713629" elapsed="0.086473">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:03.800313" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:03.691186" elapsed="0.109231">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:04.823006" elapsed="0.000414"/>
</kw>
<msg time="2026-10-16T01:26:04.823537" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:04.821503" elapsed="0.002152"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:04.820498" elapsed="0.003353"/>
</kw>
<msg time="2026-10-16T01:26:04.823971" 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-10-16T01:26:04.813870" elapsed="0.010197"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:04.812957" elapsed="0.011259"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:04.825283" 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-10-16T01:26:04.824727" elapsed="0.000650"/>
</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-10-16T01:26:04.832062" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:04.831249" elapsed="0.000873"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:04.833134" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:04.832456" elapsed="0.000734"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:04.833287" elapsed="0.000065"/>
</return>
<msg time="2026-10-16T01:26:04.833577" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:04.830401" elapsed="0.003230"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:04.834020" elapsed="0.000293"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:04.835422" 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-10-16T01:26:04.834680" elapsed="0.000798"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:04.836384" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:04.835840" elapsed="0.000598"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:04.837426" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:04.836778" elapsed="0.000703"/>
</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-10-16T01:26:04.845563" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:04.844682" elapsed="0.000951"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:04.845746" elapsed="0.000090"/>
</return>
<msg time="2026-10-16T01:26:04.846132" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:04.841623" elapsed="0.004591"/>
</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-10-16T01:26:04.868733" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:04.868285" elapsed="0.000486"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:04.869757" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:04.869445" elapsed="0.000410">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:04.869996" 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-10-16T01:26:04.869003" elapsed="0.001025"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:04.870583" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:04.870263" elapsed="0.000346"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:04.870922" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:04.871077" 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-10-16T01:26:04.870787" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:04.871518" 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-10-16T01:26:04.871294" elapsed="0.000266"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:04.872504" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:04.872257" elapsed="0.000288"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:04.873162" 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-10-16T01:26:04.872737" elapsed="0.000471"/>
</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-10-16T01:26:04.873503" 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-10-16T01:26:04.873688" elapsed="0.000056"/>
</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-10-16T01:26:04.873920" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:04.873371" elapsed="0.000602"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:04.873255" elapsed="0.000747"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:04.874044" elapsed="0.000029"/>
</return>
<msg time="2026-10-16T01:26:04.874178" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:04.871903" elapsed="0.002298"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:04.871625" elapsed="0.002605"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:04.874404" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:04.874259" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:04.871607" elapsed="0.002869"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:04.875091" 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-10-16T01:26:04.874631" elapsed="0.000486"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:04.875162" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:04.867555" elapsed="0.007707"/>
</kw>
<msg time="2026-10-16T01:26:04.875366" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:04.861928" elapsed="0.013488"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:04.879428" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:04.883291" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:04.887328" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:04.887516" elapsed="0.000020"/>
</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-10-16T01:26:04.887695" 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-10-16T01:26:04.888074" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:04.887930" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:04.887902" 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-10-16T01:26:04.888299" elapsed="0.000019"/>
</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-10-16T01:26:04.888473" elapsed="0.000018"/>
</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-10-16T01:26:04.888633" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:04.887874" elapsed="0.000806"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:04.887781" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:04.888879" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:04.888964" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:26:04.889078" 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-10-16T01:26:04.861047" elapsed="0.028055"/>
</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-10-16T01:26:04.890275" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:04.890055" elapsed="0.000289">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:04.890473" 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-10-16T01:26:04.889676" elapsed="0.000820"/>
</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-10-16T01:26:04.890800" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:04.890561" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:04.891332" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:04.891064" elapsed="0.000294"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:04.890878" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:04.890544" elapsed="0.000867"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:04.891958" 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-10-16T01:26:04.891571" elapsed="0.000412"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:04.892030" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:26:04.892155" 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-manganese/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-10-16T01:26:04.889369" elapsed="0.002810"/>
</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-10-16T01:26:04.893297" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:04.893092" elapsed="0.000264">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:04.893440" 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-10-16T01:26:04.892760" elapsed="0.000703"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:04.893625" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:26:04.893527" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:04.893510" elapsed="0.000209"/>
</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-10-16T01:26:04.893870" elapsed="0.000019"/>
</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-10-16T01:26:04.894055" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:04.894114" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:04.894238" 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-manganese/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-10-16T01:26:04.892424" elapsed="0.001838"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:04.895677" 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-10-16T01:26:04.895450" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:04.896157" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:04.895936" elapsed="0.000262"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:26:04.901323" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:04.901377" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:04.901488" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:04.896485" elapsed="0.005388">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:04.896263" elapsed="0.005707">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:04.902152" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:04.902001" elapsed="0.000248"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:04.896243" elapsed="0.006031">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:04.902615" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:04.902767" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:04.902730" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:04.902686" elapsed="0.000141"/>
</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-10-16T01:26:04.902973" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:04.903048" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:26:04.894536" elapsed="0.008613">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:04.903218" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:26:04.851352" elapsed="0.052012">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:04.903779" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:04.903533" elapsed="0.000331"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:04.903485" elapsed="0.000432"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:04.904007" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:26:04.849130" elapsed="0.055045">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:04.846544" elapsed="0.057733">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:04.846516" elapsed="0.057834">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:04.904602" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:04.905004" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:04.905320" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:04.905668" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:04.906137" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:04.906448" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:04.906828" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:04.907079" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:26:04.840274" elapsed="0.066909">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:04.907246" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:04.838362" elapsed="0.068975">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:04.907595" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:04.907452" elapsed="0.000193"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:04.907829" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:04.907668" elapsed="0.000212"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:04.908059" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:04.907902" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:04.907436" elapsed="0.000692"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:04.838025" elapsed="0.070142">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:04.837578" elapsed="0.070643">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:04.908271" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:04.829031" elapsed="0.079333">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:04.908542" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:04.908847" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:04.908621" elapsed="0.000276"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:04.908606" elapsed="0.000325"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:04.909060" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:04.909228" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:04.909287" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:04.827389" elapsed="0.081992">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:04.826934" elapsed="0.082510">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:04.826633" elapsed="0.082860">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:04.825858" elapsed="0.083717">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:04.909862" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:04.801324" elapsed="0.108658">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:05.929395" elapsed="0.000451"/>
</kw>
<msg time="2026-10-16T01:26:05.929989" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:05.928099" elapsed="0.002015"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:05.927019" elapsed="0.003256"/>
</kw>
<msg time="2026-10-16T01:26:05.930478" 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-10-16T01:26:05.920347" elapsed="0.010225"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:05.919465" elapsed="0.011291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:05.931817" 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-10-16T01:26:05.931267" elapsed="0.000665"/>
</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-10-16T01:26:05.938489" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:05.937729" elapsed="0.000819"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:05.939537" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:05.938934" elapsed="0.000657"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:05.939689" elapsed="0.000095"/>
</return>
<msg time="2026-10-16T01:26:05.940042" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:05.936922" elapsed="0.003172"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:05.940420" elapsed="0.000315"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:05.941818" 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-10-16T01:26:05.941123" elapsed="0.000750"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:05.942758" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:05.942226" elapsed="0.000590"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:05.943646" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:05.943147" elapsed="0.000579"/>
</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-10-16T01:26:05.952451" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:05.951072" elapsed="0.001486"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:05.952689" elapsed="0.000184"/>
</return>
<msg time="2026-10-16T01:26:05.953348" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:05.947786" elapsed="0.005688"/>
</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-10-16T01:26:05.977551" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:05.977124" elapsed="0.000463"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:05.978597" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:05.978293" elapsed="0.000456">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:05.978869" 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-10-16T01:26:05.977825" elapsed="0.001103"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:05.979597" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:05.979167" elapsed="0.000465"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:05.980061" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:05.980424" 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-10-16T01:26:05.979881" elapsed="0.000578"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:05.981152" 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-10-16T01:26:05.980750" elapsed="0.000460"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:05.982668" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:05.982167" elapsed="0.000581"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:05.983396" 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-10-16T01:26:05.983031" elapsed="0.000399"/>
</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-10-16T01:26:05.983848" elapsed="0.000030"/>
</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-10-16T01:26:05.984128" 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-10-16T01:26:05.984379" elapsed="0.000027"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:05.983646" elapsed="0.000805"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:05.983491" elapsed="0.001002"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:05.984550" elapsed="0.000037"/>
</return>
<msg time="2026-10-16T01:26:05.984754" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:05.981655" elapsed="0.003132"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:05.981297" elapsed="0.003531"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:05.985082" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:05.984865" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:05.981272" elapsed="0.003908"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:05.985978" 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-10-16T01:26:05.985395" elapsed="0.000618"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:05.986134" elapsed="0.000038"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:05.976395" elapsed="0.009881"/>
</kw>
<msg time="2026-10-16T01:26:05.986343" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:05.970743" elapsed="0.015665"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:05.991766" elapsed="0.000035"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:05.997177" elapsed="0.000036"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:06.002607" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:06.002871" elapsed="0.000045"/>
</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-10-16T01:26:06.003138" 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-10-16T01:26:06.003679" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:06.003423" elapsed="0.000352"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:06.003404" elapsed="0.000404"/>
</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-10-16T01:26:06.004040" elapsed="0.000028"/>
</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-10-16T01:26:06.004305" elapsed="0.000026"/>
</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-10-16T01:26:06.004526" elapsed="0.000026"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:06.003367" elapsed="0.001227"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:06.003235" elapsed="0.001392"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:06.004857" elapsed="0.000029"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:06.004973" elapsed="0.000021"/>
</return>
<msg time="2026-10-16T01:26:06.005122" 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-10-16T01:26:05.969869" elapsed="0.035286"/>
</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-10-16T01:26:06.006818" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:06.006425" elapsed="0.000497">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:06.007042" 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-10-16T01:26:06.005974" elapsed="0.001100"/>
</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-10-16T01:26:06.007461" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:06.007161" elapsed="0.000372"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:06.008200" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:06.007812" elapsed="0.000422"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:06.007565" elapsed="0.000713"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:06.007138" elapsed="0.001168"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:06.009038" 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-10-16T01:26:06.008522" elapsed="0.000550"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:06.009134" elapsed="0.000037"/>
</return>
<msg time="2026-10-16T01:26:06.009306" 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-manganese/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-10-16T01:26:06.005521" elapsed="0.003816"/>
</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-10-16T01:26:06.010857" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:06.010644" elapsed="0.000284">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:06.011012" 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-10-16T01:26:06.010136" elapsed="0.000899"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:06.011196" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:26:06.011098" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:06.011082" elapsed="0.000191"/>
</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-10-16T01:26:06.011421" elapsed="0.000020"/>
</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-10-16T01:26:06.011591" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:06.011651" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:06.011795" 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-manganese/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-10-16T01:26:06.009677" elapsed="0.002174"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:06.013297" 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-10-16T01:26:06.013052" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:06.013789" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:06.013549" 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-10-16T01:26:06.018273" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:06.018326" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:06.018423" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:06.014127" elapsed="0.004684">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:06.013890" elapsed="0.005001">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:06.019092" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:06.018941" elapsed="0.000209"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:06.013874" elapsed="0.005298">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:06.019518" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:06.019636" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:06.019604" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:06.019588" elapsed="0.000106"/>
</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-10-16T01:26:06.019848" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:06.019923" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:26:06.012313" elapsed="0.007713">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:06.020099" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:26:05.960006" elapsed="0.060222">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:06.020610" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:06.020394" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:06.020347" elapsed="0.000408"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:06.020839" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:26:05.957854" elapsed="0.063201">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:05.954149" elapsed="0.067039">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:05.954104" elapsed="0.067160">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:06.021518" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:06.021894" elapsed="0.000033"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:06.022217" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:06.022573" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:06.023056" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:06.023374" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:06.023751" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:06.024004" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:26:05.946424" elapsed="0.077682">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:06.024168" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:05.944554" elapsed="0.079703">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:06.024478" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:06.024337" elapsed="0.000191"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:06.024685" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:06.024551" elapsed="0.000207"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:06.024933" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:06.024780" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:06.024322" elapsed="0.000681"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:05.944220" elapsed="0.080821">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:05.943824" elapsed="0.081269">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:06.025142" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:05.935522" elapsed="0.089712">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:06.025407" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:06.025621" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:06.025484" elapsed="0.000183"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:06.025469" elapsed="0.000220"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:06.025946" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:06.026114" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:06.026172" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:05.933941" elapsed="0.092367">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:05.933435" elapsed="0.092937">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:05.933187" elapsed="0.093234">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:05.932383" elapsed="0.094121">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:06.026730" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:05.910804" elapsed="0.116032">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:07.045803" elapsed="0.000428"/>
</kw>
<msg time="2026-10-16T01:26:07.046352" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:07.044520" elapsed="0.001955"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:07.043588" elapsed="0.003045"/>
</kw>
<msg time="2026-10-16T01:26:07.046757" 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-10-16T01:26:07.037106" elapsed="0.009744"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:07.036227" elapsed="0.010798"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:07.048251" 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-10-16T01:26:07.047507" elapsed="0.000839"/>
</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-10-16T01:26:07.055057" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:07.054270" elapsed="0.000845"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:07.056143" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:07.055467" elapsed="0.000730"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:07.056295" elapsed="0.000072"/>
</return>
<msg time="2026-10-16T01:26:07.056627" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:07.053438" elapsed="0.003248"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:07.057069" elapsed="0.000284"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:07.058427" 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-10-16T01:26:07.057739" elapsed="0.000742"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:07.059359" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:07.058839" elapsed="0.000572"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:07.060265" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:07.059744" elapsed="0.000573"/>
</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-10-16T01:26:07.069052" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:07.067595" elapsed="0.001665"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:07.069411" elapsed="0.000154"/>
</return>
<msg time="2026-10-16T01:26:07.070202" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:07.064336" elapsed="0.005991"/>
</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-10-16T01:26:07.094173" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:07.093728" elapsed="0.000482"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:07.095198" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:07.094888" elapsed="0.000411">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:07.095416" 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-10-16T01:26:07.094425" elapsed="0.001022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:07.096145" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:07.095678" elapsed="0.000502"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:07.096561" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:07.096780" 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-10-16T01:26:07.096404" elapsed="0.000410"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:07.097399" 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-10-16T01:26:07.097092" elapsed="0.000364"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:07.098943" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:07.098575" elapsed="0.000426"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:07.099597" 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-10-16T01:26:07.099242" elapsed="0.000390"/>
</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-10-16T01:26:07.100078" elapsed="0.000029"/>
</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-10-16T01:26:07.100332" 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-10-16T01:26:07.100579" elapsed="0.000027"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:07.099884" elapsed="0.000767"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:07.099692" elapsed="0.000999"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:07.100768" elapsed="0.000037"/>
</return>
<msg time="2026-10-16T01:26:07.100962" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:07.098111" elapsed="0.002884"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:07.097542" elapsed="0.003493"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:07.101286" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:07.101071" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:07.097517" elapsed="0.003890"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:07.102355" 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-10-16T01:26:07.101621" elapsed="0.000773"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:07.102457" elapsed="0.000037"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:07.092842" elapsed="0.009754"/>
</kw>
<msg time="2026-10-16T01:26:07.103573" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:07.087097" elapsed="0.016570"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:07.109133" elapsed="0.000035"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:07.114647" elapsed="0.000035"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:07.119946" elapsed="0.000036"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:07.120196" elapsed="0.000029"/>
</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-10-16T01:26:07.120446" elapsed="0.000027"/>
</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-10-16T01:26:07.120965" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:07.120749" elapsed="0.000288"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:07.120728" elapsed="0.000340"/>
</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-10-16T01:26:07.121278" elapsed="0.000026"/>
</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-10-16T01:26:07.121519" 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-10-16T01:26:07.121760" elapsed="0.000027"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:07.120669" elapsed="0.001160"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:07.120544" elapsed="0.001317"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:07.122086" elapsed="0.000026"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:07.122180" elapsed="0.000020"/>
</return>
<msg time="2026-10-16T01:26:07.122325" 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-10-16T01:26:07.086238" elapsed="0.036120"/>
</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-10-16T01:26:07.123951" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:07.123719" elapsed="0.000299">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:07.124100" 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-10-16T01:26:07.123183" elapsed="0.000940"/>
</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-10-16T01:26:07.124407" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:07.124187" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:07.125016" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:07.124721" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:07.124526" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:07.124170" elapsed="0.000924"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:07.125586" 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-10-16T01:26:07.125249" elapsed="0.000361"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:07.125655" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:26:07.125797" 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-manganese/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-10-16T01:26:07.122739" elapsed="0.003081"/>
</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-10-16T01:26:07.127028" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:07.126690" elapsed="0.000399">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:07.127172" 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-10-16T01:26:07.126369" elapsed="0.000826"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:07.127519" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:26:07.127416" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:07.127242" elapsed="0.000355"/>
</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-10-16T01:26:07.127762" 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-10-16T01:26:07.127954" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:07.128016" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:07.128140" 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-manganese/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-10-16T01:26:07.126075" elapsed="0.002088"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:07.129381" 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-10-16T01:26:07.129158" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:07.129836" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:07.129605" elapsed="0.000271"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:26:07.134805" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:07.134859" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:07.134974" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:07.130205" elapsed="0.005134">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:07.129984" elapsed="0.005433">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:07.135597" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:07.135448" elapsed="0.000207"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:07.129967" elapsed="0.005710">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:07.136043" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:07.136196" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:07.136163" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:07.136145" elapsed="0.000109"/>
</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-10-16T01:26:07.136392" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:07.136461" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:26:07.128435" elapsed="0.008128">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:07.136631" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:26:07.076348" elapsed="0.060440">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:07.137199" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:07.136978" elapsed="0.000304"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:07.136928" elapsed="0.000394"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:07.137407" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:26:07.074209" elapsed="0.063366">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:07.070939" elapsed="0.066737">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:07.070872" elapsed="0.066902">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:07.138040" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:07.138394" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:07.138730" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:07.139100" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:07.139535" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:07.139878" elapsed="0.000033"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:07.140244" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:07.140489" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:26:07.063008" elapsed="0.077582">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:07.140652" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:07.061161" elapsed="0.079621">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:07.141033" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:07.140864" elapsed="0.000220"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:07.141278" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:07.141106" elapsed="0.000222"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:07.141491" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:07.141350" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:07.140847" elapsed="0.000712"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:07.060811" elapsed="0.080786">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:07.060411" elapsed="0.081241">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:07.141722" elapsed="0.000016"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:07.052026" elapsed="0.089792">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:07.142011" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:07.142231" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:07.142090" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:07.142075" elapsed="0.000224"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:07.142423" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:07.142592" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:07.142650" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:07.050387" elapsed="0.092474">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:07.049930" elapsed="0.093063">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:07.049631" elapsed="0.093413">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:07.048829" elapsed="0.094299">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:07.143343" elapsed="0.000021"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:07.027614" elapsed="0.115836">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:08.165139" elapsed="0.000411"/>
</kw>
<msg time="2026-10-16T01:26:08.165671" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:08.163854" elapsed="0.001970"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:08.162930" elapsed="0.003085"/>
</kw>
<msg time="2026-10-16T01:26:08.166109" 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-10-16T01:26:08.156293" elapsed="0.009905"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:08.155404" elapsed="0.010940"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:08.167496" 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-10-16T01:26:08.166976" elapsed="0.000616"/>
</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-10-16T01:26:08.174288" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:08.173494" elapsed="0.000852"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:08.175337" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:08.174676" elapsed="0.000715"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:08.175486" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:26:08.175803" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:08.172666" elapsed="0.003190"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:08.176206" elapsed="0.000281"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:08.177573" 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-10-16T01:26:08.176885" elapsed="0.000745"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:08.178510" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:08.178013" elapsed="0.000550"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:08.179416" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:08.178922" elapsed="0.000546"/>
</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-10-16T01:26:08.188078" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:08.186647" elapsed="0.001542"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:08.188318" elapsed="0.000151"/>
</return>
<msg time="2026-10-16T01:26:08.188904" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:08.183438" elapsed="0.005548"/>
</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-10-16T01:26:08.211917" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:08.211445" elapsed="0.000509"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:08.212940" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:08.212606" elapsed="0.000436">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:08.213159" 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-10-16T01:26:08.212168" elapsed="0.001022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:08.213872" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:08.213422" elapsed="0.000505"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:08.214314" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:08.214509" 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-10-16T01:26:08.214155" elapsed="0.000387"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:08.215161" 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-10-16T01:26:08.214833" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:08.216499" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:08.216177" elapsed="0.000379"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:08.217553" 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-10-16T01:26:08.216820" elapsed="0.000768"/>
</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-10-16T01:26:08.218027" elapsed="0.000030"/>
</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-10-16T01:26:08.218283" 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-10-16T01:26:08.218534" elapsed="0.000028"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:08.217825" elapsed="0.000783"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:08.217648" elapsed="0.001000"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:08.218726" elapsed="0.000038"/>
</return>
<msg time="2026-10-16T01:26:08.218927" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:08.215649" elapsed="0.003311"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:08.215304" elapsed="0.003698"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:08.219238" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:08.219037" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:08.215281" elapsed="0.004055"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:08.220132" 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-10-16T01:26:08.219549" elapsed="0.000619"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:08.220229" elapsed="0.000037"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:08.210729" elapsed="0.009638"/>
</kw>
<msg time="2026-10-16T01:26:08.220434" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:08.204778" elapsed="0.015720"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:08.225815" elapsed="0.000036"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:08.231237" elapsed="0.000035"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:08.236371" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:08.236547" elapsed="0.000019"/>
</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-10-16T01:26:08.236738" elapsed="0.000019"/>
</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-10-16T01:26:08.237095" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:08.236952" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:08.236939" elapsed="0.000229"/>
</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-10-16T01:26:08.237318" elapsed="0.000019"/>
</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-10-16T01:26:08.237493" elapsed="0.000018"/>
</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-10-16T01:26:08.237697" elapsed="0.000036"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:08.236912" elapsed="0.000852"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:08.236806" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:08.237951" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:08.238021" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:08.238126" 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-10-16T01:26:08.203882" elapsed="0.034268"/>
</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-10-16T01:26:08.239252" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:08.239054" elapsed="0.000258">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:08.239394" 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-10-16T01:26:08.238719" elapsed="0.000700"/>
</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-10-16T01:26:08.239714" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:08.239484" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:08.240229" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:08.239967" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:08.239791" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:08.239467" elapsed="0.000840"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:08.240822" 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-10-16T01:26:08.240464" elapsed="0.000382"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:08.240904" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:26:08.241030" 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-manganese/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-10-16T01:26:08.238408" elapsed="0.002645"/>
</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-10-16T01:26:08.242136" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:08.241938" elapsed="0.000257">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:08.242281" 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-10-16T01:26:08.241592" elapsed="0.000712"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:08.242469" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:26:08.242367" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:08.242351" elapsed="0.000194"/>
</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-10-16T01:26:08.242693" elapsed="0.000037"/>
</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-10-16T01:26:08.242882" elapsed="0.000040"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:08.242964" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:08.243087" 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-manganese/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-10-16T01:26:08.241293" elapsed="0.001817"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:08.244661" 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-10-16T01:26:08.244279" elapsed="0.000441"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:08.245181" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:08.244957" elapsed="0.000265"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:26:08.249416" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:08.249470" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:08.249580" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:08.245507" elapsed="0.004484">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:08.245283" elapsed="0.004789">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:08.250252" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:08.250102" elapsed="0.000210"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:08.245266" elapsed="0.005067">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:08.250669" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:08.250807" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:08.250774" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:08.250758" elapsed="0.000107"/>
</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-10-16T01:26:08.251012" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:08.251076" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:26:08.243379" elapsed="0.007800">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:08.251246" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:26:08.193932" elapsed="0.057437">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:08.251774" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:08.251534" elapsed="0.000326"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:08.251487" elapsed="0.000427"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:08.252000" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:26:08.191738" elapsed="0.060425">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:08.189270" elapsed="0.062993">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:08.189243" elapsed="0.063091">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:08.252578" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:08.252985" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:08.253300" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:08.253648" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:08.254120" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:08.254435" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:08.254819" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:08.255067" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:26:08.182150" elapsed="0.073017">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:08.255229" elapsed="0.000014"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:08.180310" elapsed="0.075006">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:08.255542" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:08.255396" elapsed="0.000196"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:08.255773" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:08.255614" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:08.256005" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:08.255846" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:08.255380" elapsed="0.000696"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:08.179983" elapsed="0.076131">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:08.179561" elapsed="0.076606">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:08.256216" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:08.171325" elapsed="0.084982">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:08.256482" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:08.256779" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:08.256560" elapsed="0.000270"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:08.256545" elapsed="0.000307"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:08.256992" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:08.257160" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:08.257219" elapsed="0.000015"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:08.169749" elapsed="0.087563">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:08.169272" elapsed="0.088102">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:08.169026" elapsed="0.088432">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:08.168216" elapsed="0.089325">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:08.257825" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:08.144281" elapsed="0.113665">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:09.276439" elapsed="0.000430"/>
</kw>
<msg time="2026-10-16T01:26:09.277023" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:09.275197" elapsed="0.001939"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:09.274266" elapsed="0.003027"/>
</kw>
<msg time="2026-10-16T01:26:09.277384" 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-10-16T01:26:09.267788" elapsed="0.009687"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:09.266949" elapsed="0.010673"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:09.278662" 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-10-16T01:26:09.278146" elapsed="0.000642"/>
</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-10-16T01:26:09.285475" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:09.284669" elapsed="0.000863"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:09.286536" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:09.285931" elapsed="0.000659"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:09.286680" elapsed="0.000094"/>
</return>
<msg time="2026-10-16T01:26:09.287023" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:09.283830" elapsed="0.003244"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:09.287405" elapsed="0.000284"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:09.288986" 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-10-16T01:26:09.288248" elapsed="0.000794"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:09.289928" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:09.289371" elapsed="0.000611"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:09.290822" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:09.290291" elapsed="0.000585"/>
</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-10-16T01:26:09.299424" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:09.298061" elapsed="0.001473"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:09.299662" elapsed="0.000212"/>
</return>
<msg time="2026-10-16T01:26:09.300324" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:09.294836" elapsed="0.005613"/>
</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-10-16T01:26:09.333180" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:09.332727" elapsed="0.000490"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:09.334221" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:09.333939" elapsed="0.000375">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:09.334443" 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-10-16T01:26:09.333437" elapsed="0.001044"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:09.335219" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:09.334771" elapsed="0.000483"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:09.335638" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:09.335851" 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-10-16T01:26:09.335481" elapsed="0.000418"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:09.336474" 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-10-16T01:26:09.336169" elapsed="0.000361"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:09.338013" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:09.337466" elapsed="0.000605"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:09.338768" 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-10-16T01:26:09.338316" elapsed="0.000495"/>
</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-10-16T01:26:09.339220" elapsed="0.000029"/>
</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-10-16T01:26:09.339474" 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-10-16T01:26:09.339748" elapsed="0.000029"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:09.339038" elapsed="0.000785"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:09.338871" elapsed="0.000991"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:09.339934" elapsed="0.000037"/>
</return>
<msg time="2026-10-16T01:26:09.340116" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:09.336997" elapsed="0.003152"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:09.336615" elapsed="0.003573"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:09.340433" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:09.340222" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:09.336591" elapsed="0.003962"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:09.341364" 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-10-16T01:26:09.340812" elapsed="0.000587"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:09.341461" elapsed="0.000037"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:09.332003" elapsed="0.009595"/>
</kw>
<msg time="2026-10-16T01:26:09.341663" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:09.326370" elapsed="0.015380"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:09.347176" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:09.352297" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:09.356101" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:09.356279" elapsed="0.000020"/>
</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-10-16T01:26:09.356455" elapsed="0.000019"/>
</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-10-16T01:26:09.356826" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:09.356668" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:09.356654" elapsed="0.000258"/>
</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-10-16T01:26:09.357066" elapsed="0.000019"/>
</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-10-16T01:26:09.357243" elapsed="0.000018"/>
</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-10-16T01:26:09.357402" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:09.356627" elapsed="0.000824"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:09.356524" elapsed="0.000950"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:09.357622" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:09.357689" elapsed="0.000029"/>
</return>
<msg time="2026-10-16T01:26:09.357811" 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-10-16T01:26:09.325437" elapsed="0.032398"/>
</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-10-16T01:26:09.358944" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:09.358740" elapsed="0.000264">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:09.359086" 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-10-16T01:26:09.358402" elapsed="0.000706"/>
</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-10-16T01:26:09.359388" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:09.359173" elapsed="0.000267"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:09.359914" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:09.359620" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:09.359463" elapsed="0.000509"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:09.359156" elapsed="0.000836"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:09.360481" 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-10-16T01:26:09.360147" elapsed="0.000390"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:09.360586" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:26:09.360727" 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-manganese/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-10-16T01:26:09.358108" elapsed="0.002643"/>
</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-10-16T01:26:09.361824" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:09.361619" elapsed="0.000276">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:09.361981" 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-10-16T01:26:09.361305" elapsed="0.000697"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:09.362166" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:26:09.362066" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:09.362049" elapsed="0.000193"/>
</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-10-16T01:26:09.362391" elapsed="0.000020"/>
</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-10-16T01:26:09.362562" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:09.362620" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:09.362761" 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-manganese/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-10-16T01:26:09.361009" elapsed="0.001775"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:09.364172" 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-10-16T01:26:09.363946" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:09.364613" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:09.364397" elapsed="0.000255"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:26:09.368745" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:09.368798" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:09.368905" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:09.364968" elapsed="0.004290">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:09.364733" elapsed="0.004602">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:09.369519" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:09.369365" elapsed="0.000211"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:09.364715" elapsed="0.004883">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:09.369965" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:09.370084" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:09.370052" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:09.370036" elapsed="0.000107"/>
</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-10-16T01:26:09.370276" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:09.370370" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:26:09.363233" elapsed="0.007243">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:09.370543" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:26:09.309251" elapsed="0.061416">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:09.371092" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:09.370858" elapsed="0.000315"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:09.370811" elapsed="0.000401"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:09.371294" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:26:09.305537" elapsed="0.065920">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:09.301228" elapsed="0.070330">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:09.301180" elapsed="0.070451">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:09.371903" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:09.372249" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:09.372558" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:09.372938" elapsed="0.000026"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:09.373364" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:09.373675" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:09.374052" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:09.374290" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:26:09.293487" elapsed="0.080903">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:09.374451" elapsed="0.000014"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:09.291686" elapsed="0.082853">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:09.374780" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:09.374617" elapsed="0.000215"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:09.375004" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:09.374855" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:09.375215" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:09.375076" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:09.374601" elapsed="0.000712"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:09.291360" elapsed="0.083995">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:09.290994" elapsed="0.084414">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:09.375456" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:09.282366" elapsed="0.093182">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:09.375853" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:09.376091" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:09.375949" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:09.375933" elapsed="0.000227"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:09.376285" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:09.376453" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:09.376510" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:09.280773" elapsed="0.095829">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:09.280305" elapsed="0.096360">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:09.280064" elapsed="0.096666">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:09.279279" elapsed="0.097536">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:09.377037" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:09.258549" elapsed="0.118593">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:10.396444" elapsed="0.000458"/>
</kw>
<msg time="2026-10-16T01:26:10.397020" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:10.395187" elapsed="0.001953"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:10.394251" elapsed="0.003043"/>
</kw>
<msg time="2026-10-16T01:26:10.397383" 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-10-16T01:26:10.387320" elapsed="0.010149"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:10.386439" elapsed="0.011176"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:10.398670" 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-10-16T01:26:10.398154" elapsed="0.000641"/>
</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-10-16T01:26:10.405529" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:10.404757" elapsed="0.000829"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:10.406581" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:10.405976" elapsed="0.000659"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:10.406762" elapsed="0.000065"/>
</return>
<msg time="2026-10-16T01:26:10.407085" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:10.403939" elapsed="0.003197"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:10.407469" elapsed="0.000463"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:10.409061" 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-10-16T01:26:10.408321" elapsed="0.000853"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:10.410091" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:10.409517" elapsed="0.000628"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:10.411070" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:10.410454" elapsed="0.000669"/>
</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-10-16T01:26:10.419468" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:10.418592" elapsed="0.001032"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:10.419734" elapsed="0.000088"/>
</return>
<msg time="2026-10-16T01:26:10.420119" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:10.415306" elapsed="0.004894"/>
</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-10-16T01:26:10.443101" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:10.442640" elapsed="0.000497"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:10.444145" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:10.443809" elapsed="0.000436">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:10.444362" 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-10-16T01:26:10.443352" elapsed="0.001042"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:10.445097" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:10.444628" elapsed="0.000505"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:10.445516" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:10.445723" 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-10-16T01:26:10.445359" elapsed="0.000398"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:10.446346" 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-10-16T01:26:10.446040" elapsed="0.000363"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:10.447852" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:10.447513" elapsed="0.000416"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:10.448528" 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-10-16T01:26:10.448173" elapsed="0.000389"/>
</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-10-16T01:26:10.448993" elapsed="0.000029"/>
</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-10-16T01:26:10.449246" 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-10-16T01:26:10.449551" elapsed="0.000028"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:10.448794" elapsed="0.000831"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:10.448621" elapsed="0.001045"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:10.449744" elapsed="0.000037"/>
</return>
<msg time="2026-10-16T01:26:10.449943" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:10.447043" elapsed="0.002933"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:10.446488" elapsed="0.003530"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:10.450255" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:10.450053" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:10.446463" elapsed="0.003891"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:10.451152" 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-10-16T01:26:10.450565" elapsed="0.000622"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:10.451249" elapsed="0.000036"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:10.441949" elapsed="0.009438"/>
</kw>
<msg time="2026-10-16T01:26:10.451452" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:10.436305" elapsed="0.015211"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:10.456612" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:10.460534" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:10.464309" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:10.464485" elapsed="0.000019"/>
</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-10-16T01:26:10.464660" 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-10-16T01:26:10.465028" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:10.464872" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:10.464859" elapsed="0.000243"/>
</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-10-16T01:26:10.465251" elapsed="0.000019"/>
</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-10-16T01:26:10.465426" elapsed="0.000018"/>
</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-10-16T01:26:10.465585" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:10.464833" elapsed="0.000800"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:10.464743" elapsed="0.000947"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:10.465861" elapsed="0.000045"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:10.465959" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:26:10.466063" 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-10-16T01:26:10.435446" elapsed="0.030640"/>
</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-10-16T01:26:10.467184" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:10.466991" elapsed="0.000252">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:10.467324" 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-10-16T01:26:10.466642" elapsed="0.000705"/>
</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-10-16T01:26:10.467625" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:10.467410" elapsed="0.000267"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:10.468153" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:10.467889" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:10.467715" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:10.467393" elapsed="0.000836"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:10.468737" 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-10-16T01:26:10.468385" elapsed="0.000377"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:10.468807" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:26:10.468951" 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-manganese/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-10-16T01:26:10.466348" elapsed="0.002627"/>
</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-10-16T01:26:10.470053" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:10.469849" elapsed="0.000262">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:10.470193" 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-10-16T01:26:10.469518" elapsed="0.000697"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:10.470532" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:26:10.470429" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:10.470262" elapsed="0.000347"/>
</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-10-16T01:26:10.470776" 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-10-16T01:26:10.470964" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:10.471024" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:26:10.471150" 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-manganese/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-10-16T01:26:10.469223" elapsed="0.001950"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:10.472406" 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-10-16T01:26:10.472184" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:10.472866" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:10.472632" 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-10-16T01:26:10.477221" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:10.477305" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:10.477406" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:10.473204" elapsed="0.004598">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:10.472984" elapsed="0.004930">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:10.478099" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:10.477949" elapsed="0.000208"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:10.472967" elapsed="0.005213">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:10.478522" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:10.478641" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:10.478608" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:10.478592" 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-10-16T01:26:10.478850" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:10.478925" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:26:10.471446" elapsed="0.007585">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:10.479097" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:26:10.425508" elapsed="0.053713">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:10.479603" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:10.479384" elapsed="0.000300"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:10.479338" elapsed="0.000411"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:10.479832" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:26:10.423201" elapsed="0.056816">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:10.420491" elapsed="0.059623">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:10.420463" elapsed="0.059725">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:10.480434" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:10.480799" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:10.481128" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:10.481480" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:10.481987" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:10.482298" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:10.482640" elapsed="0.000019"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:10.482914" elapsed="0.000024"/>
</return>
<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="FAIL" start="2026-10-16T01:26:10.413823" elapsed="0.069200">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:10.483086" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:10.411964" elapsed="0.071213">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:10.483401" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:10.483262" elapsed="0.000191"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:10.483611" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:10.483475" elapsed="0.000187"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:10.483849" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:10.483683" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:10.483246" elapsed="0.000687"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:10.411581" elapsed="0.072390">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:10.411217" elapsed="0.072807">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:10.484072" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:10.402410" elapsed="0.081752">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:10.484335" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:10.484551" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:10.484412" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:10.484397" elapsed="0.000222"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:10.484870" elapsed="0.000033"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:10.485054" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:10.485112" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:10.400819" elapsed="0.084384">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:10.400333" elapsed="0.084932">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:10.400090" elapsed="0.085225">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:10.399259" elapsed="0.086140">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:10.485642" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:10.378023" elapsed="0.107745">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:11.506428" elapsed="0.000472"/>
</kw>
<msg time="2026-10-16T01:26:11.507004" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:11.505203" elapsed="0.001906"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:11.504266" elapsed="0.002996"/>
</kw>
<msg time="2026-10-16T01:26:11.507353" 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-10-16T01:26:11.497729" elapsed="0.009713"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:11.496892" elapsed="0.010697"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:11.508614" 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-10-16T01:26:11.508101" elapsed="0.000636"/>
</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-10-16T01:26:11.515218" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:11.514429" elapsed="0.000847"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:11.516306" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:11.515611" elapsed="0.000753"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:11.516455" elapsed="0.000060"/>
</return>
<msg time="2026-10-16T01:26:11.516930" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:11.513604" elapsed="0.003382"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:11.517317" elapsed="0.000281"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:11.518682" 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-10-16T01:26:11.518014" elapsed="0.000757"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:11.519633" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:11.519125" elapsed="0.000561"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:11.520559" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:11.520058" elapsed="0.000555"/>
</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-10-16T01:26:11.529491" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:11.528072" elapsed="0.001528"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:11.529771" elapsed="0.000166"/>
</return>
<msg time="2026-10-16T01:26:11.530371" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:11.524577" elapsed="0.005928"/>
</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-10-16T01:26:11.559907" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:11.559442" elapsed="0.000504"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:11.561017" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:11.560684" elapsed="0.000431">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:11.561232" 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-10-16T01:26:11.560238" elapsed="0.001025"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:11.561985" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:11.561497" elapsed="0.000540"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:11.562444" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:11.562775" 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-10-16T01:26:11.562282" elapsed="0.000528"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:11.563410" 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-10-16T01:26:11.563100" elapsed="0.000369"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:11.564762" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:11.564421" elapsed="0.000398"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:11.565643" 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-10-16T01:26:11.565075" elapsed="0.000602"/>
</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-10-16T01:26:11.566127" elapsed="0.000028"/>
</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-10-16T01:26:11.566384" 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-10-16T01:26:11.566637" elapsed="0.000027"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:11.565944" elapsed="0.000785"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:11.565768" elapsed="0.001004"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:11.566828" elapsed="0.000039"/>
</return>
<msg time="2026-10-16T01:26:11.567035" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:11.563951" elapsed="0.003117"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:11.563559" elapsed="0.003549"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:11.567343" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:11.567142" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:11.563534" elapsed="0.003905"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:11.568236" 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-10-16T01:26:11.567654" elapsed="0.000618"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:11.568333" elapsed="0.000037"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:11.558722" elapsed="0.009749"/>
</kw>
<msg time="2026-10-16T01:26:11.568538" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:11.552931" elapsed="0.015671"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:11.574001" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:11.577772" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:11.581594" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:11.581785" elapsed="0.000020"/>
</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-10-16T01:26:11.581976" 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-10-16T01:26:11.582317" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:11.582176" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:11.582162" elapsed="0.000228"/>
</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-10-16T01:26:11.582540" elapsed="0.000019"/>
</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-10-16T01:26:11.582729" 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-10-16T01:26:11.582904" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:11.582136" elapsed="0.000818"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:11.582046" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:11.583126" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:11.583194" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:11.583298" 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-10-16T01:26:11.552066" elapsed="0.031256"/>
</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-10-16T01:26:11.584424" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:11.584232" elapsed="0.000252">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:11.584567" 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-10-16T01:26:11.583907" elapsed="0.000682"/>
</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-10-16T01:26:11.584899" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:11.584652" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:11.585404" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:11.585139" elapsed="0.000290"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:11.584975" elapsed="0.000487"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:11.584635" elapsed="0.000846"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:11.586009" 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-10-16T01:26:11.585639" elapsed="0.000394"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:11.586078" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:26:11.586202" 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-manganese/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-10-16T01:26:11.583584" elapsed="0.002640"/>
</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-10-16T01:26:11.587370" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:11.587180" elapsed="0.000249">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:11.587512" 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-10-16T01:26:11.586818" elapsed="0.000717"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:11.587712" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:26:11.587598" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:11.587582" elapsed="0.000209"/>
</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-10-16T01:26:11.587953" 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-10-16T01:26:11.588127" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:11.588187" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:11.588311" 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-manganese/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-10-16T01:26:11.586504" elapsed="0.001830"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:11.589743" 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-10-16T01:26:11.589499" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:11.590211" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:11.589989" elapsed="0.000262"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:26:11.594513" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:11.594566" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:11.594677" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:11.590534" elapsed="0.004548">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:11.590312" elapsed="0.004849">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:11.595342" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:11.595192" elapsed="0.000208"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:11.590295" elapsed="0.005127">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:11.595784" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:11.595922" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:11.595883" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:11.595855" 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-10-16T01:26:11.596115" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:11.596177" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:26:11.588608" elapsed="0.007673">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:11.596381" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:26:11.539041" elapsed="0.057479">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:11.596945" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:11.596686" elapsed="0.000343"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:11.596639" elapsed="0.000429"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:11.597151" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:26:11.535306" elapsed="0.062009">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:11.531310" elapsed="0.066105">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:11.531267" elapsed="0.066219">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:11.597759" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:11.598120" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:11.598428" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:11.598799" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:11.599255" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:11.599568" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:11.599955" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:11.600191" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:26:11.523275" elapsed="0.077019">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:11.600356" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:11.521463" elapsed="0.078983">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:11.600666" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:11.600527" elapsed="0.000213"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:11.600915" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:11.600763" elapsed="0.000205"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:11.601131" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:11.600989" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:11.600511" elapsed="0.000689"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:11.521137" elapsed="0.080101">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:11.520736" elapsed="0.080556">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:11.601342" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:11.512256" elapsed="0.089211">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:11.601650" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:11.601970" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:11.601816" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:11.601799" elapsed="0.000242"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:11.602167" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:11.602335" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:11.602393" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:11.510640" elapsed="0.091845">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:11.510213" elapsed="0.092336">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:11.509979" elapsed="0.092619">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:11.509200" elapsed="0.093481">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:11.602983" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:11.486341" elapsed="0.116749">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:12.621386" elapsed="0.000423"/>
</kw>
<msg time="2026-10-16T01:26:12.621933" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:12.620144" elapsed="0.001897"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:12.619207" elapsed="0.002988"/>
</kw>
<msg time="2026-10-16T01:26:12.622284" 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-10-16T01:26:12.612669" elapsed="0.009704"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:12.611834" elapsed="0.010686"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:12.623550" 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-10-16T01:26:12.623037" elapsed="0.000604"/>
</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-10-16T01:26:12.630412" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:12.629578" elapsed="0.000892"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:12.631470" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:12.630836" elapsed="0.000690"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:12.631747" elapsed="0.000067"/>
</return>
<msg time="2026-10-16T01:26:12.632078" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:12.628757" elapsed="0.003373"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:12.632459" elapsed="0.000324"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:12.633920" 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-10-16T01:26:12.633176" elapsed="0.000804"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:12.634858" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:12.634313" elapsed="0.000625"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:12.635783" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:12.635250" elapsed="0.000588"/>
</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-10-16T01:26:12.644958" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:12.643488" elapsed="0.001587"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:12.645204" elapsed="0.000135"/>
</return>
<msg time="2026-10-16T01:26:12.646027" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:12.640004" elapsed="0.006155"/>
</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-10-16T01:26:12.672838" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:12.672393" elapsed="0.000615"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:12.673999" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:12.673662" elapsed="0.000425">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:12.674205" 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-10-16T01:26:12.673225" elapsed="0.001011"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:12.674942" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:12.674471" elapsed="0.000507"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:12.675360" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:12.675598" 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-10-16T01:26:12.675205" elapsed="0.000427"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:12.676255" 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-10-16T01:26:12.675942" elapsed="0.000370"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:12.677775" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:12.677254" elapsed="0.000579"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:12.678453" 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-10-16T01:26:12.678096" elapsed="0.000391"/>
</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-10-16T01:26:12.678914" elapsed="0.000030"/>
</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-10-16T01:26:12.679169" 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-10-16T01:26:12.679418" elapsed="0.000027"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:12.678697" elapsed="0.000792"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:12.678546" elapsed="0.000981"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:12.679583" elapsed="0.000035"/>
</return>
<msg time="2026-10-16T01:26:12.679834" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:12.676765" elapsed="0.003139"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:12.676398" elapsed="0.003550"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:12.680184" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:12.679982" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:12.676374" elapsed="0.003907"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:12.681071" 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-10-16T01:26:12.680496" elapsed="0.000610"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:12.681169" elapsed="0.000037"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:12.671668" elapsed="0.009639"/>
</kw>
<msg time="2026-10-16T01:26:12.681373" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:12.665948" elapsed="0.015488"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:12.685513" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:12.689306" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:12.693223" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:12.693400" elapsed="0.000019"/>
</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-10-16T01:26:12.693576" 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-10-16T01:26:12.693943" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:12.693789" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:12.693776" 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-10-16T01:26:12.694167" elapsed="0.000019"/>
</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-10-16T01:26:12.694341" elapsed="0.000018"/>
</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-10-16T01:26:12.694497" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:12.693748" elapsed="0.000798"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:12.693644" elapsed="0.000926"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:12.694733" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:12.694802" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:26:12.694920" 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-10-16T01:26:12.665066" elapsed="0.029878"/>
</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-10-16T01:26:12.696098" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:12.695905" elapsed="0.000252">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:12.696241" 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-10-16T01:26:12.695538" elapsed="0.000725"/>
</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-10-16T01:26:12.696544" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:12.696327" elapsed="0.000269"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:12.697073" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:12.696793" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:12.696619" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:12.696310" elapsed="0.000839"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:12.697641" 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-10-16T01:26:12.697307" elapsed="0.000358"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:12.697727" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:26:12.697853" 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-manganese/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-10-16T01:26:12.695239" elapsed="0.002650"/>
</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-10-16T01:26:12.698973" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:12.698767" elapsed="0.000265">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:12.699115" 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-10-16T01:26:12.698430" elapsed="0.000708"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:12.699299" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:26:12.699202" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:12.699185" elapsed="0.000189"/>
</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-10-16T01:26:12.699522" elapsed="0.000020"/>
</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-10-16T01:26:12.699692" elapsed="0.000037"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:12.699770" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:26:12.699907" 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-manganese/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-10-16T01:26:12.698134" elapsed="0.001797"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:12.701315" 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-10-16T01:26:12.701091" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:12.701776" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:12.701543" elapsed="0.000274"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:26:12.705800" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:12.705853" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:12.705992" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:12.702132" elapsed="0.004194">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:12.701907" elapsed="0.004494">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:12.706581" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:12.706432" elapsed="0.000211"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:12.701860" elapsed="0.004805">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:12.707045" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:12.707168" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:12.707135" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:12.707118" elapsed="0.000110"/>
</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-10-16T01:26:12.707363" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:12.707426" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:26:12.700369" elapsed="0.007158">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:12.707595" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:26:12.654354" elapsed="0.053392">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:12.708147" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:12.707931" elapsed="0.000298"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:12.707882" elapsed="0.000387"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:12.708351" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:26:12.650661" elapsed="0.057852">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:12.646624" elapsed="0.061987">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:12.646576" elapsed="0.062107">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:12.708961" elapsed="0.000025"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:12.709304" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:12.709609" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:12.709985" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:12.710404" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:12.710735" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:12.711102" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:12.711369" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:26:12.638607" elapsed="0.072866">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:12.711536" elapsed="0.000014"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:12.636658" elapsed="0.074967">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:12.711880" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:12.711724" elapsed="0.000209"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:12.712091" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:12.711955" elapsed="0.000186"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:12.712304" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:12.712163" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:12.711690" elapsed="0.000683"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:12.636327" elapsed="0.076084">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:12.635956" elapsed="0.076509">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:12.712513" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:12.627376" elapsed="0.085230">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:12.712807" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:12.713063" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:12.712921" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:12.712904" elapsed="0.000228"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:12.713256" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:12.713422" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:12.713480" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:12.625777" elapsed="0.087797">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:12.625308" elapsed="0.088329">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:12.625069" elapsed="0.088616">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:12.624140" elapsed="0.089777">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:12.714125" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:12.603677" elapsed="0.110552">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:13.732972" elapsed="0.000400"/>
</kw>
<msg time="2026-10-16T01:26:13.733482" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:13.731553" elapsed="0.002039"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:13.730625" elapsed="0.003155"/>
</kw>
<msg time="2026-10-16T01:26:13.733896" 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-10-16T01:26:13.724152" elapsed="0.009838"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:13.723273" elapsed="0.010866"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:13.735185" 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-10-16T01:26:13.734615" elapsed="0.000662"/>
</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-10-16T01:26:13.741847" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:13.741047" elapsed="0.000891"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:13.742970" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:13.742280" elapsed="0.000746"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:13.743120" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:26:13.743406" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:13.740218" elapsed="0.003237"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:13.743813" elapsed="0.000310"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:13.745332" 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-10-16T01:26:13.744599" elapsed="0.000789"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:13.746283" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:13.745748" elapsed="0.000589"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:13.747199" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:13.746644" elapsed="0.000608"/>
</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-10-16T01:26:13.756137" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:13.754539" elapsed="0.001707"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:13.756375" elapsed="0.000133"/>
</return>
<msg time="2026-10-16T01:26:13.757023" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:13.751342" elapsed="0.005807"/>
</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-10-16T01:26:13.786693" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:13.786271" elapsed="0.000479"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:13.787761" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:13.787452" elapsed="0.000452">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:13.788028" 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-10-16T01:26:13.787006" elapsed="0.001053"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:13.788823" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:13.788361" elapsed="0.000514"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:13.789265" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:13.789455" 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-10-16T01:26:13.789105" elapsed="0.000383"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:13.790101" 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-10-16T01:26:13.789773" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:13.791597" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:13.791274" elapsed="0.000381"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:13.792290" 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-10-16T01:26:13.791930" elapsed="0.000394"/>
</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-10-16T01:26:13.792734" elapsed="0.000029"/>
</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-10-16T01:26:13.793009" 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-10-16T01:26:13.793261" elapsed="0.000026"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:13.792535" elapsed="0.000798"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:13.792384" elapsed="0.000988"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:13.793429" elapsed="0.000036"/>
</return>
<msg time="2026-10-16T01:26:13.793609" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:13.790786" elapsed="0.002855"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:13.790245" elapsed="0.003436"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:13.793953" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:13.793737" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:13.790220" elapsed="0.003831"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:13.794816" 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-10-16T01:26:13.794263" elapsed="0.000590"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:13.794931" elapsed="0.000037"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:13.785548" elapsed="0.009521"/>
</kw>
<msg time="2026-10-16T01:26:13.795135" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:13.779980" elapsed="0.015220"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:13.800416" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:13.804188" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:13.807971" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:13.808183" elapsed="0.000020"/>
</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-10-16T01:26:13.808360" elapsed="0.000019"/>
</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-10-16T01:26:13.808714" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:13.808559" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:13.808545" elapsed="0.000245"/>
</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-10-16T01:26:13.808955" 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-10-16T01:26:13.809132" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:13.809292" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:13.808519" elapsed="0.000821"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:13.808429" elapsed="0.000934"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:13.809511" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:13.809580" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:13.809682" 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-10-16T01:26:13.779119" elapsed="0.030602"/>
</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-10-16T01:26:13.810846" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:13.810639" elapsed="0.000283">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:13.811005" 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-10-16T01:26:13.810315" elapsed="0.000712"/>
</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-10-16T01:26:13.811304" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:13.811090" elapsed="0.000266"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:13.811814" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:13.811538" elapsed="0.000300"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:13.811379" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:13.811073" elapsed="0.000832"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:13.812398" 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-10-16T01:26:13.812064" elapsed="0.000358"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:13.812467" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:26:13.812589" 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-manganese/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-10-16T01:26:13.810018" elapsed="0.002593"/>
</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-10-16T01:26:13.813732" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:13.813525" elapsed="0.000267">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:13.813894" 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-10-16T01:26:13.813206" elapsed="0.000716"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:13.814288" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:26:13.814182" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:13.814013" elapsed="0.000353"/>
</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-10-16T01:26:13.814515" elapsed="0.000020"/>
</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-10-16T01:26:13.814686" elapsed="0.000036"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:13.814766" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:13.814910" 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-manganese/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-10-16T01:26:13.812894" elapsed="0.002041"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:13.816168" 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-10-16T01:26:13.815944" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:13.816620" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:13.816404" elapsed="0.000256"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:26:13.820560" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:13.820614" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:13.820731" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:13.816977" elapsed="0.004159">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:13.816741" elapsed="0.004475">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:13.821394" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:13.821246" elapsed="0.000205"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:13.816724" elapsed="0.004749">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:13.821823" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:13.821960" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:13.821928" elapsed="0.000069"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:13.821909" elapsed="0.000108"/>
</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-10-16T01:26:13.822153" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:13.822216" elapsed="0.000013"/>
</return>
<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="FAIL" start="2026-10-16T01:26:13.815222" elapsed="0.007096">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:13.822385" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:26:13.765307" elapsed="0.057202">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:13.822935" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:13.822679" elapsed="0.000370"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:13.822627" elapsed="0.000462"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:13.823171" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:26:13.761747" elapsed="0.061588">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:13.757604" elapsed="0.065830">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:13.757562" elapsed="0.065944">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:13.823768" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:13.824130" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:13.824443" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:13.824813" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:13.825258" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:13.825572" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:13.825956" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:13.826197" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:26:13.750045" elapsed="0.076252">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:13.826358" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:13.748098" elapsed="0.078348">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:13.826665" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:13.826526" elapsed="0.000212"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:13.826909" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:13.826761" elapsed="0.000200"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:13.827122" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:13.826982" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:13.826511" elapsed="0.000678"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:13.747744" elapsed="0.079483">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:13.747347" elapsed="0.079931">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:13.827325" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:13.738851" elapsed="0.088564">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:13.827587" elapsed="0.000051"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:13.827990" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:13.827833" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:13.827687" elapsed="0.000374"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:13.828185" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:13.828350" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:13.828408" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:13.737258" elapsed="0.091241">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:13.736790" elapsed="0.091771">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:13.736515" elapsed="0.092095">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:13.735750" elapsed="0.092941">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:13.828931" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:13.714966" elapsed="0.114069">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:14.850040" elapsed="0.000392"/>
</kw>
<msg time="2026-10-16T01:26:14.850534" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:14.848633" elapsed="0.002005"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:14.847728" elapsed="0.003102"/>
</kw>
<msg time="2026-10-16T01:26:14.850949" 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-10-16T01:26:14.841123" elapsed="0.009917"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:14.840260" elapsed="0.010926"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:14.852242" 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-10-16T01:26:14.851645" elapsed="0.000689"/>
</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-10-16T01:26:14.859142" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:14.858345" elapsed="0.000856"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:14.860196" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:14.859534" elapsed="0.000716"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:14.860343" elapsed="0.000059"/>
</return>
<msg time="2026-10-16T01:26:14.860622" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:14.857283" elapsed="0.003390"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:14.861055" elapsed="0.000284"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:14.862515" 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-10-16T01:26:14.861731" elapsed="0.000840"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:14.863462" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:14.862953" elapsed="0.000562"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:14.864377" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:14.863873" elapsed="0.000556"/>
</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-10-16T01:26:14.873191" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:14.871801" elapsed="0.001497"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:14.873425" elapsed="0.000133"/>
</return>
<msg time="2026-10-16T01:26:14.874241" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:14.868408" elapsed="0.005963"/>
</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-10-16T01:26:14.898992" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:14.898524" elapsed="0.000505"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:14.899984" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:14.899685" elapsed="0.000385">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:14.900186" 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-10-16T01:26:14.899245" elapsed="0.000972"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:14.900924" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:14.900450" elapsed="0.000510"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:14.901336" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:14.901508" 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-10-16T01:26:14.901183" elapsed="0.000358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:14.902147" 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-10-16T01:26:14.901824" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:14.903453" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:14.903135" elapsed="0.000374"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:14.904331" 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-10-16T01:26:14.903768" elapsed="0.000598"/>
</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-10-16T01:26:14.904780" elapsed="0.000029"/>
</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-10-16T01:26:14.905052" 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-10-16T01:26:14.905299" elapsed="0.000027"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:14.904580" elapsed="0.000790"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:14.904428" elapsed="0.000979"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:14.905462" elapsed="0.000036"/>
</return>
<msg time="2026-10-16T01:26:14.905660" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:14.902628" elapsed="0.003095"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:14.902289" elapsed="0.003486"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:14.906045" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:14.905815" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:14.902266" elapsed="0.003849"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:14.906642" 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-10-16T01:26:14.906265" elapsed="0.000451"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:14.906763" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:14.897809" elapsed="0.009069"/>
</kw>
<msg time="2026-10-16T01:26:14.906926" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:14.892160" elapsed="0.014812"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:14.910780" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:14.914584" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:14.918393" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:14.918571" elapsed="0.000020"/>
</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-10-16T01:26:14.918763" 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-10-16T01:26:14.919116" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:14.918975" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:14.918961" elapsed="0.000227"/>
</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-10-16T01:26:14.919339" elapsed="0.000019"/>
</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-10-16T01:26:14.919514" elapsed="0.000018"/>
</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-10-16T01:26:14.919678" elapsed="0.000032"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:14.918935" elapsed="0.000807"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:14.918831" elapsed="0.000935"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:14.919928" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:14.919998" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:14.920102" 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-10-16T01:26:14.891298" elapsed="0.028828"/>
</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-10-16T01:26:14.921263" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:14.921071" elapsed="0.000252">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:14.921405" 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-10-16T01:26:14.920732" elapsed="0.000696"/>
</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-10-16T01:26:14.921720" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:14.921491" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:14.922233" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:14.921968" elapsed="0.000290"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:14.921797" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:14.921474" elapsed="0.000837"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:14.922826" 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-10-16T01:26:14.922467" elapsed="0.000384"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:14.922910" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:26:14.923034" 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-manganese/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-10-16T01:26:14.920382" elapsed="0.002675"/>
</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-10-16T01:26:14.924132" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:14.923941" elapsed="0.000251">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:14.924275" 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-10-16T01:26:14.923595" elapsed="0.000702"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:14.924458" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:26:14.924361" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:14.924344" elapsed="0.000190"/>
</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-10-16T01:26:14.924684" elapsed="0.000036"/>
</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-10-16T01:26:14.924891" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:14.924952" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:14.925077" 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-manganese/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-10-16T01:26:14.923298" elapsed="0.001802"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:14.926494" 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-10-16T01:26:14.926266" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:14.926976" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:14.926740" elapsed="0.000277"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:26:14.930802" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:14.930853" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:14.930979" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:14.927298" elapsed="0.004005">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:14.927077" elapsed="0.004333">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:14.931592" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:14.931443" elapsed="0.000208"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:14.927060" elapsed="0.004612">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:14.932031" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:14.932151" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:14.932119" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:14.932102" elapsed="0.000107"/>
</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-10-16T01:26:14.932343" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:14.932405" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:26:14.925367" elapsed="0.007137">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:14.932571" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:26:14.881329" elapsed="0.051368">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:14.933254" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:14.933037" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:14.932843" elapsed="0.000532"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:14.933457" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:26:14.878736" elapsed="0.054884">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:14.874879" elapsed="0.058855">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:14.874813" elapsed="0.058995">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:14.934067" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:14.934405" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:14.934740" elapsed="0.000022"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:14.935101" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:14.935519" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:14.935842" elapsed="0.000034"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:14.936205" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:14.936439" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:26:14.867105" elapsed="0.069434">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:14.936635" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:14.865275" elapsed="0.071476">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:14.936990" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:14.936834" elapsed="0.000207"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:14.937200" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:14.937063" elapsed="0.000186"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:14.937411" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:14.937271" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:14.936818" elapsed="0.000661"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:14.864946" elapsed="0.072571">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:14.864523" elapsed="0.073047">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:14.937618" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:14.855879" elapsed="0.081904">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:14.937981" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:14.938198" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:14.938060" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:14.938045" elapsed="0.000222"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:14.938393" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:14.938559" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:14.938617" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:14.854266" elapsed="0.084524">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:14.853809" elapsed="0.085060">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:14.853547" elapsed="0.085373">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:14.852803" elapsed="0.086199">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:14.939209" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:14.829610" elapsed="0.109703">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:15.958278" elapsed="0.000401"/>
</kw>
<msg time="2026-10-16T01:26:15.958832" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:15.956733" elapsed="0.002334"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:15.955777" elapsed="0.003456"/>
</kw>
<msg time="2026-10-16T01:26:15.959323" 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-10-16T01:26:15.949216" elapsed="0.010196"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:15.948348" elapsed="0.011211"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:15.960660" 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-10-16T01:26:15.960141" elapsed="0.000654"/>
</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-10-16T01:26:15.967583" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:15.966832" elapsed="0.000809"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:15.968643" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:15.968037" elapsed="0.000690"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:15.968827" elapsed="0.000083"/>
</return>
<msg time="2026-10-16T01:26:15.969140" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:15.966015" elapsed="0.003175"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:15.969519" elapsed="0.000316"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:15.970943" 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-10-16T01:26:15.970221" elapsed="0.000780"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:15.971893" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:15.971330" elapsed="0.000618"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:15.972792" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:15.972259" elapsed="0.000587"/>
</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-10-16T01:26:15.981556" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:15.980205" elapsed="0.001459"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:15.981890" elapsed="0.000137"/>
</return>
<msg time="2026-10-16T01:26:15.982457" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:15.976878" elapsed="0.005704"/>
</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-10-16T01:26:16.008327" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:16.007892" elapsed="0.000471"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:16.009326" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:16.009057" elapsed="0.000359">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:16.009534" 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-10-16T01:26:16.008578" elapsed="0.000987"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:16.010267" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:16.009819" elapsed="0.000483"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:16.010682" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:16.010944" 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-10-16T01:26:16.010527" elapsed="0.000452"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:16.011555" 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-10-16T01:26:16.011244" elapsed="0.000368"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:16.013095" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:16.012552" elapsed="0.000602"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:16.013773" 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-10-16T01:26:16.013397" elapsed="0.000410"/>
</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-10-16T01:26:16.014215" elapsed="0.000028"/>
</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-10-16T01:26:16.014468" 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-10-16T01:26:16.014739" elapsed="0.000029"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:16.014036" elapsed="0.000778"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:16.013883" elapsed="0.000985"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:16.014926" elapsed="0.000037"/>
</return>
<msg time="2026-10-16T01:26:16.015108" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:16.012081" elapsed="0.003059"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:16.011716" elapsed="0.003464"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:16.015413" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:16.015213" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:16.011672" elapsed="0.003837"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:16.016291" 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-10-16T01:26:16.015742" elapsed="0.000585"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:16.016388" elapsed="0.000036"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:16.007087" elapsed="0.009438"/>
</kw>
<msg time="2026-10-16T01:26:16.016590" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:16.001445" elapsed="0.015209"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:16.021978" elapsed="0.000036"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:16.027252" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:16.031100" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:16.031310" 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-10-16T01:26:16.031491" elapsed="0.000019"/>
</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-10-16T01:26:16.031860" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:16.031692" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:16.031678" elapsed="0.000258"/>
</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-10-16T01:26:16.032090" elapsed="0.000019"/>
</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-10-16T01:26:16.032268" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:16.032428" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:16.031651" elapsed="0.000826"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:16.031560" elapsed="0.000940"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:16.032650" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:16.032739" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:26:16.032845" 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-10-16T01:26:16.000589" elapsed="0.032289"/>
</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-10-16T01:26:16.033987" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:16.033774" elapsed="0.000272">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:16.034128" 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-10-16T01:26:16.033437" elapsed="0.000714"/>
</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-10-16T01:26:16.034429" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:16.034213" elapsed="0.000267"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:16.034953" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:16.034660" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:16.034503" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:16.034196" elapsed="0.000834"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:16.035522" 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-10-16T01:26:16.035187" elapsed="0.000359"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:16.035591" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:26:16.035730" 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-manganese/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-10-16T01:26:16.033140" elapsed="0.002614"/>
</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-10-16T01:26:16.036830" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:16.036624" elapsed="0.000277">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:16.036984" 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-10-16T01:26:16.036309" elapsed="0.000697"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:16.037169" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:26:16.037070" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:16.037053" elapsed="0.000193"/>
</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-10-16T01:26:16.037396" elapsed="0.000020"/>
</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-10-16T01:26:16.037605" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:16.037667" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:16.037809" 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-manganese/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-10-16T01:26:16.036011" elapsed="0.001821"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:16.039229" 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-10-16T01:26:16.039003" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:16.039675" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:16.039458" elapsed="0.000274"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:26:16.043637" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:16.043687" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:16.043802" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:16.040027" elapsed="0.004124">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:16.039793" elapsed="0.004435">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:16.044407" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:16.044258" elapsed="0.000208"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:16.039777" elapsed="0.004710">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:16.044835" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:16.044971" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:16.044938" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:16.044922" elapsed="0.000107"/>
</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-10-16T01:26:16.045163" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:16.045225" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:26:16.038279" elapsed="0.007048">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:16.045394" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:26:15.990614" elapsed="0.054902">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:16.045943" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:16.045685" elapsed="0.000341"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:16.045634" elapsed="0.000432"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:16.046147" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:26:15.987117" elapsed="0.059225">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:15.983094" elapsed="0.063347">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:15.983050" elapsed="0.063464">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:16.046777" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:16.047154" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:16.047465" elapsed="0.000019"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:16.047838" elapsed="0.000035"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:16.048276" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:16.048587" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:16.048968" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:16.049211" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:26:15.975501" elapsed="0.073811">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:16.049373" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:15.973669" elapsed="0.075792">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:16.049679" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:16.049539" elapsed="0.000214"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:16.049933" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:16.049776" elapsed="0.000207"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:16.050145" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:16.050004" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:16.049524" elapsed="0.000688"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:15.973341" elapsed="0.076909">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:15.972961" elapsed="0.077341">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:16.050349" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:15.964379" elapsed="0.086059">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:16.050611" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:16.050966" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:16.050689" elapsed="0.000327"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:16.050674" elapsed="0.000364"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:16.051207" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:16.051380" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:16.051439" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:15.962796" elapsed="0.088735">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:15.962329" elapsed="0.089264">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:15.962093" elapsed="0.089549">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:15.961254" elapsed="0.090491">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:16.051971" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:15.939972" elapsed="0.112216">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:17.070832" elapsed="0.000401"/>
</kw>
<msg time="2026-10-16T01:26:17.071334" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:17.069572" elapsed="0.001866"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:17.068594" elapsed="0.002994"/>
</kw>
<msg time="2026-10-16T01:26:17.071677" 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-10-16T01:26:17.061933" elapsed="0.009865"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:17.061072" elapsed="0.010901"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:17.073222" 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-10-16T01:26:17.072432" elapsed="0.000885"/>
</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-10-16T01:26:17.079881" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:17.079105" elapsed="0.000834"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:17.080912" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:17.080268" elapsed="0.000699"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:17.081058" elapsed="0.000060"/>
</return>
<msg time="2026-10-16T01:26:17.081339" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:17.078274" elapsed="0.003115"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:17.081746" elapsed="0.000311"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:17.083137" 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-10-16T01:26:17.082424" elapsed="0.000770"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:17.084080" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:17.083519" elapsed="0.000614"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:17.085157" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:17.084438" elapsed="0.000773"/>
</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-10-16T01:26:17.093688" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:17.092329" elapsed="0.001501"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:17.093979" elapsed="0.000129"/>
</return>
<msg time="2026-10-16T01:26:17.094536" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:17.089161" elapsed="0.005498"/>
</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-10-16T01:26:17.119172" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:17.118733" elapsed="0.000475"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:17.120167" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:17.119897" elapsed="0.000358">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:17.120371" 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-10-16T01:26:17.119422" elapsed="0.000979"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:17.121105" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:17.120636" elapsed="0.000504"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:17.121517" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:17.121691" 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-10-16T01:26:17.121365" elapsed="0.000381"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:17.122336" 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-10-16T01:26:17.122028" elapsed="0.000364"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:17.123837" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:17.123493" elapsed="0.000420"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:17.124504" 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-10-16T01:26:17.124154" elapsed="0.000384"/>
</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-10-16T01:26:17.124968" elapsed="0.000030"/>
</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-10-16T01:26:17.125221" 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-10-16T01:26:17.125470" elapsed="0.000027"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:17.124771" elapsed="0.000771"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:17.124598" elapsed="0.000981"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:17.125635" elapsed="0.000035"/>
</return>
<msg time="2026-10-16T01:26:17.125836" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:17.123022" elapsed="0.002863"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:17.122478" elapsed="0.003448"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:17.126160" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:17.125958" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:17.122454" elapsed="0.003804"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:17.127031" 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-10-16T01:26:17.126470" elapsed="0.000597"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:17.127127" elapsed="0.000037"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:17.118020" elapsed="0.009245"/>
</kw>
<msg time="2026-10-16T01:26:17.127379" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:17.112365" elapsed="0.015079"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:17.132810" elapsed="0.000050"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:17.137890" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:17.141643" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:17.141833" elapsed="0.000039"/>
</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-10-16T01:26:17.142031" elapsed="0.000019"/>
</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-10-16T01:26:17.142365" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:17.142226" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:17.142213" elapsed="0.000226"/>
</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-10-16T01:26:17.142588" 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-10-16T01:26:17.142784" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:17.142961" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:17.142187" elapsed="0.000823"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:17.142098" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:17.143182" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:17.143249" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:17.143351" 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-10-16T01:26:17.111503" elapsed="0.031872"/>
</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-10-16T01:26:17.144508" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:17.144316" elapsed="0.000251">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:17.144686" 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-10-16T01:26:17.143963" 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-10-16T01:26:17.145029" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:17.144796" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:17.145523" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:17.145261" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:17.145104" elapsed="0.000475"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:17.144779" elapsed="0.000820"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:17.146140" 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-10-16T01:26:17.145785" elapsed="0.000379"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:17.146210" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:26:17.146333" 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-manganese/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-10-16T01:26:17.143634" elapsed="0.002722"/>
</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-10-16T01:26:17.147433" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:17.147245" elapsed="0.000246">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:17.147574" 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-10-16T01:26:17.146927" elapsed="0.000670"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:17.147949" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:26:17.147831" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:17.147643" elapsed="0.000386"/>
</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-10-16T01:26:17.148180" elapsed="0.000020"/>
</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-10-16T01:26:17.148353" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:17.148413" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:17.148537" 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-manganese/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-10-16T01:26:17.146597" elapsed="0.001963"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:17.149797" 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-10-16T01:26:17.149557" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:17.150257" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:17.150041" elapsed="0.000256"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:26:17.153980" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:17.154031" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:17.154124" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:17.150576" elapsed="0.003873">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:17.150356" elapsed="0.004168">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:17.154720" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:17.154554" elapsed="0.000256"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:17.150340" elapsed="0.004494">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:17.155183" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:17.155302" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:17.155269" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:17.155253" elapsed="0.000106"/>
</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-10-16T01:26:17.155494" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:17.155556" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:26:17.148859" elapsed="0.006797">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:17.155739" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:26:17.101798" elapsed="0.054080">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:17.156273" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:17.156058" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:17.155997" elapsed="0.000397"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:17.156477" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:26:17.099242" elapsed="0.057397">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:17.095177" elapsed="0.061588">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:17.095136" elapsed="0.061701">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:17.157092" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:17.157435" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:17.157790" elapsed="0.000024"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:17.158155" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:17.158576" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:17.158930" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:17.159274" elapsed="0.000019"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:17.159508" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:26:17.087877" elapsed="0.071732">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:17.159671" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:17.086068" elapsed="0.073734">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:17.160080" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:17.159940" elapsed="0.000190"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:17.160289" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:17.160153" elapsed="0.000185"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:17.160517" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:17.160375" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:17.159921" elapsed="0.000665"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:17.085677" elapsed="0.074947">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:17.085306" elapsed="0.075370">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:17.160747" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:17.076938" elapsed="0.083901">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:17.161030" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:17.161247" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:17.161108" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:17.161093" elapsed="0.000222"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:17.161438" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:17.161604" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:17.161661" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:17.075317" elapsed="0.086558">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:17.074885" elapsed="0.087055">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:17.074592" elapsed="0.087396">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:17.073811" elapsed="0.088260">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:17.162276" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:17.052812" elapsed="0.109568">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:18.183834" elapsed="0.000445"/>
</kw>
<msg time="2026-10-16T01:26:18.184411" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:18.182530" elapsed="0.001995"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:18.181523" elapsed="0.003158"/>
</kw>
<msg time="2026-10-16T01:26:18.184922" 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-10-16T01:26:18.174687" elapsed="0.010332"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:18.173867" elapsed="0.011303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:18.186242" 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-10-16T01:26:18.185645" elapsed="0.000688"/>
</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-10-16T01:26:18.192985" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:18.192185" elapsed="0.000859"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:18.194034" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:18.193377" elapsed="0.000711"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:18.194181" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:26:18.194469" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:18.191297" elapsed="0.003222"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:18.194898" elapsed="0.000290"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:18.196279" 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-10-16T01:26:18.195553" elapsed="0.000781"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:18.197216" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:18.196658" elapsed="0.000612"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:18.198138" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:18.197579" elapsed="0.000611"/>
</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-10-16T01:26:18.207093" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:18.205510" elapsed="0.001691"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:18.207330" elapsed="0.000130"/>
</return>
<msg time="2026-10-16T01:26:18.208252" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:18.202308" elapsed="0.006071"/>
</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-10-16T01:26:18.230645" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:18.230226" elapsed="0.000455"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:18.231653" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:18.231371" elapsed="0.000402">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:18.231907" 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-10-16T01:26:18.230932" elapsed="0.001008"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:18.232605" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:18.232175" elapsed="0.000466"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:18.233062" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:18.233248" 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-10-16T01:26:18.232903" elapsed="0.000378"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:18.233944" 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-10-16T01:26:18.233543" elapsed="0.000459"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:18.235263" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:18.234990" elapsed="0.000314"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:18.235895" 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-10-16T01:26:18.235474" elapsed="0.000447"/>
</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-10-16T01:26:18.236202" 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-10-16T01:26:18.236386" elapsed="0.000022"/>
</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-10-16T01:26:18.236569" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:18.236073" elapsed="0.000548"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:18.235964" elapsed="0.000685"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:18.236689" elapsed="0.000042"/>
</return>
<msg time="2026-10-16T01:26:18.236853" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:18.234434" elapsed="0.002444"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:18.234089" elapsed="0.002817"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:18.237076" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:18.236931" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:18.234064" elapsed="0.003081"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:18.237684" 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-10-16T01:26:18.237298" elapsed="0.000427"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:18.237770" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:18.229494" elapsed="0.008390"/>
</kw>
<msg time="2026-10-16T01:26:18.237934" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:18.223878" elapsed="0.014102"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:18.241778" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:18.245604" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:18.249500" elapsed="0.000027"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:18.249680" 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-10-16T01:26:18.249892" 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-10-16T01:26:18.250267" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:18.250091" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:18.250078" elapsed="0.000263"/>
</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-10-16T01:26:18.250493" 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-10-16T01:26:18.250668" elapsed="0.000018"/>
</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-10-16T01:26:18.250855" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:18.250052" elapsed="0.000854"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:18.249962" elapsed="0.000967"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:18.251078" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:18.251147" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:18.251250" 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-10-16T01:26:18.223023" elapsed="0.028251"/>
</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-10-16T01:26:18.252369" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:18.252178" elapsed="0.000250">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:18.252510" 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-10-16T01:26:18.251856" elapsed="0.000677"/>
</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-10-16T01:26:18.252827" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:18.252596" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:18.253339" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:18.253074" elapsed="0.000290"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:18.252916" elapsed="0.000479"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:18.252579" elapsed="0.000836"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:18.253951" 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-10-16T01:26:18.253583" elapsed="0.000393"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:18.254021" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:26:18.254143" 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-manganese/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-10-16T01:26:18.251530" elapsed="0.002635"/>
</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-10-16T01:26:18.255242" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:18.255053" elapsed="0.000247">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:18.255381" 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-10-16T01:26:18.254720" elapsed="0.000683"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:18.255565" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:26:18.255466" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:18.255450" elapsed="0.000191"/>
</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-10-16T01:26:18.255806" 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-10-16T01:26:18.255992" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:18.256052" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:26:18.256177" 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-manganese/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-10-16T01:26:18.254406" elapsed="0.001831"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:18.257632" 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-10-16T01:26:18.257404" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:18.258112" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:18.257891" elapsed="0.000262"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:26:18.262080" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:18.262133" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:18.262243" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:18.258437" elapsed="0.004163">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:18.258213" elapsed="0.004466">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:18.262893" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:18.262729" elapsed="0.000227"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:18.258196" elapsed="0.004781">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:18.263311" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:18.263430" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:18.263397" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:18.263382" elapsed="0.000106"/>
</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-10-16T01:26:18.263622" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:18.263684" elapsed="0.000029"/>
</return>
<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="FAIL" start="2026-10-16T01:26:18.256513" elapsed="0.007291">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:18.263890" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:26:18.213422" elapsed="0.050598">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:18.264404" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:18.264186" elapsed="0.000300"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:18.264138" elapsed="0.000387"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:18.264607" elapsed="0.000034"/>
</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="FAIL" start="2026-10-16T01:26:18.211241" elapsed="0.053551">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:18.208917" elapsed="0.056021">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:18.208882" elapsed="0.056130">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:18.265260" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:18.265603" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:18.265951" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:18.266298" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:18.266738" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:18.267064" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:18.267409" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:18.267642" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:26:18.200996" elapsed="0.066782">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:18.267853" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:18.199162" elapsed="0.068782">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:18.268164" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:18.268024" elapsed="0.000190"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:18.268372" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:18.268237" elapsed="0.000184"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:18.268583" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:18.268442" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:18.268008" elapsed="0.000644"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:18.198654" elapsed="0.070035">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:18.198286" elapsed="0.070478">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:18.268813" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:18.189954" elapsed="0.078962">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:18.269095" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:18.269313" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:18.269174" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:18.269159" elapsed="0.000221"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:18.269504" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:18.269671" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:18.269861" elapsed="0.000016"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:18.188309" elapsed="0.081683">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:18.187863" elapsed="0.082193">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:18.187571" elapsed="0.082533">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:18.186812" elapsed="0.083373">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:18.270394" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:18.163065" elapsed="0.107433">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:19.290022" elapsed="0.000407"/>
</kw>
<msg time="2026-10-16T01:26:19.290548" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:19.288566" elapsed="0.002100"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:19.287573" elapsed="0.003308"/>
</kw>
<msg time="2026-10-16T01:26:19.290976" 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-10-16T01:26:19.280899" elapsed="0.010170"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:19.280018" elapsed="0.011203"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:19.292268" 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-10-16T01:26:19.291697" elapsed="0.000664"/>
</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-10-16T01:26:19.299081" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:19.298193" elapsed="0.000947"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:19.300148" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:19.299472" elapsed="0.000731"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:19.300298" elapsed="0.000063"/>
</return>
<msg time="2026-10-16T01:26:19.300600" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:19.297360" elapsed="0.003291"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:19.301040" elapsed="0.000291"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:19.302442" 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-10-16T01:26:19.301737" elapsed="0.000761"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:19.303383" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:19.302876" elapsed="0.000561"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:19.304300" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:19.303775" elapsed="0.000578"/>
</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-10-16T01:26:19.313136" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:19.311674" elapsed="0.001681"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:19.313490" elapsed="0.000135"/>
</return>
<msg time="2026-10-16T01:26:19.314125" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:19.308387" elapsed="0.005865"/>
</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-10-16T01:26:19.338136" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:19.337629" elapsed="0.000544"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:19.339178" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:19.338878" elapsed="0.000400">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:19.339397" 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-10-16T01:26:19.338395" elapsed="0.001033"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:19.340133" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:19.339663" elapsed="0.000506"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:19.340550" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:19.340765" 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-10-16T01:26:19.340394" elapsed="0.000405"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:19.341472" 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-10-16T01:26:19.341151" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:19.343022" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:19.342473" elapsed="0.000607"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:19.343685" 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-10-16T01:26:19.343323" elapsed="0.000421"/>
</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-10-16T01:26:19.344212" elapsed="0.000020"/>
</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-10-16T01:26:19.344396" elapsed="0.000022"/>
</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-10-16T01:26:19.344576" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:19.344028" elapsed="0.000600"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:19.343818" elapsed="0.000840"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:19.344716" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:26:19.344860" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:19.342004" elapsed="0.002880"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:19.341613" elapsed="0.003301"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:19.345084" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:19.344939" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:19.341590" elapsed="0.003562"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:19.345693" 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-10-16T01:26:19.345304" elapsed="0.000431"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:19.345779" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:19.336933" elapsed="0.008971"/>
</kw>
<msg time="2026-10-16T01:26:19.345986" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:19.331272" elapsed="0.014762"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:19.349878" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:19.353642" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:19.357444" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:19.357622" elapsed="0.000020"/>
</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-10-16T01:26:19.357814" elapsed="0.000048"/>
</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-10-16T01:26:19.358188" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:19.358046" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:19.358032" 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-10-16T01:26:19.358413" elapsed="0.000019"/>
</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-10-16T01:26:19.358588" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:19.358763" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:19.358006" elapsed="0.000807"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:19.357915" elapsed="0.000934"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:19.359002" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:19.359070" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:19.359174" 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-10-16T01:26:19.330407" elapsed="0.028791"/>
</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-10-16T01:26:19.360305" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:19.360113" elapsed="0.000251">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:19.360446" 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-10-16T01:26:19.359773" elapsed="0.000695"/>
</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-10-16T01:26:19.360764" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:19.360531" elapsed="0.000333"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:19.361318" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:19.361051" elapsed="0.000291"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:19.360889" elapsed="0.000485"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:19.360515" elapsed="0.000879"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:19.361918" 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-10-16T01:26:19.361550" elapsed="0.000393"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:19.361988" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:26:19.362112" 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-manganese/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-10-16T01:26:19.359462" elapsed="0.002672"/>
</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-10-16T01:26:19.363209" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:19.363018" elapsed="0.000250">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:19.363351" 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-10-16T01:26:19.362672" elapsed="0.000702"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:19.363536" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:26:19.363436" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:19.363420" elapsed="0.000192"/>
</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-10-16T01:26:19.363776" 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-10-16T01:26:19.363961" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:19.364022" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:19.364144" 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-manganese/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-10-16T01:26:19.362378" elapsed="0.001789"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:19.365572" 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-10-16T01:26:19.365346" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:19.366047" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:19.365814" elapsed="0.000273"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:26:19.370375" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:19.370430" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:19.370526" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:19.366368" elapsed="0.004558">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:19.366147" elapsed="0.004858">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:19.371183" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:19.371035" elapsed="0.000206"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:19.366131" elapsed="0.005132">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:19.371596" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:19.371767" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:19.371731" elapsed="0.000074"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:19.371697" elapsed="0.000129"/>
</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-10-16T01:26:19.371979" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:19.372041" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:26:19.364612" elapsed="0.007531">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:19.372211" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:26:19.320744" elapsed="0.051591">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:19.372738" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:19.372500" elapsed="0.000323"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:19.372454" elapsed="0.000427"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:19.372966" elapsed="0.000034"/>
</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="FAIL" start="2026-10-16T01:26:19.318573" elapsed="0.054553">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:19.314962" elapsed="0.058265">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:19.314668" elapsed="0.058632">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:19.373546" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:19.373929" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:19.374241" elapsed="0.000019"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:19.374583" elapsed="0.000025"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:19.375050" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:19.375364" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:19.375731" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:19.375982" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:26:19.307056" elapsed="0.069028">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:19.376145" elapsed="0.000014"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:19.305203" elapsed="0.071030">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:19.376453" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:19.376313" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:19.376696" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:19.376524" elapsed="0.000248"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:19.376948" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:19.376794" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:19.376296" elapsed="0.000722"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:19.304867" elapsed="0.072189">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:19.304447" elapsed="0.072663">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:19.377157" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:19.296001" elapsed="0.081247">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:19.377423" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:19.377640" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:19.377501" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:19.377486" elapsed="0.000342"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:19.378001" elapsed="0.000021"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:19.378173" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:19.378232" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:19.294364" elapsed="0.083959">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:19.293907" elapsed="0.084477">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:19.293603" elapsed="0.084830">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:19.292859" elapsed="0.085654">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:19.378737" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:19.271254" elapsed="0.107602">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:20.398512" elapsed="0.000441"/>
</kw>
<msg time="2026-10-16T01:26:20.399060" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:20.397265" elapsed="0.001907"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:20.396328" elapsed="0.002999"/>
</kw>
<msg time="2026-10-16T01:26:20.399418" 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-10-16T01:26:20.389478" elapsed="0.010030"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:20.388599" elapsed="0.011055"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:20.400870" 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-10-16T01:26:20.400296" elapsed="0.000670"/>
</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-10-16T01:26:20.407661" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:20.406922" elapsed="0.000829"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:20.408742" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:20.408111" elapsed="0.000690"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:20.408937" elapsed="0.000073"/>
</return>
<msg time="2026-10-16T01:26:20.409237" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:20.406016" elapsed="0.003272"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:20.409613" elapsed="0.000363"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:20.411101" 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-10-16T01:26:20.410348" elapsed="0.000808"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:20.412067" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:20.411480" elapsed="0.000640"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:20.412985" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:20.412428" elapsed="0.000610"/>
</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-10-16T01:26:20.421920" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:20.420440" elapsed="0.001607"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:20.422193" elapsed="0.000145"/>
</return>
<msg time="2026-10-16T01:26:20.422891" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:20.417113" elapsed="0.006261"/>
</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-10-16T01:26:20.447256" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:20.446816" elapsed="0.000476"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:20.448269" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:20.447990" elapsed="0.000372">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:20.448480" 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-10-16T01:26:20.447506" elapsed="0.001005"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:20.449218" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:20.448767" elapsed="0.000486"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:20.449635" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:20.449856" 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-10-16T01:26:20.449479" elapsed="0.000412"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:20.450463" 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-10-16T01:26:20.450158" elapsed="0.000361"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:20.452086" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:20.451737" elapsed="0.000406"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:20.452820" 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-10-16T01:26:20.452385" elapsed="0.000485"/>
</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-10-16T01:26:20.453161" elapsed="0.000020"/>
</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-10-16T01:26:20.453343" elapsed="0.000022"/>
</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-10-16T01:26:20.453521" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:20.453031" elapsed="0.000542"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:20.452922" elapsed="0.000678"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:20.453640" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:26:20.453785" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:20.451241" elapsed="0.002568"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:20.450603" elapsed="0.003247"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:20.454020" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:20.453875" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:20.450579" elapsed="0.003511"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:20.454629" 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-10-16T01:26:20.454243" elapsed="0.000412"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:20.454714" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:20.446103" elapsed="0.008712"/>
</kw>
<msg time="2026-10-16T01:26:20.454876" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:20.440442" elapsed="0.014481"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:20.458718" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:20.462519" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:20.466316" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:20.466490" elapsed="0.000020"/>
</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-10-16T01:26:20.466664" elapsed="0.000019"/>
</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-10-16T01:26:20.467032" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:20.466892" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:20.466878" elapsed="0.000228"/>
</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-10-16T01:26:20.467256" elapsed="0.000019"/>
</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-10-16T01:26:20.467429" elapsed="0.000018"/>
</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-10-16T01:26:20.467623" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:20.466851" elapsed="0.000822"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:20.466748" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:20.467873" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:20.467942" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:26:20.468047" 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-10-16T01:26:20.439519" elapsed="0.028552"/>
</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-10-16T01:26:20.469163" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:20.468973" elapsed="0.000249">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:20.469304" 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-10-16T01:26:20.468624" elapsed="0.000702"/>
</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-10-16T01:26:20.469602" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:20.469389" elapsed="0.000264"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:20.470128" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:20.469863" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:20.469676" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:20.469372" elapsed="0.000832"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:20.470691" 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-10-16T01:26:20.470358" elapsed="0.000372"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:20.470776" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:26:20.470916" 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-manganese/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-10-16T01:26:20.468330" elapsed="0.002608"/>
</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-10-16T01:26:20.472008" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:20.471809" elapsed="0.000257">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:20.472148" 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-10-16T01:26:20.471479" elapsed="0.000692"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:20.472515" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:26:20.472389" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:20.472218" elapsed="0.000375"/>
</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-10-16T01:26:20.472758" 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-10-16T01:26:20.472945" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:20.473006" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:26:20.473131" 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-manganese/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-10-16T01:26:20.471183" elapsed="0.001971"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:20.474370" 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-10-16T01:26:20.474144" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:20.474878" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:20.474627" 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-10-16T01:26:20.478806" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:20.478872" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:20.478973" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:20.475203" elapsed="0.004117">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:20.474980" elapsed="0.004416">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:20.479579" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:20.479426" elapsed="0.000211"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:20.474963" elapsed="0.004696">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:20.480028" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:20.480147" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:20.480115" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:20.480098" elapsed="0.000107"/>
</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-10-16T01:26:20.480340" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:20.480402" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:26:20.473425" elapsed="0.007079">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:20.480571" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:26:20.429755" elapsed="0.050939">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:20.481114" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:20.480898" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:20.480848" elapsed="0.000387"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:20.481316" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:26:20.427513" elapsed="0.053963">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:20.423904" elapsed="0.057672">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:20.423859" elapsed="0.057789">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:20.481924" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:20.482295" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:20.482604" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:20.482993" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:20.483557" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:20.483901" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:20.484244" elapsed="0.000019"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:20.484475" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:26:20.415681" elapsed="0.068895">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:20.484638" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:20.413895" elapsed="0.070853">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:20.484982" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:20.484841" elapsed="0.000191"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:20.485190" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:20.485054" elapsed="0.000185"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:20.485399" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:20.485260" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:20.484814" elapsed="0.000653"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:20.413496" elapsed="0.072008">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:20.413132" elapsed="0.072424">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:20.485604" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:20.404583" elapsed="0.081111">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:20.485958" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:20.486202" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:20.486037" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:20.486022" elapsed="0.000252"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:20.486400" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:20.486566" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:20.486624" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:20.402984" elapsed="0.083807">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:20.402484" elapsed="0.084385">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:20.402241" elapsed="0.084739">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:20.401408" elapsed="0.085657">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:20.487275" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:20.379460" elapsed="0.107921">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:21.509420" elapsed="0.000468"/>
</kw>
<msg time="2026-10-16T01:26:21.510005" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:21.508138" elapsed="0.001981"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:21.507190" elapsed="0.003088"/>
</kw>
<msg time="2026-10-16T01:26:21.510370" 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-10-16T01:26:21.500274" elapsed="0.010185"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:21.499232" elapsed="0.011375"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:21.511658" 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-10-16T01:26:21.511137" elapsed="0.000645"/>
</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-10-16T01:26:21.518558" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:21.517781" elapsed="0.000835"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:21.519604" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:21.519004" elapsed="0.000654"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:21.519784" elapsed="0.000086"/>
</return>
<msg time="2026-10-16T01:26:21.520101" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:21.516935" elapsed="0.003217"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:21.520477" elapsed="0.000316"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:21.521906" 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-10-16T01:26:21.521182" elapsed="0.000781"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:21.522842" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:21.522288" elapsed="0.000610"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:21.523731" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:21.523207" elapsed="0.000579"/>
</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-10-16T01:26:21.532749" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:21.531329" elapsed="0.001555"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:21.533014" elapsed="0.000133"/>
</return>
<msg time="2026-10-16T01:26:21.533575" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:21.527974" elapsed="0.005979"/>
</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-10-16T01:26:21.557380" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:21.556953" elapsed="0.000463"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:21.558406" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:21.558113" elapsed="0.000391">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:21.558622" 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-10-16T01:26:21.557630" elapsed="0.001023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:21.559356" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:21.558925" elapsed="0.000467"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:21.559793" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:21.560003" 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-10-16T01:26:21.559615" elapsed="0.000421"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:21.560609" 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-10-16T01:26:21.560302" elapsed="0.000364"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:21.561998" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:21.561608" elapsed="0.000460"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:21.562719" 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-10-16T01:26:21.562305" elapsed="0.000440"/>
</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-10-16T01:26:21.563048" 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-10-16T01:26:21.563232" elapsed="0.000022"/>
</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-10-16T01:26:21.563413" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:21.562917" elapsed="0.000548"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:21.562790" elapsed="0.000704"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:21.563535" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:26:21.563665" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:21.561138" elapsed="0.002550"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:21.560774" elapsed="0.002963"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:21.563922" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:21.563763" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:21.560749" elapsed="0.003244"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:21.564543" 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-10-16T01:26:21.564148" elapsed="0.000420"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:21.564613" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:21.556212" elapsed="0.008517"/>
</kw>
<msg time="2026-10-16T01:26:21.564778" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:21.550407" elapsed="0.014431"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:21.568642" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:21.572507" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:21.576324" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:21.576500" elapsed="0.000020"/>
</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-10-16T01:26:21.576677" elapsed="0.000019"/>
</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-10-16T01:26:21.577055" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:21.576914" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:21.576900" elapsed="0.000229"/>
</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-10-16T01:26:21.577280" elapsed="0.000019"/>
</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-10-16T01:26:21.577455" elapsed="0.000018"/>
</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-10-16T01:26:21.577614" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:21.576867" elapsed="0.000796"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:21.576762" elapsed="0.000925"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:21.577865" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:21.577935" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:21.578040" 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-10-16T01:26:21.549545" elapsed="0.028519"/>
</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-10-16T01:26:21.579164" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:21.578973" elapsed="0.000249">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:21.579304" 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-10-16T01:26:21.578620" elapsed="0.000707"/>
</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-10-16T01:26:21.579604" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:21.579390" elapsed="0.000266"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:21.580135" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:21.579869" elapsed="0.000290"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:21.579679" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:21.579373" elapsed="0.000839"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:21.580719" 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-10-16T01:26:21.580368" elapsed="0.000410"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:21.580839" elapsed="0.000028"/>
</return>
<msg time="2026-10-16T01:26:21.580968" 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-manganese/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-10-16T01:26:21.578324" elapsed="0.002668"/>
</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-10-16T01:26:21.582075" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:21.581883" elapsed="0.000250">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:21.582216" 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-10-16T01:26:21.581531" elapsed="0.000708"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:21.582400" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:26:21.582301" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:21.582285" elapsed="0.000191"/>
</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-10-16T01:26:21.582625" elapsed="0.000020"/>
</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-10-16T01:26:21.582812" elapsed="0.000033"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:21.582887" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:21.583011" 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-manganese/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-10-16T01:26:21.581235" elapsed="0.001800"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:21.584425" 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-10-16T01:26:21.584194" elapsed="0.000274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:21.584904" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:21.584654" 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-10-16T01:26:21.589034" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:21.589087" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:21.589191" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:21.585228" elapsed="0.004319">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:21.585005" elapsed="0.004619">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:21.589821" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:21.589655" elapsed="0.000243"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:21.584989" elapsed="0.004931">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:21.590263" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:21.590384" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:21.590351" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:21.590335" elapsed="0.000108"/>
</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-10-16T01:26:21.590579" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:21.590672" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:26:21.583302" elapsed="0.007490">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:21.590877" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:26:21.539665" elapsed="0.051340">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:21.591390" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:21.591172" elapsed="0.000300"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:21.591125" elapsed="0.000388"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:21.591595" elapsed="0.000034"/>
</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="FAIL" start="2026-10-16T01:26:21.537480" elapsed="0.054304">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:21.534422" elapsed="0.057479">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:21.534378" elapsed="0.057596">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:21.592221" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:21.592564" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:21.592907" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:21.593253" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:21.593675" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:21.594029" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:21.594377" elapsed="0.000019"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:21.594614" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:26:21.526596" elapsed="0.068154">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:21.594812" elapsed="0.000026"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:21.524605" elapsed="0.070309">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:21.595135" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:21.594994" elapsed="0.000191"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:21.595344" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:21.595207" elapsed="0.000185"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:21.595555" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:21.595414" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:21.594978" elapsed="0.000685"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:21.524278" elapsed="0.071447">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:21.523908" elapsed="0.071874">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:21.595843" elapsed="0.000016"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:21.515523" elapsed="0.080416">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:21.596116" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:21.596335" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:21.596195" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:21.596179" elapsed="0.000224"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:21.596528" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:21.596693" elapsed="0.000144"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:21.596880" elapsed="0.000015"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:21.513844" elapsed="0.083130">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:21.513322" elapsed="0.083713">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:21.513077" elapsed="0.084007">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:21.512252" elapsed="0.084913">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:21.597374" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:21.488104" elapsed="0.109374">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:22.616769" elapsed="0.000408"/>
</kw>
<msg time="2026-10-16T01:26:22.617276" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:22.615208" elapsed="0.002172"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:22.614241" elapsed="0.003291"/>
</kw>
<msg time="2026-10-16T01:26:22.617620" 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-10-16T01:26:22.607232" elapsed="0.010507"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:22.606356" elapsed="0.011554"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:22.618936" 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-10-16T01:26:22.618370" elapsed="0.000659"/>
</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-10-16T01:26:22.625665" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:22.624929" elapsed="0.000827"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:22.626794" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:22.626154" elapsed="0.000714"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:22.626961" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:26:22.627247" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:22.624098" elapsed="0.003200"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:22.627626" elapsed="0.000341"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:22.629052" 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-10-16T01:26:22.628337" elapsed="0.000770"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:22.629990" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:22.629433" elapsed="0.000611"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:22.630898" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:22.630351" elapsed="0.000601"/>
</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-10-16T01:26:22.640049" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:22.638357" elapsed="0.001803"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:22.640288" elapsed="0.000135"/>
</return>
<msg time="2026-10-16T01:26:22.641116" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:22.635111" elapsed="0.006133"/>
</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-10-16T01:26:22.671060" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:22.670565" elapsed="0.000540"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:22.672072" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:22.671792" elapsed="0.000365">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:22.672273" 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-10-16T01:26:22.671332" elapsed="0.000972"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:22.673007" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:22.672537" elapsed="0.000505"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:22.673418" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:22.673584" 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-10-16T01:26:22.673265" elapsed="0.000352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:22.674236" 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-10-16T01:26:22.673928" elapsed="0.000364"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:22.675840" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:22.675304" elapsed="0.000596"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:22.676546" 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-10-16T01:26:22.676195" elapsed="0.000385"/>
</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-10-16T01:26:22.677014" elapsed="0.000028"/>
</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-10-16T01:26:22.677270" 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-10-16T01:26:22.677571" elapsed="0.000028"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:22.676815" elapsed="0.000829"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:22.676640" elapsed="0.001041"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:22.677758" elapsed="0.000037"/>
</return>
<msg time="2026-10-16T01:26:22.677959" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:22.674735" elapsed="0.003256"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:22.674376" elapsed="0.003655"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:22.678263" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:22.678063" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:22.674352" elapsed="0.004008"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:22.679196" 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-10-16T01:26:22.678571" elapsed="0.000669"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:22.679310" elapsed="0.000037"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:22.669770" elapsed="0.009676"/>
</kw>
<msg time="2026-10-16T01:26:22.679510" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:22.664166" elapsed="0.015407"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:22.685024" elapsed="0.000043"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:22.689117" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:22.692892" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:22.693070" elapsed="0.000019"/>
</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-10-16T01:26:22.693247" elapsed="0.000019"/>
</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-10-16T01:26:22.693585" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:22.693445" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:22.693431" elapsed="0.000227"/>
</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-10-16T01:26:22.693836" 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-10-16T01:26:22.694020" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:22.694181" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:22.693405" elapsed="0.000823"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:22.693315" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:22.694439" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:22.694508" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:22.694612" 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-10-16T01:26:22.663309" elapsed="0.031326"/>
</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-10-16T01:26:22.695749" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:22.695544" elapsed="0.000266">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:22.695909" 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-10-16T01:26:22.695222" elapsed="0.000709"/>
</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-10-16T01:26:22.696210" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:22.695994" elapsed="0.000268"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:22.696720" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:22.696442" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:22.696285" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:22.695977" elapsed="0.000820"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:22.697303" 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-10-16T01:26:22.696968" elapsed="0.000359"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:22.697372" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:26:22.697494" 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-manganese/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-10-16T01:26:22.694924" elapsed="0.002593"/>
</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-10-16T01:26:22.698593" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:22.698406" elapsed="0.000244">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:22.698749" 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-10-16T01:26:22.698086" elapsed="0.000687"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:22.698956" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:26:22.698854" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:22.698836" elapsed="0.000197"/>
</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-10-16T01:26:22.699184" elapsed="0.000019"/>
</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-10-16T01:26:22.699354" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:22.699412" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:22.699535" 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-manganese/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-10-16T01:26:22.697776" elapsed="0.001782"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:22.700977" 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-10-16T01:26:22.700735" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:22.701421" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:22.701204" elapsed="0.000257"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:26:22.705169" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:22.705258" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:22.705353" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:22.701760" elapsed="0.003984">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:22.701521" elapsed="0.004316">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:22.706023" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:22.705870" elapsed="0.000211"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:22.701504" elapsed="0.004599">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:22.706446" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:22.706566" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:22.706533" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:22.706517" elapsed="0.000108"/>
</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-10-16T01:26:22.706780" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:22.706856" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:26:22.700025" elapsed="0.006937">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:22.707035" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:26:22.649329" elapsed="0.057830">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:22.707543" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:22.707327" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:22.707279" elapsed="0.000386"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:22.707775" elapsed="0.000037"/>
</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="FAIL" start="2026-10-16T01:26:22.645744" elapsed="0.062213">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:22.641691" elapsed="0.066365">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:22.641651" elapsed="0.066478">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:22.708374" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:22.708732" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:22.709059" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:22.709406" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:22.709909" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:22.710224" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:22.710582" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:22.710860" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:26:22.633663" elapsed="0.077299">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:22.711024" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:22.631769" elapsed="0.079343">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:22.711333" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:22.711192" elapsed="0.000191"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:22.711543" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:22.711405" elapsed="0.000186"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:22.711776" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:22.711613" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:22.711176" elapsed="0.000681"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:22.631410" elapsed="0.080486">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:22.631046" elapsed="0.080902">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:22.711997" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:22.622589" elapsed="0.089499">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:22.712262" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:22.712478" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:22.712339" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:22.712324" elapsed="0.000222"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:22.712669" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:22.712967" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:22.713026" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:22.620966" elapsed="0.092151">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:22.620483" elapsed="0.092695">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:22.620250" elapsed="0.092976">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:22.619466" elapsed="0.093840">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:22.713556" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:22.598111" elapsed="0.115549">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:23.732909" elapsed="0.000380"/>
</kw>
<msg time="2026-10-16T01:26:23.733388" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:23.731348" elapsed="0.002143"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:23.730382" elapsed="0.003262"/>
</kw>
<msg time="2026-10-16T01:26:23.733765" 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-10-16T01:26:23.723573" elapsed="0.010300"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:23.722745" elapsed="0.011279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:23.735050" 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-10-16T01:26:23.734483" elapsed="0.000659"/>
</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-10-16T01:26:23.741674" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:23.740806" elapsed="0.000990"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:23.742788" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:23.742152" elapsed="0.000710"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:23.742956" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:26:23.743242" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:23.740000" elapsed="0.003293"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:23.743621" elapsed="0.000335"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:23.745043" 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-10-16T01:26:23.744325" elapsed="0.000773"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:23.745982" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:23.745424" elapsed="0.000610"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:23.746975" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:23.746341" elapsed="0.000688"/>
</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-10-16T01:26:23.755763" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:23.754342" elapsed="0.001554"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:23.756024" elapsed="0.000132"/>
</return>
<msg time="2026-10-16T01:26:23.756577" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:23.750975" elapsed="0.006058"/>
</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-10-16T01:26:23.781282" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:23.780773" elapsed="0.000554"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:23.782418" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:23.782142" elapsed="0.000362">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:23.782622" 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-10-16T01:26:23.781603" elapsed="0.001054"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:23.783365" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:23.782932" elapsed="0.000469"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:23.783802" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:23.783984" 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-10-16T01:26:23.783625" elapsed="0.000392"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:23.784584" 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-10-16T01:26:23.784281" elapsed="0.000360"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:23.786114" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:23.785777" elapsed="0.000393"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:23.786778" 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-10-16T01:26:23.786410" elapsed="0.000421"/>
</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-10-16T01:26:23.787219" elapsed="0.000028"/>
</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-10-16T01:26:23.787468" 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-10-16T01:26:23.787737" elapsed="0.000029"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:23.787042" elapsed="0.000768"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:23.786893" elapsed="0.000970"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:23.787921" elapsed="0.000046"/>
</return>
<msg time="2026-10-16T01:26:23.788143" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:23.785284" elapsed="0.002899"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:23.784750" elapsed="0.003483"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:23.788428" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:23.788273" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:23.784724" elapsed="0.003772"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:23.789061" 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-10-16T01:26:23.788648" elapsed="0.000438"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:23.789129" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:23.780059" elapsed="0.009168"/>
</kw>
<msg time="2026-10-16T01:26:23.789273" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:23.774385" elapsed="0.014935"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:23.793089" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:23.796855" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:23.800656" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:23.800861" elapsed="0.000020"/>
</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-10-16T01:26:23.801044" elapsed="0.000019"/>
</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-10-16T01:26:23.801378" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:23.801238" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:23.801225" elapsed="0.000225"/>
</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-10-16T01:26:23.801600" elapsed="0.000019"/>
</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-10-16T01:26:23.801790" 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-10-16T01:26:23.801964" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:23.801199" elapsed="0.000813"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:23.801110" elapsed="0.000925"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:23.802181" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:23.802248" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:23.802350" 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-10-16T01:26:23.773533" elapsed="0.028840"/>
</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-10-16T01:26:23.803462" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:23.803273" elapsed="0.000248">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:23.803604" 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-10-16T01:26:23.802955" elapsed="0.000671"/>
</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-10-16T01:26:23.803942" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:23.803688" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:23.804434" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:23.804174" elapsed="0.000284"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:23.804018" elapsed="0.000471"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:23.803671" elapsed="0.000837"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:23.805026" 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-10-16T01:26:23.804664" elapsed="0.000387"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:23.805096" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:26:23.805217" 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-manganese/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-10-16T01:26:23.802629" elapsed="0.002611"/>
</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-10-16T01:26:23.806346" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:23.806159" elapsed="0.000245">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:23.806487" 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-10-16T01:26:23.805844" elapsed="0.000665"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:23.806860" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:26:23.806741" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:23.806556" elapsed="0.000382"/>
</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-10-16T01:26:23.807088" 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-10-16T01:26:23.807261" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:23.807320" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:23.807443" 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-manganese/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-10-16T01:26:23.805518" elapsed="0.001947"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:23.808672" 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-10-16T01:26:23.808451" elapsed="0.000279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:23.809150" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:23.808931" elapsed="0.000259"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:26:23.813002" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:23.813052" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:23.813145" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:23.809469" elapsed="0.003992">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:23.809249" elapsed="0.004285">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:23.813732" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:23.813564" elapsed="0.000228"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:23.809233" elapsed="0.004594">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:23.814159" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:23.814277" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:23.814244" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:23.814228" elapsed="0.000106"/>
</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-10-16T01:26:23.814467" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:23.814528" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:26:23.807748" elapsed="0.006879">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:23.814744" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:26:23.763848" elapsed="0.051038">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:23.815267" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:23.815052" elapsed="0.000298"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:23.815005" elapsed="0.000384"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:23.815472" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:26:23.761391" elapsed="0.054243">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:23.757506" elapsed="0.058251">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:23.757463" elapsed="0.058379">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:23.816088" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:23.816430" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:23.816754" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:23.817111" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:23.817531" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:23.817880" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:23.818227" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:23.818464" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:26:23.749613" elapsed="0.068953">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:23.818627" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:23.747870" elapsed="0.070884">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:23.818987" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:23.818846" elapsed="0.000191"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:23.819195" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:23.819059" elapsed="0.000184"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:23.819405" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:23.819265" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:23.818830" elapsed="0.000642"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:23.747490" elapsed="0.072019">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:23.747124" elapsed="0.072436">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:23.819606" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:23.738613" elapsed="0.081140">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:23.819940" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:23.820156" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:23.820018" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:23.820003" elapsed="0.000221"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:23.820346" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:23.820633" elapsed="0.000022"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:23.820697" elapsed="0.000130"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:23.737064" elapsed="0.083847">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:23.736580" elapsed="0.084393">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:23.736352" elapsed="0.084670">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:23.735577" elapsed="0.085526">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:23.821311" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:23.714256" elapsed="0.107160">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:24.842349" elapsed="0.000429"/>
</kw>
<msg time="2026-10-16T01:26:24.842904" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:24.841022" elapsed="0.001998"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:24.840060" elapsed="0.003136"/>
</kw>
<msg time="2026-10-16T01:26:24.843290" 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-10-16T01:26:24.833298" elapsed="0.010079"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:24.832434" elapsed="0.011089"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:24.844547" 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-10-16T01:26:24.844035" elapsed="0.000606"/>
</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-10-16T01:26:24.851186" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:24.850406" elapsed="0.000837"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:24.852241" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:24.851571" elapsed="0.000726"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:24.852522" elapsed="0.000063"/>
</return>
<msg time="2026-10-16T01:26:24.852874" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:24.849547" elapsed="0.003380"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:24.853253" elapsed="0.000281"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:24.854615" 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-10-16T01:26:24.853947" elapsed="0.000723"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:24.855557" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:24.855055" elapsed="0.000554"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:24.856468" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:24.855971" elapsed="0.000550"/>
</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-10-16T01:26:24.865272" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:24.863919" elapsed="0.001462"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:24.865506" elapsed="0.000133"/>
</return>
<msg time="2026-10-16T01:26:24.866138" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:24.860633" elapsed="0.005631"/>
</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-10-16T01:26:24.889391" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:24.888961" elapsed="0.000466"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:24.890388" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:24.890128" elapsed="0.000347">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:24.890590" 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-10-16T01:26:24.889645" elapsed="0.000976"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:24.891322" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:24.890890" elapsed="0.000467"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:24.891758" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:24.891944" 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-10-16T01:26:24.891583" elapsed="0.000394"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:24.892556" 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-10-16T01:26:24.892249" elapsed="0.000363"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:24.893905" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:24.893543" elapsed="0.000423"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:24.894690" 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-10-16T01:26:24.894262" elapsed="0.000470"/>
</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-10-16T01:26:24.895033" 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-10-16T01:26:24.895214" 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-10-16T01:26:24.895395" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:24.894900" elapsed="0.000546"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:24.894776" elapsed="0.000697"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:24.895513" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:26:24.895678" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:24.893076" elapsed="0.002640"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:24.892696" elapsed="0.003051"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:24.895929" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:24.895771" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:24.892672" elapsed="0.003328"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:24.896531" 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-10-16T01:26:24.896152" elapsed="0.000405"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:24.896601" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:24.888185" elapsed="0.008530"/>
</kw>
<msg time="2026-10-16T01:26:24.896765" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:24.882468" elapsed="0.014357"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:24.900611" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:24.904447" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:24.908310" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:24.908489" elapsed="0.000020"/>
</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-10-16T01:26:24.908666" elapsed="0.000019"/>
</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-10-16T01:26:24.909036" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:24.908893" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:24.908879" 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-10-16T01:26:24.909263" elapsed="0.000019"/>
</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-10-16T01:26:24.909439" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:24.909599" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:24.908851" elapsed="0.000796"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:24.908749" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:24.909849" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:24.909918" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:24.910021" 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-10-16T01:26:24.881616" elapsed="0.028428"/>
</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-10-16T01:26:24.911187" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:24.910996" elapsed="0.000251">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:24.911329" 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-10-16T01:26:24.910637" elapsed="0.000715"/>
</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-10-16T01:26:24.911633" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:24.911415" elapsed="0.000270"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:24.912158" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:24.911895" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:24.911724" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:24.911398" elapsed="0.000837"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:24.912746" 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-10-16T01:26:24.912394" elapsed="0.000377"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:24.912834" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:26:24.912960" 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-manganese/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-10-16T01:26:24.910339" elapsed="0.002644"/>
</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-10-16T01:26:24.914076" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:24.913879" elapsed="0.000256">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:24.914218" 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-10-16T01:26:24.913530" elapsed="0.000710"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:24.914402" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:26:24.914303" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:24.914287" elapsed="0.000190"/>
</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-10-16T01:26:24.914626" elapsed="0.000020"/>
</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-10-16T01:26:24.914826" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:24.914889" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:24.915014" 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-manganese/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-10-16T01:26:24.913233" elapsed="0.001803"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:24.916419" 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-10-16T01:26:24.916193" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:24.916917" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:24.916653" 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-10-16T01:26:24.920898" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:24.920950" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:24.921089" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:24.917241" elapsed="0.004173">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:24.917018" elapsed="0.004472">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:24.921671" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:24.921520" elapsed="0.000227"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:24.917001" elapsed="0.004768">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:24.922113" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:24.922232" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:24.922199" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:24.922183" elapsed="0.000106"/>
</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-10-16T01:26:24.922423" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:24.922485" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:26:24.915303" elapsed="0.007283">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:24.922653" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:26:24.871979" elapsed="0.050824">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:24.923200" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:24.922985" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:24.922937" elapsed="0.000385"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:24.923404" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:26:24.869831" elapsed="0.053736">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:24.867008" elapsed="0.056657">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:24.866674" elapsed="0.057087">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:24.924023" elapsed="0.000026"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:24.924374" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:24.924685" elapsed="0.000059"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:24.925094" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:24.925516" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:24.925864" elapsed="0.000024"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:24.926216" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:24.926487" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:26:24.859297" elapsed="0.067292">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:24.926650" elapsed="0.000014"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:24.857360" elapsed="0.069418">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:24.927016" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:24.926873" elapsed="0.000194"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:24.927231" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:24.927092" elapsed="0.000188"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:24.927442" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:24.927301" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:24.926855" elapsed="0.000655"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:24.857033" elapsed="0.070515">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:24.856613" elapsed="0.070987">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:24.927648" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:24.848182" elapsed="0.079578">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:24.927947" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:24.928166" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:24.928026" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:24.928011" elapsed="0.000223"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:24.928359" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:24.928525" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:24.928582" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:24.846587" elapsed="0.082085">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:24.846162" elapsed="0.082693">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:24.845928" elapsed="0.082981">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:24.845142" elapsed="0.083848">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:24.929196" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:24.822053" elapsed="0.107246">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:25.948578" elapsed="0.000447"/>
</kw>
<msg time="2026-10-16T01:26:25.949136" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:25.947326" elapsed="0.001924"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:25.946389" elapsed="0.003018"/>
</kw>
<msg time="2026-10-16T01:26:25.949498" 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-10-16T01:26:25.939869" elapsed="0.009720"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:25.938982" elapsed="0.010788"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:25.950838" 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-10-16T01:26:25.950269" elapsed="0.000666"/>
</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-10-16T01:26:25.957546" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:25.956790" elapsed="0.000814"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:25.958594" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:25.957992" elapsed="0.000657"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:25.958774" elapsed="0.000087"/>
</return>
<msg time="2026-10-16T01:26:25.959091" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:25.955975" elapsed="0.003167"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:25.959500" elapsed="0.000433"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:25.961047" 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-10-16T01:26:25.960315" elapsed="0.000788"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:25.961990" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:25.961430" elapsed="0.000614"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:25.962908" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:25.962356" elapsed="0.000606"/>
</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-10-16T01:26:25.971997" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:25.970298" elapsed="0.001814"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:25.972243" elapsed="0.000134"/>
</return>
<msg time="2026-10-16T01:26:25.972859" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:25.967033" elapsed="0.005957"/>
</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-10-16T01:26:25.995567" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:25.995147" elapsed="0.000457"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:25.996592" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:25.996304" elapsed="0.000386">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:25.996846" 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-10-16T01:26:25.995853" elapsed="0.001026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:25.997622" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:25.997182" elapsed="0.000482"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:25.998097" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:25.998288" 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-10-16T01:26:25.997937" elapsed="0.000384"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:25.998936" 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-10-16T01:26:25.998586" elapsed="0.000409"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:26.000487" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:25.999937" elapsed="0.000592"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:26.000993" 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-10-16T01:26:26.000718" 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-10-16T01:26:26.001299" 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-10-16T01:26:26.001483" elapsed="0.000022"/>
</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-10-16T01:26:26.001665" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:26.001169" elapsed="0.000563"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:26.001060" elapsed="0.000701"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:26.001815" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:26:26.001948" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:25.999428" elapsed="0.002543"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:25.999081" elapsed="0.002919"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:26.002175" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:26.002025" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:25.999057" elapsed="0.003188"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:26.002818" 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-10-16T01:26:26.002399" elapsed="0.000446"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:26.002888" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:25.994416" elapsed="0.008571"/>
</kw>
<msg time="2026-10-16T01:26:26.003035" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:25.988769" elapsed="0.014311"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:26.006852" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:26.010607" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:26.014418" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:26.014631" elapsed="0.000020"/>
</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-10-16T01:26:26.014842" 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-10-16T01:26:26.015194" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:26.015048" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:26.015031" elapsed="0.000250"/>
</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-10-16T01:26:26.015470" 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-10-16T01:26:26.015655" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:26.015851" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:26.015005" elapsed="0.000896"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:26.014913" elapsed="0.001012"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:26.016076" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:26.016143" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:26.016248" 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-10-16T01:26:25.987925" elapsed="0.028347"/>
</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-10-16T01:26:26.017394" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:26.017200" elapsed="0.000255">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:26.017537" 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-10-16T01:26:26.016876" elapsed="0.000683"/>
</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-10-16T01:26:26.017868" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:26.017621" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:26.018373" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:26.018112" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:26.017945" elapsed="0.000484"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:26.017605" elapsed="0.000843"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:26.018972" 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-10-16T01:26:26.018604" elapsed="0.000392"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:26.019041" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:26:26.019162" 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-manganese/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-10-16T01:26:26.016542" elapsed="0.002643"/>
</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-10-16T01:26:26.020261" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:26.020072" elapsed="0.000248">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:26.020402" 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-10-16T01:26:26.019741" elapsed="0.000683"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:26.020624" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:26:26.020524" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:26.020506" elapsed="0.000213"/>
</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-10-16T01:26:26.020883" 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-10-16T01:26:26.021061" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:26.021121" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:26.021245" 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-manganese/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-10-16T01:26:26.019429" elapsed="0.001839"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:26.022667" 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-10-16T01:26:26.022438" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:26.023152" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:26.022932" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:26:26.027250" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:26.027304" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:26.027401" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:26.023475" elapsed="0.004299">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:26.023253" elapsed="0.004616">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:26.028052" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:26.027900" elapsed="0.000220"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:26.023236" elapsed="0.004907">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:26.028486" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:26.028606" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:26.028573" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:26.028557" elapsed="0.000109"/>
</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-10-16T01:26:26.028832" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:26.028899" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:26:26.021721" elapsed="0.007290">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:26.029096" elapsed="0.000019"/>
</return>
<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="FAIL" start="2026-10-16T01:26:25.978322" elapsed="0.050914">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:26.029625" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:26.029406" elapsed="0.000358"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:26.029358" elapsed="0.000462"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:26.029909" elapsed="0.000038"/>
</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="FAIL" start="2026-10-16T01:26:25.976177" elapsed="0.053901">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:25.973447" elapsed="0.056733">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:25.973404" elapsed="0.056850">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:26.030503" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:26.030877" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:26.031199" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:26.031550" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:26.032021" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:26.032338" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:26.032686" elapsed="0.000047"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:26.032965" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:26:25.965608" elapsed="0.067459">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:26.033129" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:25.963779" elapsed="0.069439">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:26.033436" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:26.033296" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:26.033643" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:26.033508" elapsed="0.000183"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:26.033890" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:26.033736" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:26.033281" elapsed="0.000677"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:25.963422" elapsed="0.070575">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:25.963056" elapsed="0.070993">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:26.034097" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:25.954558" elapsed="0.079629">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:26.034360" elapsed="0.000049"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:26.034612" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:26.034471" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:26.034456" elapsed="0.000225"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:26.034939" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:26.035118" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:26.035177" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:25.952907" elapsed="0.082363">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:25.952408" elapsed="0.082924">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:25.952164" elapsed="0.083217">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:25.951374" elapsed="0.084088">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:26.035670" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:25.930000" elapsed="0.105790">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:27.048261" elapsed="0.000266"/>
</kw>
<msg time="2026-10-16T01:26:27.048607" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:27.047460" elapsed="0.001228"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:27.046908" elapsed="0.001917"/>
</kw>
<msg time="2026-10-16T01:26:27.048884" 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-10-16T01:26:27.042622" elapsed="0.006320"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:27.042098" elapsed="0.006937"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:27.049670" 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-10-16T01:26:27.049344" elapsed="0.000404"/>
</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-10-16T01:26:27.053846" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:27.053347" elapsed="0.000536"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:27.054466" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:27.054091" elapsed="0.000408"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:27.054558" elapsed="0.000039"/>
</return>
<msg time="2026-10-16T01:26:27.054760" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:27.052857" elapsed="0.001936"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:27.055013" elapsed="0.000177"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:27.055959" 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-10-16T01:26:27.055416" elapsed="0.000578"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:27.056521" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:27.056201" elapsed="0.000353"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:27.057095" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:27.056769" elapsed="0.000360"/>
</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-10-16T01:26:27.062495" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:27.061623" elapsed="0.000940"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:27.062643" elapsed="0.000112"/>
</return>
<msg time="2026-10-16T01:26:27.063043" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:27.059588" elapsed="0.003533"/>
</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-10-16T01:26:27.085990" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:27.085519" elapsed="0.000508"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:27.087020" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:27.086687" elapsed="0.000433">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:27.087237" 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-10-16T01:26:27.086242" elapsed="0.001027"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:27.087970" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:27.087501" elapsed="0.000504"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:27.088407" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:27.088605" 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-10-16T01:26:27.088247" elapsed="0.000391"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:27.089249" 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-10-16T01:26:27.088940" elapsed="0.000367"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:27.090764" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:27.090422" elapsed="0.000412"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:27.091434" 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-10-16T01:26:27.091078" elapsed="0.000389"/>
</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-10-16T01:26:27.091893" elapsed="0.000030"/>
</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-10-16T01:26:27.092148" 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-10-16T01:26:27.092397" elapsed="0.000027"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:27.091676" elapsed="0.000791"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:27.091526" elapsed="0.000981"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:27.092563" elapsed="0.000035"/>
</return>
<msg time="2026-10-16T01:26:27.092763" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:27.089945" elapsed="0.002851"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:27.089391" elapsed="0.003458"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:27.093083" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:27.092884" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:27.089367" elapsed="0.003815"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:27.093963" 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-10-16T01:26:27.093393" elapsed="0.000651"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:27.094109" elapsed="0.000038"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:27.084820" elapsed="0.009430"/>
</kw>
<msg time="2026-10-16T01:26:27.094316" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:27.078942" elapsed="0.015438"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:27.098767" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:27.102540" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:27.106349" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:27.106526" elapsed="0.000020"/>
</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-10-16T01:26:27.106715" 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-10-16T01:26:27.107068" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:27.106926" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:27.106913" elapsed="0.000228"/>
</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-10-16T01:26:27.107290" elapsed="0.000019"/>
</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-10-16T01:26:27.107463" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:27.107620" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:27.106886" elapsed="0.000781"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:27.106787" elapsed="0.000903"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:27.107864" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:27.107933" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:27.108036" 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-10-16T01:26:27.078086" elapsed="0.029973"/>
</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-10-16T01:26:27.109193" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:27.109002" elapsed="0.000251">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:27.109335" 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-10-16T01:26:27.108653" elapsed="0.000705"/>
</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-10-16T01:26:27.109635" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:27.109421" elapsed="0.000266"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:27.110163" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:27.109897" elapsed="0.000290"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:27.109727" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:27.109405" elapsed="0.000834"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:27.110746" 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-10-16T01:26:27.110394" elapsed="0.000377"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:27.110827" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:26:27.110952" 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-manganese/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-10-16T01:26:27.108321" elapsed="0.002655"/>
</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-10-16T01:26:27.112045" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:27.111855" elapsed="0.000248">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:27.112185" 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-10-16T01:26:27.111514" elapsed="0.000693"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:27.112530" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:26:27.112427" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:27.112253" elapsed="0.000356"/>
</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-10-16T01:26:27.112776" 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-10-16T01:26:27.112963" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:27.113025" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:27.113150" 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-manganese/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-10-16T01:26:27.111219" elapsed="0.001954"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:27.114383" 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-10-16T01:26:27.114158" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:27.114853" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:27.114607" 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-10-16T01:26:27.119007" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:27.119062" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:27.119164" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:27.115174" elapsed="0.004351">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:27.114953" elapsed="0.004681">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:27.119848" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:27.119667" elapsed="0.000241"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:27.114937" elapsed="0.004993">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:27.120260" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:27.120378" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:27.120346" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:27.120330" elapsed="0.000106"/>
</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-10-16T01:26:27.120570" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:27.120632" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:26:27.113441" elapsed="0.007308">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:27.120830" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:26:27.068200" elapsed="0.052756">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:27.121336" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:27.121121" elapsed="0.000296"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:27.121075" elapsed="0.000382"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:27.121538" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:26:27.065968" elapsed="0.055751">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:27.063416" elapsed="0.058418">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:27.063388" elapsed="0.058519">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:27.122157" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:27.122500" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:27.122852" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:27.123197" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:27.123623" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:27.123973" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:27.124319" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:27.124557" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:26:27.058794" elapsed="0.065864">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:27.124787" elapsed="0.000029"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:27.057625" elapsed="0.067271">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:27.125120" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:27.124976" elapsed="0.000194"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:27.125326" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:27.125192" elapsed="0.000182"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:27.125535" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:27.125395" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:27.124960" elapsed="0.000643"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:27.057420" elapsed="0.068221">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:27.057187" elapsed="0.068505">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:27.125764" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:27.051982" elapsed="0.073886">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:27.126040" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:27.126256" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:27.126117" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:27.126102" elapsed="0.000221"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:27.126446" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:27.126611" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:27.126668" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:27.050997" elapsed="0.075894">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:27.050676" elapsed="0.076278">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:27.050515" elapsed="0.076487">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:27.050048" elapsed="0.077035">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:27.127289" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:27.036501" elapsed="0.090892">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:28.148340" elapsed="0.000414"/>
</kw>
<msg time="2026-10-16T01:26:28.148879" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:28.147043" elapsed="0.002030"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:28.146052" elapsed="0.003185"/>
</kw>
<msg time="2026-10-16T01:26:28.149328" 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-10-16T01:26:28.139514" elapsed="0.009903"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:28.138656" elapsed="0.010908"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:28.150584" 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-10-16T01:26:28.150072" elapsed="0.000604"/>
</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-10-16T01:26:28.157592" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:28.156733" elapsed="0.000915"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:28.158647" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:28.158047" elapsed="0.000685"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:28.158848" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:26:28.159135" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:28.155929" elapsed="0.003257"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:28.159510" elapsed="0.000339"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:28.160934" 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-10-16T01:26:28.160215" elapsed="0.000775"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:28.161871" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:28.161313" elapsed="0.000614"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:28.162948" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:28.162338" elapsed="0.000665"/>
</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-10-16T01:26:28.171595" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:28.170242" elapsed="0.001530"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:28.171934" elapsed="0.000134"/>
</return>
<msg time="2026-10-16T01:26:28.172496" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:28.166985" elapsed="0.005635"/>
</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-10-16T01:26:28.197728" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:28.197285" elapsed="0.000481"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:28.198717" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:28.198435" elapsed="0.000386">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:28.198942" 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-10-16T01:26:28.197998" elapsed="0.000976"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:28.199636" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:28.199209" elapsed="0.000462"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:28.200089" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:28.200307" 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-10-16T01:26:28.199934" elapsed="0.000406"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:28.200957" 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-10-16T01:26:28.200606" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:28.202275" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:28.201954" elapsed="0.000377"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:28.203159" 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-10-16T01:26:28.202570" elapsed="0.000624"/>
</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-10-16T01:26:28.203587" elapsed="0.000028"/>
</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-10-16T01:26:28.203874" 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-10-16T01:26:28.204126" elapsed="0.000028"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:28.203408" elapsed="0.000791"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:28.203255" elapsed="0.000983"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:28.204293" elapsed="0.000037"/>
</return>
<msg time="2026-10-16T01:26:28.204475" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:28.201442" elapsed="0.003065"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:28.201100" elapsed="0.003447"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:28.204815" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:28.204579" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:28.201076" elapsed="0.003840"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:28.205652" 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-10-16T01:26:28.205129" elapsed="0.000559"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:28.205770" elapsed="0.000052"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:28.196553" elapsed="0.009373"/>
</kw>
<msg time="2026-10-16T01:26:28.205990" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:28.190923" elapsed="0.015130"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:28.211378" elapsed="0.000035"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:28.215855" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:28.219643" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:28.219881" 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-10-16T01:26:28.220063" elapsed="0.000019"/>
</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-10-16T01:26:28.220403" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:28.220263" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:28.220249" elapsed="0.000226"/>
</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-10-16T01:26:28.220626" elapsed="0.000018"/>
</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-10-16T01:26:28.220826" 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-10-16T01:26:28.220989" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:28.220222" elapsed="0.000816"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:28.220131" elapsed="0.000930"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:28.221211" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:28.221278" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:28.221383" 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-10-16T01:26:28.190059" elapsed="0.031347"/>
</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-10-16T01:26:28.222504" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:28.222315" elapsed="0.000248">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:28.222645" 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-10-16T01:26:28.221989" elapsed="0.000679"/>
</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-10-16T01:26:28.222976" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:28.222748" elapsed="0.000280"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:28.223475" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:28.223211" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:28.223051" elapsed="0.000480"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:28.222731" elapsed="0.000820"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:28.224075" 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-10-16T01:26:28.223722" elapsed="0.000378"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:28.224145" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:26:28.224269" 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-manganese/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-10-16T01:26:28.221663" elapsed="0.002629"/>
</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-10-16T01:26:28.225362" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:28.225174" elapsed="0.000246">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:28.225502" 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-10-16T01:26:28.224857" elapsed="0.000667"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:28.225686" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-10-16T01:26:28.225588" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:28.225571" elapsed="0.000207"/>
</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-10-16T01:26:28.225940" elapsed="0.000020"/>
</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-10-16T01:26:28.226147" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:28.226208" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:28.226334" 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-manganese/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-10-16T01:26:28.224534" elapsed="0.001823"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:28.227762" 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-10-16T01:26:28.227513" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:28.228228" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:28.228005" elapsed="0.000264"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:26:28.231480" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:28.231532" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:28.231634" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:28.228551" elapsed="0.003449">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:28.228330" elapsed="0.003746">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:28.232262" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:28.232106" elapsed="0.000215"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:28.228314" elapsed="0.004029">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:28.232677" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:28.232826" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:28.232782" elapsed="0.000082"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:28.232765" 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-10-16T01:26:28.233020" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:28.233083" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:26:28.226626" elapsed="0.006562">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:28.233255" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:26:28.180264" elapsed="0.053115">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:28.233781" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:28.233543" elapsed="0.000334"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:28.233496" elapsed="0.000420"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:28.233997" elapsed="0.000034"/>
</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="FAIL" start="2026-10-16T01:26:28.177328" elapsed="0.056866">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:28.173208" elapsed="0.061086">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:28.173165" elapsed="0.061200">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:28.234609" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:28.234986" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:28.235303" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:28.235648" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:28.236112" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:28.236428" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:28.236819" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:28.237058" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:26:28.165618" elapsed="0.071542">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:28.237221" elapsed="0.000014"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:28.163855" elapsed="0.073453">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:28.237528" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:28.237387" elapsed="0.000190"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:28.237759" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:28.237600" elapsed="0.000224"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:28.237988" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:28.237846" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:28.237372" elapsed="0.000684"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:28.163468" elapsed="0.074625">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:28.163097" elapsed="0.075048">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:28.238193" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:28.154517" elapsed="0.083765">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:28.238456" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:28.238672" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:28.238533" elapsed="0.000316"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:28.238518" elapsed="0.000354"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:28.239038" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:28.239208" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:28.239267" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:28.152898" elapsed="0.086463">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:28.152401" elapsed="0.087022">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:28.152165" elapsed="0.087306">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:28.151167" elapsed="0.088384">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:28.239774" elapsed="0.000036"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:28.128034" elapsed="0.111860">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:29.258519" elapsed="0.000672"/>
</kw>
<msg time="2026-10-16T01:26:29.259302" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:29.257288" elapsed="0.002122"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:29.256348" elapsed="0.003217"/>
</kw>
<msg time="2026-10-16T01:26:29.259654" 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-10-16T01:26:29.249589" elapsed="0.010194"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:29.248757" elapsed="0.011205"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:29.260994" 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-10-16T01:26:29.260423" elapsed="0.000664"/>
</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-10-16T01:26:29.267691" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:29.266961" elapsed="0.000822"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:29.268773" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:29.268138" elapsed="0.000906"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:29.269143" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:26:29.269434" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:29.266130" elapsed="0.003357"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:29.269872" elapsed="0.000318"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:29.271297" 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-10-16T01:26:29.270560" elapsed="0.000793"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:29.272257" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:29.271683" elapsed="0.000627"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:29.273273" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:29.272620" elapsed="0.000708"/>
</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-10-16T01:26:29.282134" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:29.280540" elapsed="0.001707"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:29.282375" elapsed="0.000133"/>
</return>
<msg time="2026-10-16T01:26:29.283163" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:29.277319" elapsed="0.005969"/>
</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-10-16T01:26:29.307603" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:29.307178" elapsed="0.000462"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:29.308602" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:29.308337" elapsed="0.000351">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:29.308876" 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-10-16T01:26:29.307895" elapsed="0.001014"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:29.309574" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:29.309145" elapsed="0.000464"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:29.310024" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:29.310201" 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-10-16T01:26:29.309868" elapsed="0.000366"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:29.310853" 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-10-16T01:26:29.310502" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:29.312352" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:29.311846" elapsed="0.000565"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:29.313046" 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-10-16T01:26:29.312656" elapsed="0.000424"/>
</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-10-16T01:26:29.313471" elapsed="0.000029"/>
</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-10-16T01:26:29.313744" elapsed="0.000033"/>
</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-10-16T01:26:29.314014" elapsed="0.000028"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:29.313291" elapsed="0.000795"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:29.313140" elapsed="0.000983"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:29.314179" elapsed="0.000036"/>
</return>
<msg time="2026-10-16T01:26:29.314359" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:29.311341" elapsed="0.003049"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:29.310997" elapsed="0.003433"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:29.314663" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:29.314462" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:29.310972" elapsed="0.003812"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:29.315540" 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-10-16T01:26:29.315015" elapsed="0.000561"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:29.315637" elapsed="0.000036"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:29.306447" elapsed="0.009367"/>
</kw>
<msg time="2026-10-16T01:26:29.315929" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:29.300785" elapsed="0.015211"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:29.321277" elapsed="0.000035"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:29.325717" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:29.329463" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:29.329639" elapsed="0.000020"/>
</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-10-16T01:26:29.329840" 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-10-16T01:26:29.330177" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:29.330038" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:29.330025" elapsed="0.000224"/>
</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-10-16T01:26:29.330399" elapsed="0.000019"/>
</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-10-16T01:26:29.330573" elapsed="0.000018"/>
</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-10-16T01:26:29.330747" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:29.329998" elapsed="0.000810"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:29.329909" elapsed="0.000924"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:29.330980" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:29.331048" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:29.331152" 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-10-16T01:26:29.299939" elapsed="0.031237"/>
</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-10-16T01:26:29.332260" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:29.332071" elapsed="0.000248">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:29.332433" 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-10-16T01:26:29.331739" elapsed="0.000718"/>
</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-10-16T01:26:29.332750" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:29.332520" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:29.333260" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:29.332996" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:29.332837" elapsed="0.000481"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:29.332503" elapsed="0.000835"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:29.333856" 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-10-16T01:26:29.333494" elapsed="0.000386"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:29.333926" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:26:29.334050" 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-manganese/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-10-16T01:26:29.331429" elapsed="0.002643"/>
</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-10-16T01:26:29.335137" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:29.334950" elapsed="0.000244">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:29.335276" 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-10-16T01:26:29.334604" elapsed="0.000695"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:29.335458" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:26:29.335361" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:29.335345" elapsed="0.000189"/>
</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-10-16T01:26:29.335682" 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-10-16T01:26:29.335878" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:29.335938" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:29.336062" 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-manganese/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-10-16T01:26:29.334311" elapsed="0.001774"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:29.337458" 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-10-16T01:26:29.337235" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:29.337936" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:29.337683" 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-10-16T01:26:29.341871" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:29.341923" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:29.342016" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:29.338253" elapsed="0.004096">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:29.338035" elapsed="0.004389">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:29.342603" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:29.342454" elapsed="0.000255"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:29.338019" elapsed="0.004716">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:29.343074" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:29.343199" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:29.343162" elapsed="0.000075"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:29.343146" elapsed="0.000111"/>
</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-10-16T01:26:29.343389" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:29.343451" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:26:29.336520" elapsed="0.007031">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:29.343618" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:26:29.290259" elapsed="0.053499">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:29.344152" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:29.343936" elapsed="0.000297"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:29.343889" elapsed="0.000383"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:29.344354" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:26:29.287568" elapsed="0.056948">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:29.283766" elapsed="0.060847">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:29.283691" elapsed="0.060993">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:29.344963" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:29.345306" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:29.345611" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:29.345984" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:29.346401" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:29.346729" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:29.347086" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:29.347321" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:26:29.276014" elapsed="0.071407">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:29.347487" elapsed="0.000014"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:29.274180" elapsed="0.073395">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:29.347905" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:29.347696" elapsed="0.000261"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:29.348114" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:29.347979" elapsed="0.000184"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:29.348324" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:29.348184" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:29.347680" elapsed="0.000712"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:29.273848" elapsed="0.074582">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:29.273423" elapsed="0.075059">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:29.348529" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:29.264688" elapsed="0.083932">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:29.348915" elapsed="0.000021"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:29.349136" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:29.348997" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:29.348981" elapsed="0.000223"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:29.349328" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:29.349494" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:29.349552" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:29.263015" elapsed="0.086629">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:29.262534" elapsed="0.087188">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:29.262303" elapsed="0.087471">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:29.261521" elapsed="0.088348">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:29.350076" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:29.240482" elapsed="0.109699">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:30.368873" elapsed="0.000384"/>
</kw>
<msg time="2026-10-16T01:26:30.369357" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:30.367571" elapsed="0.001890"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:30.366372" elapsed="0.003242"/>
</kw>
<msg time="2026-10-16T01:26:30.369852" 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-10-16T01:26:30.359757" elapsed="0.010193"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:30.358914" elapsed="0.011188"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:30.371143" 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-10-16T01:26:30.370559" elapsed="0.000677"/>
</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-10-16T01:26:30.377971" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:30.377188" elapsed="0.000841"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:30.379015" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:30.378358" elapsed="0.000711"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:30.379162" elapsed="0.000059"/>
</return>
<msg time="2026-10-16T01:26:30.379443" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:30.376348" elapsed="0.003145"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:30.379866" elapsed="0.000286"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:30.381241" 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-10-16T01:26:30.380520" elapsed="0.000776"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:30.382183" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:30.381620" elapsed="0.000616"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:30.383096" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:30.382543" elapsed="0.000606"/>
</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-10-16T01:26:30.391861" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:30.390337" elapsed="0.001636"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:30.392101" elapsed="0.000133"/>
</return>
<msg time="2026-10-16T01:26:30.392659" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:30.387171" elapsed="0.005689"/>
</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-10-16T01:26:30.422586" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:30.422159" elapsed="0.000463"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:30.423612" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:30.423328" elapsed="0.000391">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:30.423852" 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-10-16T01:26:30.422873" elapsed="0.001011"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:30.424600" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:30.424118" elapsed="0.000517"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:30.425055" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:30.425225" 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-10-16T01:26:30.424897" elapsed="0.000361"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:30.425928" 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-10-16T01:26:30.425521" elapsed="0.000465"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:30.427417" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:30.427098" elapsed="0.000376"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:30.428100" 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-10-16T01:26:30.427733" elapsed="0.000401"/>
</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-10-16T01:26:30.428520" elapsed="0.000028"/>
</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-10-16T01:26:30.428807" elapsed="0.000032"/>
</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-10-16T01:26:30.429059" elapsed="0.000026"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:30.428343" elapsed="0.000786"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:30.428193" elapsed="0.000974"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:30.429221" elapsed="0.000036"/>
</return>
<msg time="2026-10-16T01:26:30.429465" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:30.426584" elapsed="0.002914"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:30.426072" elapsed="0.003466"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:30.429810" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:30.429571" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:30.426048" elapsed="0.003862"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:30.430648" 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-10-16T01:26:30.430121" elapsed="0.000562"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:30.430765" elapsed="0.000077"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:30.421434" elapsed="0.009515"/>
</kw>
<msg time="2026-10-16T01:26:30.431013" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:30.415771" elapsed="0.015306"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:30.436395" elapsed="0.000043"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:30.440314" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:30.444104" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:30.444278" elapsed="0.000020"/>
</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-10-16T01:26:30.444453" elapsed="0.000019"/>
</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-10-16T01:26:30.444850" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:30.444646" elapsed="0.000261"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:30.444633" elapsed="0.000296"/>
</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-10-16T01:26:30.445081" elapsed="0.000019"/>
</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-10-16T01:26:30.445255" elapsed="0.000018"/>
</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-10-16T01:26:30.445413" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:30.444607" elapsed="0.000854"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:30.444519" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:30.445631" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:30.445711" elapsed="0.000016"/>
</return>
<msg time="2026-10-16T01:26:30.445830" 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-10-16T01:26:30.414937" elapsed="0.030917"/>
</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-10-16T01:26:30.446943" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:30.446739" elapsed="0.000263">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:30.447084" 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-10-16T01:26:30.446407" elapsed="0.000700"/>
</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-10-16T01:26:30.447384" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:30.447169" elapsed="0.000266"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:30.447905" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:30.447612" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:30.447458" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:30.447152" elapsed="0.000829"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:30.448470" 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-10-16T01:26:30.448136" elapsed="0.000359"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:30.448540" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:26:30.448662" 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-manganese/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-10-16T01:26:30.446107" elapsed="0.002577"/>
</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-10-16T01:26:30.449772" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:30.449570" elapsed="0.000275">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:30.449930" 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-10-16T01:26:30.449251" elapsed="0.000702"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:30.450275" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:26:30.450171" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:30.449999" elapsed="0.000352"/>
</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-10-16T01:26:30.450499" elapsed="0.000020"/>
</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-10-16T01:26:30.450671" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:30.450748" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:26:30.450888" 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-manganese/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-10-16T01:26:30.448955" elapsed="0.001988"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:30.452157" 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-10-16T01:26:30.451933" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:30.452602" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:30.452387" elapsed="0.000255"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:26:30.458891" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:30.458943" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:30.459037" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:30.452975" elapsed="0.006399">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:30.452717" elapsed="0.006735">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:30.459630" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:30.459482" elapsed="0.000206"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:30.452684" elapsed="0.007043">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:30.460072" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:30.460191" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:30.460159" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:30.460143" elapsed="0.000106"/>
</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-10-16T01:26:30.460384" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:30.460446" elapsed="0.000013"/>
</return>
<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="FAIL" start="2026-10-16T01:26:30.451214" elapsed="0.009331">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:30.460612" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:26:30.401088" elapsed="0.059670">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:30.461153" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:30.460937" elapsed="0.000304"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:30.460890" elapsed="0.000390"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:30.461363" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:26:30.397485" elapsed="0.064040">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:30.393313" elapsed="0.068343">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:30.393272" elapsed="0.068478">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:30.462014" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:30.462365" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:30.462673" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:30.463059" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:30.463481" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:30.463853" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:30.464205" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:30.464443" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:26:30.385837" elapsed="0.078715">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:30.464613" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:30.383982" elapsed="0.080741">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:30.464961" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:30.464819" elapsed="0.000192"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:30.465169" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:30.465034" elapsed="0.000184"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:30.465380" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:30.465240" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:30.464802" elapsed="0.000646"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:30.383603" elapsed="0.081883">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:30.383241" elapsed="0.082296">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:30.465584" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:30.374953" elapsed="0.090722">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:30.465950" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:30.466169" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:30.466028" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:30.466013" elapsed="0.000246"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:30.466390" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:30.466571" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:30.466631" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:30.373347" elapsed="0.093545">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:30.372909" elapsed="0.094048">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:30.372612" elapsed="0.094394">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:30.371673" elapsed="0.095414">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:30.467297" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:30.350744" elapsed="0.116656">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:31.489477" elapsed="0.000465"/>
</kw>
<msg time="2026-10-16T01:26:31.490061" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:31.488194" elapsed="0.001986"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:31.487257" elapsed="0.003276"/>
</kw>
<msg time="2026-10-16T01:26:31.490634" 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-10-16T01:26:31.480410" elapsed="0.010350"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:31.479412" elapsed="0.011525"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:31.491988" 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-10-16T01:26:31.491415" elapsed="0.000664"/>
</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-10-16T01:26:31.499100" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:31.498248" elapsed="0.000937"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:31.500186" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:31.499521" elapsed="0.000719"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:31.500335" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:26:31.500622" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:31.497253" elapsed="0.003420"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:31.501061" elapsed="0.000288"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:31.502437" 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-10-16T01:26:31.501743" elapsed="0.000749"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:31.503389" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:31.502876" elapsed="0.000567"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:31.504456" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:31.503812" elapsed="0.000699"/>
</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-10-16T01:26:31.513248" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:31.511875" elapsed="0.001575"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:31.513582" elapsed="0.000395"/>
</return>
<msg time="2026-10-16T01:26:31.514422" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:31.508534" elapsed="0.006013"/>
</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-10-16T01:26:31.537588" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:31.537155" elapsed="0.000470"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:31.538663" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:31.538358" elapsed="0.000447">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:31.538926" 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-10-16T01:26:31.537881" elapsed="0.001078"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:31.539623" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:31.539195" elapsed="0.000463"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:31.540080" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:31.540278" 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-10-16T01:26:31.539922" elapsed="0.000391"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:31.540842" 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-10-16T01:26:31.540591" 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-10-16T01:26:31.541773" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:31.541525" elapsed="0.000305"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:31.542397" 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-10-16T01:26:31.542002" elapsed="0.000421"/>
</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-10-16T01:26:31.542717" 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-10-16T01:26:31.542918" elapsed="0.000022"/>
</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-10-16T01:26:31.543096" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:31.542575" elapsed="0.000572"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:31.542466" elapsed="0.000710"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:31.543216" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:26:31.543350" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:31.541192" elapsed="0.002181"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:31.540945" elapsed="0.002457"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:31.543571" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:31.543428" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:31.540927" elapsed="0.002714"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:31.544211" 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-10-16T01:26:31.543823" elapsed="0.000414"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:31.544282" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:31.536351" elapsed="0.008039"/>
</kw>
<msg time="2026-10-16T01:26:31.544471" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:31.530385" elapsed="0.014134"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:31.548378" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:31.552283" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:31.556097" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:31.556275" elapsed="0.000020"/>
</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-10-16T01:26:31.556459" elapsed="0.000018"/>
</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-10-16T01:26:31.556827" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:31.556657" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:31.556643" elapsed="0.000258"/>
</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-10-16T01:26:31.557053" elapsed="0.000019"/>
</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-10-16T01:26:31.557228" elapsed="0.000018"/>
</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-10-16T01:26:31.557387" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:31.556617" elapsed="0.000818"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:31.556527" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:31.557606" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:31.557674" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:31.557809" 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-10-16T01:26:31.529488" elapsed="0.028345"/>
</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-10-16T01:26:31.558949" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:31.558727" elapsed="0.000281">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:31.559089" 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-10-16T01:26:31.558391" elapsed="0.000720"/>
</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-10-16T01:26:31.559389" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:31.559174" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:31.559992" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:31.559659" elapsed="0.000358"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:31.559497" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:31.559158" elapsed="0.000911"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:31.560566" 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-10-16T01:26:31.560226" elapsed="0.000364"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:31.560635" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:26:31.560795" 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-manganese/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-10-16T01:26:31.558095" elapsed="0.002725"/>
</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-10-16T01:26:31.561908" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:31.561677" elapsed="0.000290">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:31.562050" 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-10-16T01:26:31.561360" elapsed="0.000713"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:31.562241" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:26:31.562138" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:31.562120" elapsed="0.000197"/>
</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-10-16T01:26:31.562466" elapsed="0.000020"/>
</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-10-16T01:26:31.562635" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:31.562694" elapsed="0.000031"/>
</return>
<msg time="2026-10-16T01:26:31.562856" 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-manganese/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-10-16T01:26:31.561061" elapsed="0.001818"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:31.564275" 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-10-16T01:26:31.564047" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:31.564739" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:31.564504" 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-10-16T01:26:31.569968" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:31.570023" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:31.570130" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:31.565112" elapsed="0.005381">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:31.564890" elapsed="0.005682">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:31.570769" elapsed="0.000087"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:31.570602" elapsed="0.000295"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:31.564872" elapsed="0.006047">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:31.571253" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:31.571409" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:31.571375" elapsed="0.000073"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:31.571357" elapsed="0.000111"/>
</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-10-16T01:26:31.571605" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:31.571668" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:26:31.563152" elapsed="0.008648">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:31.571873" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:26:31.519768" elapsed="0.052233">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:31.572388" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:31.572169" elapsed="0.000301"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:31.572121" elapsed="0.000389"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:31.572591" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:26:31.517555" elapsed="0.055223">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:31.515076" elapsed="0.057826">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:31.515031" elapsed="0.057943">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:31.573220" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:31.573564" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:31.573906" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:31.574255" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:31.574678" elapsed="0.000045"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:31.575033" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:31.575387" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:31.575627" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:26:31.507230" elapsed="0.068537">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:31.575846" elapsed="0.000017"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:31.505360" elapsed="0.070579">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:31.576159" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:31.576019" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:31.576413" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:31.576231" elapsed="0.000233"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:31.576628" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:31.576487" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:31.576003" elapsed="0.000713"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:31.505033" elapsed="0.071725">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:31.504606" elapsed="0.072217">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:31.576875" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:31.495880" elapsed="0.081088">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:31.577143" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:31.577361" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:31.577221" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:31.577206" elapsed="0.000224"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:31.577556" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:31.577851" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:31.577914" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:31.494261" elapsed="0.083746">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:31.493767" elapsed="0.084302">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:31.493475" elapsed="0.084643">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:31.492520" elapsed="0.085692">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:31.578423" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:31.468154" elapsed="0.110374">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:32.597736" elapsed="0.000415"/>
</kw>
<msg time="2026-10-16T01:26:32.598252" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:32.596445" elapsed="0.001912"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:32.595254" elapsed="0.003254"/>
</kw>
<msg time="2026-10-16T01:26:32.598599" 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-10-16T01:26:32.588482" elapsed="0.010206"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:32.587616" elapsed="0.011272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:32.600022" 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-10-16T01:26:32.599439" elapsed="0.000678"/>
</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-10-16T01:26:32.606852" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:32.605904" elapsed="0.001008"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:32.607908" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:32.607244" elapsed="0.000718"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:32.608056" elapsed="0.000060"/>
</return>
<msg time="2026-10-16T01:26:32.608339" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:32.605071" elapsed="0.003319"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:32.608748" elapsed="0.000311"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:32.610145" 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-10-16T01:26:32.609424" elapsed="0.000777"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:32.611202" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:32.610526" elapsed="0.000729"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:32.612114" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:32.611563" elapsed="0.000606"/>
</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-10-16T01:26:32.620923" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:32.619481" elapsed="0.001552"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:32.621159" elapsed="0.000133"/>
</return>
<msg time="2026-10-16T01:26:32.621973" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:32.616180" elapsed="0.005930"/>
</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-10-16T01:26:32.645913" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:32.645455" elapsed="0.000494"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:32.646908" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:32.646609" elapsed="0.000386">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:32.647112" 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-10-16T01:26:32.646169" elapsed="0.000974"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:32.647847" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:32.647376" elapsed="0.000507"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:32.648260" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:32.648439" 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-10-16T01:26:32.648106" elapsed="0.000365"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:32.649078" 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-10-16T01:26:32.648752" elapsed="0.000383"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:32.650591" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:32.650077" elapsed="0.000572"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:32.651338" 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-10-16T01:26:32.650924" elapsed="0.000449"/>
</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-10-16T01:26:32.651800" elapsed="0.000030"/>
</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-10-16T01:26:32.652057" 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-10-16T01:26:32.652326" elapsed="0.000026"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:32.651585" elapsed="0.000807"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:32.651433" elapsed="0.000992"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:32.652468" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:26:32.652597" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:32.649568" elapsed="0.003052"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:32.649219" elapsed="0.003430"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:32.652844" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:32.652672" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:32.649195" elapsed="0.003720"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:32.653444" 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-10-16T01:26:32.653067" elapsed="0.000402"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:32.653512" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:32.644743" elapsed="0.008867"/>
</kw>
<msg time="2026-10-16T01:26:32.653657" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:32.639069" elapsed="0.014649"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:32.657544" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:32.661380" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:32.665194" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:32.665371" elapsed="0.000019"/>
</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-10-16T01:26:32.665547" elapsed="0.000019"/>
</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-10-16T01:26:32.665916" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:32.665758" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:32.665745" elapsed="0.000244"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:32.666140" elapsed="0.000019"/>
</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-10-16T01:26:32.666314" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:32.666507" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:32.665717" elapsed="0.000840"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:32.665613" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:32.666744" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:32.666829" elapsed="0.000016"/>
</return>
<msg time="2026-10-16T01:26:32.666934" 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-10-16T01:26:32.638204" elapsed="0.028754"/>
</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-10-16T01:26:32.668070" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:32.667880" elapsed="0.000249">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:32.668210" 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-10-16T01:26:32.667511" elapsed="0.000721"/>
</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-10-16T01:26:32.668509" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:32.668295" elapsed="0.000266"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:32.669033" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:32.668756" elapsed="0.000301"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:32.668584" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:32.668278" elapsed="0.000830"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:32.669596" 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-10-16T01:26:32.669263" elapsed="0.000357"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:32.669664" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:26:32.669819" 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-manganese/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-10-16T01:26:32.667215" elapsed="0.002628"/>
</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-10-16T01:26:32.670918" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:32.670691" elapsed="0.000286">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:32.671059" 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-10-16T01:26:32.670379" elapsed="0.000702"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:32.671243" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:26:32.671145" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:32.671129" elapsed="0.000189"/>
</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-10-16T01:26:32.671468" elapsed="0.000020"/>
</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-10-16T01:26:32.671637" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:32.671696" elapsed="0.000030"/>
</return>
<msg time="2026-10-16T01:26:32.671852" 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-manganese/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-10-16T01:26:32.670084" elapsed="0.001792"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:32.673264" 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-10-16T01:26:32.673040" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:32.673771" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:32.673532" 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-10-16T01:26:32.677602" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:32.677652" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:32.677765" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:32.674108" elapsed="0.004008">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:32.673887" elapsed="0.004304">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:32.678369" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:32.678221" elapsed="0.000207"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:32.673870" elapsed="0.004580">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:32.678813" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:32.678936" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:32.678903" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:32.678887" elapsed="0.000107"/>
</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-10-16T01:26:32.679128" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:32.679191" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:26:32.672315" elapsed="0.006976">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:32.679358" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:26:32.628507" elapsed="0.050977">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:32.679907" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:32.679651" elapsed="0.000339"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:32.679603" elapsed="0.000428"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:32.680115" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:26:32.626383" elapsed="0.053896">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:32.622563" elapsed="0.057820">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:32.622521" elapsed="0.057934">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:32.680713" elapsed="0.000025"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:32.681100" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:32.681406" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:32.681770" elapsed="0.000036"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:32.682213" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:32.682529" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:32.682911" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:32.683146" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:26:32.614866" elapsed="0.068381">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:32.683309" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:32.613015" elapsed="0.070382">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:32.683616" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:32.683477" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:32.683864" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:32.683689" elapsed="0.000225"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:32.684077" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:32.683936" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:32.683461" elapsed="0.000684"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:32.612626" elapsed="0.071557">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:32.612261" elapsed="0.071973">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:32.684282" elapsed="0.000013"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:32.603666" elapsed="0.080704">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:32.684544" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:32.684847" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:32.684621" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:32.684606" elapsed="0.000313"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:32.685045" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:32.685210" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:32.685268" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:32.602081" elapsed="0.083279">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:32.601585" elapsed="0.083836">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:32.601350" elapsed="0.084156">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:32.600558" elapsed="0.085031">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:32.685895" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:32.579146" elapsed="0.106856">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:33.704637" elapsed="0.000442"/>
</kw>
<msg time="2026-10-16T01:26:33.705179" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:33.703186" elapsed="0.002098"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:33.702256" elapsed="0.003177"/>
</kw>
<msg time="2026-10-16T01:26:33.705520" 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-10-16T01:26:33.695762" elapsed="0.009847"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:33.694913" elapsed="0.010892"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:33.706825" 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-10-16T01:26:33.706267" elapsed="0.000653"/>
</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-10-16T01:26:33.713446" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:33.712665" elapsed="0.000838"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:33.714628" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:33.714023" elapsed="0.000659"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:33.714835" elapsed="0.000063"/>
</return>
<msg time="2026-10-16T01:26:33.715122" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:33.711889" elapsed="0.003283"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:33.715496" elapsed="0.000344"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:33.716933" 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-10-16T01:26:33.716207" elapsed="0.000781"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:33.717870" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:33.717314" elapsed="0.000610"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:33.718989" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:33.718227" elapsed="0.000821"/>
</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-10-16T01:26:33.727836" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:33.726358" elapsed="0.001588"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:33.728072" elapsed="0.000132"/>
</return>
<msg time="2026-10-16T01:26:33.728679" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:33.723047" elapsed="0.005839"/>
</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-10-16T01:26:33.755588" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:33.755164" elapsed="0.000460"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:33.756643" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:33.756328" elapsed="0.000441">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:33.756909" 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-10-16T01:26:33.755877" elapsed="0.001063"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:33.757607" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:33.757174" elapsed="0.000469"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:33.758058" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:33.758230" 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-10-16T01:26:33.757904" elapsed="0.000358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:33.758904" 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-10-16T01:26:33.758553" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:33.760399" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:33.760061" elapsed="0.000408"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:33.761136" 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-10-16T01:26:33.760784" elapsed="0.000386"/>
</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-10-16T01:26:33.761609" elapsed="0.000028"/>
</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-10-16T01:26:33.761896" elapsed="0.000032"/>
</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-10-16T01:26:33.762174" elapsed="0.000028"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:33.761398" elapsed="0.000849"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:33.761228" elapsed="0.001056"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:33.762339" elapsed="0.000036"/>
</return>
<msg time="2026-10-16T01:26:33.762518" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:33.759554" elapsed="0.002996"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:33.759044" elapsed="0.003546"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:33.762857" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:33.762623" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:33.759021" elapsed="0.003936"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:33.763697" 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-10-16T01:26:33.763168" elapsed="0.000588"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:33.763834" elapsed="0.000038"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:33.754378" elapsed="0.009596"/>
</kw>
<msg time="2026-10-16T01:26:33.764038" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:33.748517" elapsed="0.015586"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:33.768141" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:33.771956" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:33.775737" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:33.775924" elapsed="0.000020"/>
</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-10-16T01:26:33.776100" elapsed="0.000019"/>
</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-10-16T01:26:33.776434" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:33.776296" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:33.776282" elapsed="0.000225"/>
</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-10-16T01:26:33.776658" elapsed="0.000019"/>
</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-10-16T01:26:33.776894" 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-10-16T01:26:33.777055" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:33.776256" elapsed="0.000848"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:33.776167" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:33.777274" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:33.777340" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:26:33.777444" 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-10-16T01:26:33.747616" elapsed="0.029852"/>
</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-10-16T01:26:33.778572" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:33.778374" elapsed="0.000258">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:33.778730" 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-10-16T01:26:33.778055" elapsed="0.000699"/>
</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-10-16T01:26:33.779045" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:33.778830" elapsed="0.000266"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:33.779536" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:33.779275" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:33.779119" elapsed="0.000473"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:33.778813" elapsed="0.000799"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:33.780130" 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-10-16T01:26:33.779795" elapsed="0.000398"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:33.780241" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:26:33.780367" 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-manganese/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-10-16T01:26:33.777744" elapsed="0.002646"/>
</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-10-16T01:26:33.781470" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:33.781274" elapsed="0.000255">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:33.781612" 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-10-16T01:26:33.780958" elapsed="0.000677"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:33.781984" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:26:33.781880" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:33.781681" elapsed="0.000381"/>
</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-10-16T01:26:33.782211" 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-10-16T01:26:33.782382" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:33.782441" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:33.782565" 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-manganese/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-10-16T01:26:33.780630" elapsed="0.001958"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:33.783827" 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-10-16T01:26:33.783574" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:33.784271" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:33.784053" elapsed="0.000258"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:26:33.788058" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:33.788109" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:33.788201" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:33.784610" elapsed="0.003919">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:33.784370" elapsed="0.004233">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:33.788817" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:33.788633" elapsed="0.000243"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:33.784354" elapsed="0.004544">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:33.789227" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:33.789345" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:33.789312" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:33.789296" elapsed="0.000106"/>
</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-10-16T01:26:33.789536" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:33.789628" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:26:33.782882" elapsed="0.006866">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:33.789829" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:26:33.737414" elapsed="0.052543">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:33.790341" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:33.790125" elapsed="0.000304"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:33.790077" elapsed="0.000393"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:33.790553" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:26:33.733658" elapsed="0.057082">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:33.729343" elapsed="0.061515">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:33.729300" elapsed="0.061631">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:33.791176" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:33.791517" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:33.791851" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:33.792195" elapsed="0.000021"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:33.792621" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:33.792970" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:33.793315" elapsed="0.000019"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:33.793587" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:26:33.721691" elapsed="0.071995">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:33.793798" elapsed="0.000026"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:33.719951" elapsed="0.073949">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:33.794119" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:33.793981" elapsed="0.000188"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:33.794327" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:33.794192" elapsed="0.000184"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:33.794537" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:33.794398" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:33.793963" elapsed="0.000682"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:33.719554" elapsed="0.075134">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:33.719146" elapsed="0.075616">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:33.794823" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:33.710488" elapsed="0.084426">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:33.795089" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:33.795309" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:33.795168" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:33.795152" elapsed="0.000227"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:33.795507" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:33.795673" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:33.795858" elapsed="0.000015"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:33.708928" elapsed="0.087025">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:33.708367" elapsed="0.087647">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:33.708133" elapsed="0.087929">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:33.707354" elapsed="0.088788">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:33.796349" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:33.686559" elapsed="0.109894">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:34.810256" elapsed="0.000292"/>
</kw>
<msg time="2026-10-16T01:26:34.810619" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:34.809388" elapsed="0.001301"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:34.808629" elapsed="0.002198"/>
</kw>
<msg time="2026-10-16T01:26:34.810885" 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-10-16T01:26:34.804534" elapsed="0.006408"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:34.804018" elapsed="0.007018"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:34.811686" 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-10-16T01:26:34.811324" elapsed="0.000468"/>
</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-10-16T01:26:34.818287" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:34.817492" elapsed="0.000853"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:34.819337" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:34.818676" elapsed="0.000714"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:34.819484" elapsed="0.000059"/>
</return>
<msg time="2026-10-16T01:26:34.819820" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:34.816665" elapsed="0.003209"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:34.820202" elapsed="0.000282"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:34.821731" 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-10-16T01:26:34.821030" elapsed="0.000780"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:34.822641" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:34.822138" elapsed="0.000555"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:34.823562" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:34.823067" elapsed="0.000547"/>
</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-10-16T01:26:34.877820" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:34.877137" elapsed="0.000739"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:34.877946" elapsed="0.000072"/>
</return>
<msg time="2026-10-16T01:26:34.878215" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:34.875608" elapsed="0.002664"/>
</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-10-16T01:26:34.894579" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:34.894267" elapsed="0.000338"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:34.895338" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:34.895111" elapsed="0.000301">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:34.895497" 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-10-16T01:26:34.894790" elapsed="0.000729"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:34.896039" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:34.895689" elapsed="0.000376"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:34.896346" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:34.896504" 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-10-16T01:26:34.896227" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:34.896977" 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-10-16T01:26:34.896734" 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-10-16T01:26:34.897924" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:34.897664" elapsed="0.000301"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:34.898392" 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-10-16T01:26:34.898138" elapsed="0.000278"/>
</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-10-16T01:26:34.898723" 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-10-16T01:26:34.898921" elapsed="0.000022"/>
</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-10-16T01:26:34.899158" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:34.898577" elapsed="0.000633"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:34.898462" elapsed="0.000776"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:34.899280" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:26:34.899408" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:34.897329" elapsed="0.002103"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:34.897081" 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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:34.899633" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:34.899490" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:34.897064" elapsed="0.002657"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:34.900284" 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-10-16T01:26:34.899892" elapsed="0.000417"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:34.900353" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:34.893745" elapsed="0.006708"/>
</kw>
<msg time="2026-10-16T01:26:34.900502" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:34.889451" elapsed="0.011097"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:34.904574" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:34.908496" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:34.912378" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:34.912558" elapsed="0.000020"/>
</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-10-16T01:26:34.912758" elapsed="0.000032"/>
</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-10-16T01:26:34.913116" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:34.912974" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:34.912960" 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-10-16T01:26:34.913342" elapsed="0.000019"/>
</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-10-16T01:26:34.913518" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:34.913679" elapsed="0.000033"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:34.912933" elapsed="0.000811"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:34.912842" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:34.913974" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:34.914044" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:26:34.914149" 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-10-16T01:26:34.888849" elapsed="0.025323"/>
</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-10-16T01:26:34.915422" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:34.915228" elapsed="0.000253">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:34.915564" 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-10-16T01:26:34.914745" elapsed="0.000842"/>
</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-10-16T01:26:34.915900" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:34.915650" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:34.916407" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:34.916144" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:34.915976" elapsed="0.000488"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:34.915633" elapsed="0.000850"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:34.917010" 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-10-16T01:26:34.916639" elapsed="0.000395"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:34.917080" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:26:34.917203" 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-manganese/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-10-16T01:26:34.914431" elapsed="0.002794"/>
</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-10-16T01:26:34.918309" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:34.918110" elapsed="0.000258">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:34.918450" 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-10-16T01:26:34.917789" elapsed="0.000684"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:34.918633" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:26:34.918537" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:34.918520" elapsed="0.000205"/>
</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-10-16T01:26:34.918891" elapsed="0.000020"/>
</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-10-16T01:26:34.919063" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:34.919122" elapsed="0.000013"/>
</return>
<msg time="2026-10-16T01:26:34.919245" 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-manganese/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-10-16T01:26:34.917466" elapsed="0.001803"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:34.920484" 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-10-16T01:26:34.920260" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:34.920962" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:34.920730" elapsed="0.000272"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:26:34.925187" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:34.925272" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:34.925385" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:34.921284" elapsed="0.004504">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:34.921061" elapsed="0.004807">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:34.926049" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:34.925898" elapsed="0.000210"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:34.921045" elapsed="0.005085">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:34.926469" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:34.926588" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:34.926555" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:34.926539" elapsed="0.000107"/>
</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-10-16T01:26:34.926813" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:34.926877" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:26:34.919537" elapsed="0.007442">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:34.927047" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:26:34.881929" elapsed="0.045244">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:34.927563" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:34.927338" elapsed="0.000307"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:34.927290" elapsed="0.000396"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:34.927814" elapsed="0.000037"/>
</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="FAIL" start="2026-10-16T01:26:34.880389" elapsed="0.047594">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:34.878481" elapsed="0.049601">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:34.878460" elapsed="0.049696">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:34.928402" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:34.928778" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:34.929092" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:34.929439" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:34.929955" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:34.930269" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:34.930617" elapsed="0.000019"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:34.930900" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:26:34.874880" elapsed="0.056122">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:34.931064" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:34.824679" elapsed="0.106475">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:34.931376" elapsed="0.000174"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:34.931235" elapsed="0.000348"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:34.931779" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:34.931606" elapsed="0.000225"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:34.931997" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:34.931853" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:34.931219" elapsed="0.000847"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:34.824306" elapsed="0.107798">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:34.823859" elapsed="0.108298">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:34.932206" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:34.815170" elapsed="0.117128">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:34.932474" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:34.932691" elapsed="0.000110"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:34.932552" elapsed="0.000280"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:34.932537" elapsed="0.000317"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:34.932984" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:34.933151" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:34.933210" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:34.813398" elapsed="0.119906">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:34.812952" elapsed="0.120415">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:34.812647" elapsed="0.120770">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:34.812089" elapsed="0.121409">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:34.933822" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:34.797007" elapsed="0.136923">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:35.952465" elapsed="0.000449"/>
</kw>
<msg time="2026-10-16T01:26:35.953029" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:35.951203" elapsed="0.001941"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:35.950261" elapsed="0.003039"/>
</kw>
<msg time="2026-10-16T01:26:35.953396" 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-10-16T01:26:35.943600" elapsed="0.009889"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:35.942760" elapsed="0.010879"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:35.954687" 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-10-16T01:26:35.954170" elapsed="0.000660"/>
</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-10-16T01:26:35.961979" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:35.961176" elapsed="0.000863"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:35.963051" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:35.962379" elapsed="0.000727"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:35.963202" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:26:35.963492" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:35.960322" elapsed="0.003222"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:35.963922" elapsed="0.000290"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:35.965430" 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-10-16T01:26:35.964589" elapsed="0.000900"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:35.966404" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:35.965883" elapsed="0.000576"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:35.967343" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:35.966824" elapsed="0.000574"/>
</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-10-16T01:26:35.975791" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:35.974377" elapsed="0.001529"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:35.976030" elapsed="0.000136"/>
</return>
<msg time="2026-10-16T01:26:35.976588" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:35.971184" elapsed="0.005797"/>
</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-10-16T01:26:36.000072" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:35.999603" elapsed="0.000505"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:36.001269" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:36.000976" elapsed="0.000390">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:36.001484" 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-10-16T01:26:36.000479" elapsed="0.001036"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:36.002223" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:36.001787" elapsed="0.000472"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:36.002795" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:36.002991" 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-10-16T01:26:36.002488" elapsed="0.000536"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:36.003601" 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-10-16T01:26:36.003292" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:36.004986" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:36.004599" elapsed="0.000445"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:36.005632" 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-10-16T01:26:36.005285" elapsed="0.000381"/>
</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-10-16T01:26:36.006093" elapsed="0.000028"/>
</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-10-16T01:26:36.006344" 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-10-16T01:26:36.006598" elapsed="0.000026"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:36.005914" elapsed="0.000754"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:36.005747" elapsed="0.000979"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:36.006799" elapsed="0.000037"/>
</return>
<msg time="2026-10-16T01:26:36.006980" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:36.004129" elapsed="0.002883"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:36.003779" elapsed="0.003273"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:36.007284" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:36.007086" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:36.003739" elapsed="0.003642"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:36.008171" 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-10-16T01:26:36.007596" elapsed="0.000611"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:36.008267" elapsed="0.000036"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:35.998910" elapsed="0.009495"/>
</kw>
<msg time="2026-10-16T01:26:36.008470" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:35.993176" elapsed="0.015359"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:36.014131" elapsed="0.000035"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:36.019558" elapsed="0.000035"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:36.025064" elapsed="0.000041"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:36.025324" elapsed="0.000028"/>
</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-10-16T01:26:36.025578" elapsed="0.000027"/>
</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-10-16T01:26:36.026092" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:36.025894" elapsed="0.000269"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:36.025874" elapsed="0.000320"/>
</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-10-16T01:26:36.026404" elapsed="0.000027"/>
</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-10-16T01:26:36.026647" elapsed="0.000026"/>
</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-10-16T01:26:36.026906" elapsed="0.000027"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:36.025836" elapsed="0.001139"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:36.025673" elapsed="0.001334"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:36.027213" elapsed="0.000027"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:36.027307" elapsed="0.000020"/>
</return>
<msg time="2026-10-16T01:26:36.027452" 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-10-16T01:26:35.992309" elapsed="0.035176"/>
</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-10-16T01:26:36.029093" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:36.028810" elapsed="0.000367">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:36.029292" 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-10-16T01:26:36.028327" elapsed="0.000997"/>
</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-10-16T01:26:36.029732" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:36.029411" elapsed="0.000411"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:36.030545" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:36.030076" elapsed="0.000502"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:36.029854" elapsed="0.000769"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:36.029388" elapsed="0.001263"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:36.031380" 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-10-16T01:26:36.030912" elapsed="0.000502"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:36.031477" elapsed="0.000036"/>
</return>
<msg time="2026-10-16T01:26:36.031649" 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-manganese/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-10-16T01:26:36.027908" elapsed="0.003773"/>
</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-10-16T01:26:36.033274" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:36.033008" elapsed="0.000347">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:36.033470" 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-10-16T01:26:36.032529" elapsed="0.000973"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:36.033750" elapsed="0.000049"/>
</return>
<status status="PASS" start="2026-10-16T01:26:36.033591" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:36.033568" elapsed="0.000308"/>
</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-10-16T01:26:36.034085" elapsed="0.000029"/>
</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-10-16T01:26:36.034324" elapsed="0.000027"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:36.034407" elapsed="0.000019"/>
</return>
<msg time="2026-10-16T01:26:36.034579" 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-manganese/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-10-16T01:26:36.032113" elapsed="0.002498"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:36.036350" 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-10-16T01:26:36.036036" elapsed="0.000371"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:36.037009" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:36.036663" elapsed="0.000402"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:26:36.041989" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:36.042041" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:36.042139" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:36.037460" elapsed="0.005036">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:36.037149" elapsed="0.005423">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:36.042782" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:36.042603" elapsed="0.000241"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:36.037125" elapsed="0.005741">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:36.043204" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:36.043324" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:36.043290" elapsed="0.000074"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:36.043274" elapsed="0.000111"/>
</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-10-16T01:26:36.043521" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:36.043584" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:26:36.035026" elapsed="0.008661">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:36.043814" elapsed="0.000020"/>
</return>
<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="FAIL" start="2026-10-16T01:26:35.982533" elapsed="0.061416">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:36.044339" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:36.044118" elapsed="0.000309"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:36.044070" elapsed="0.000398"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:36.044554" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:26:35.980355" elapsed="0.064387">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:35.977442" elapsed="0.067422">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:35.977399" elapsed="0.067540">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:36.045185" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:36.045529" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:36.045870" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:36.046221" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:36.046645" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:36.046998" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:36.047347" elapsed="0.000019"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:36.047588" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:26:35.969793" elapsed="0.077896">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:36.047800" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:35.968253" elapsed="0.079641">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:36.048117" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:36.047975" elapsed="0.000194"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:36.048330" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:36.048192" elapsed="0.000188"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:36.048545" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:36.048402" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:36.047959" elapsed="0.000656"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:35.967921" elapsed="0.080732">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:35.967497" elapsed="0.081230">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:36.048790" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:35.958955" elapsed="0.089963">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:36.049098" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:36.049322" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:36.049179" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:36.049163" elapsed="0.000230"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:36.049520" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:36.049692" elapsed="0.000143"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:36.049879" elapsed="0.000015"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:35.957309" elapsed="0.092665">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:35.956853" elapsed="0.093185">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:35.956065" elapsed="0.094023">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:35.955273" elapsed="0.094898">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:36.050381" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:35.934674" elapsed="0.115813">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:37.069876" elapsed="0.000401"/>
</kw>
<msg time="2026-10-16T01:26:37.070392" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:37.068553" elapsed="0.001954"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:37.067610" elapsed="0.003056"/>
</kw>
<msg time="2026-10-16T01:26:37.070808" 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-10-16T01:26:37.060329" elapsed="0.010573"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:37.059466" elapsed="0.011588"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:37.072114" 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-10-16T01:26:37.071535" elapsed="0.000673"/>
</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-10-16T01:26:37.078846" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:37.078050" elapsed="0.000856"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:37.079905" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:37.079243" elapsed="0.000720"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:37.080166" elapsed="0.000066"/>
</return>
<msg time="2026-10-16T01:26:37.080469" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:37.077214" elapsed="0.003307"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:37.080907" elapsed="0.000291"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:37.082296" 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-10-16T01:26:37.081569" elapsed="0.000784"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:37.083251" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:37.082684" elapsed="0.000620"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:37.084200" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:37.083622" elapsed="0.000631"/>
</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-10-16T01:26:37.092948" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:37.091486" elapsed="0.001573"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:37.093188" elapsed="0.000132"/>
</return>
<msg time="2026-10-16T01:26:37.093811" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:37.088268" elapsed="0.005673"/>
</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-10-16T01:26:37.118920" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:37.118421" elapsed="0.000538"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:37.120015" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:37.119661" elapsed="0.000454">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:37.120235" 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-10-16T01:26:37.119182" elapsed="0.001087"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:37.121041" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:37.120536" elapsed="0.000542"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:37.121473" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:37.121679" 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-10-16T01:26:37.121310" elapsed="0.000426"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:37.122352" 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-10-16T01:26:37.122031" elapsed="0.000379"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:37.123730" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:37.123373" elapsed="0.000440"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:37.124624" 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-10-16T01:26:37.124063" elapsed="0.000597"/>
</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-10-16T01:26:37.125115" elapsed="0.000029"/>
</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-10-16T01:26:37.125379" elapsed="0.000033"/>
</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-10-16T01:26:37.125639" elapsed="0.000028"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:37.124928" elapsed="0.000808"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:37.124746" elapsed="0.001049"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:37.125857" elapsed="0.000037"/>
</return>
<msg time="2026-10-16T01:26:37.126102" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:37.122894" elapsed="0.003242"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:37.122503" elapsed="0.003674"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:37.126427" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:37.126210" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:37.122478" elapsed="0.004051"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:37.127339" 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-10-16T01:26:37.126780" elapsed="0.000595"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:37.127443" elapsed="0.000045"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:37.117507" elapsed="0.010109"/>
</kw>
<msg time="2026-10-16T01:26:37.127695" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:37.111463" elapsed="0.016333"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:37.133585" elapsed="0.000042"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:37.139438" elapsed="0.000036"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:37.145069" elapsed="0.000036"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:37.145343" elapsed="0.000030"/>
</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-10-16T01:26:37.145597" elapsed="0.000027"/>
</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-10-16T01:26:37.146215" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:37.145915" elapsed="0.000380"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:37.145896" elapsed="0.000440"/>
</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-10-16T01:26:37.146550" elapsed="0.000028"/>
</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-10-16T01:26:37.146833" elapsed="0.000028"/>
</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-10-16T01:26:37.147057" elapsed="0.000026"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:37.145858" elapsed="0.001266"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:37.145692" elapsed="0.001465"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:37.147381" elapsed="0.000029"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:37.147479" elapsed="0.000020"/>
</return>
<msg time="2026-10-16T01:26:37.147625" 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-10-16T01:26:37.110552" elapsed="0.037105"/>
</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-10-16T01:26:37.149431" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:37.149081" elapsed="0.000473">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:37.149752" 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-10-16T01:26:37.148546" elapsed="0.001293"/>
</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-10-16T01:26:37.150141" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:37.149908" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:37.150682" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:37.150386" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:37.150221" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:37.149890" elapsed="0.000918"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:37.151337" 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-10-16T01:26:37.150974" elapsed="0.000389"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:37.151410" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:26:37.151544" 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-manganese/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-10-16T01:26:37.148130" elapsed="0.003438"/>
</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-10-16T01:26:37.152757" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:37.152528" elapsed="0.000305">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:37.152918" 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-10-16T01:26:37.152201" elapsed="0.000741"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:37.153110" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:26:37.153007" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:37.152990" elapsed="0.000199"/>
</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-10-16T01:26:37.153354" 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-10-16T01:26:37.153533" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:37.153594" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:26:37.153740" 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-manganese/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-10-16T01:26:37.151880" elapsed="0.001909"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:37.155320" 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-10-16T01:26:37.155081" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:37.155812" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:37.155553" 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-10-16T01:26:37.159664" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:37.159741" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:37.159901" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:37.156147" elapsed="0.004130">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:37.155919" elapsed="0.004439">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:37.160544" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:37.160389" elapsed="0.000215"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:37.155902" elapsed="0.004724">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:37.161108" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:37.161235" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:37.161202" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:37.161185" elapsed="0.000111"/>
</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-10-16T01:26:37.161443" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:37.161516" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:26:37.154334" elapsed="0.007287">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:37.161690" elapsed="0.000031"/>
</return>
<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="FAIL" start="2026-10-16T01:26:37.100141" elapsed="0.061711">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:37.162265" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:37.162040" elapsed="0.000310"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:37.161991" elapsed="0.000400"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:37.162478" elapsed="0.000043"/>
</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="FAIL" start="2026-10-16T01:26:37.097948" elapsed="0.064734">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:37.094421" elapsed="0.068439">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:37.094377" elapsed="0.068566">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:37.163216" elapsed="0.000025"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:37.163586" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:37.163951" elapsed="0.000023"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:37.164356" elapsed="0.000024"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:37.164840" elapsed="0.000024"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:37.165175" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:37.165541" elapsed="0.000022"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:37.165888" elapsed="0.000020"/>
</return>
<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="FAIL" start="2026-10-16T01:26:37.086601" elapsed="0.079395">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:37.166061" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:37.085131" elapsed="0.081023">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:37.166385" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:37.166239" elapsed="0.000204"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:37.166621" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:37.166472" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:37.166922" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:37.166733" elapsed="0.000244"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:37.166222" elapsed="0.000778"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:37.084789" elapsed="0.082260">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:37.084351" elapsed="0.082758">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:37.167171" elapsed="0.000016"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:37.075860" elapsed="0.091423">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:37.167536" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:37.167888" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:37.167625" elapsed="0.000322"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:37.167609" elapsed="0.000361"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:37.168102" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:37.168276" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:37.168336" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:37.074236" elapsed="0.094197">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:37.073781" elapsed="0.094724">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:37.073479" elapsed="0.095078">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:37.072685" elapsed="0.095959">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:37.168963" elapsed="0.000025"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:37.051323" elapsed="0.117754">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:38.192286" elapsed="0.000463"/>
</kw>
<msg time="2026-10-16T01:26:38.192882" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:38.190978" elapsed="0.002022"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:38.189953" elapsed="0.003221"/>
</kw>
<msg time="2026-10-16T01:26:38.193303" 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-10-16T01:26:38.182684" elapsed="0.010747"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:38.181814" elapsed="0.011829"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:38.194873" 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-10-16T01:26:38.194236" elapsed="0.000733"/>
</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-10-16T01:26:38.202141" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:38.201281" elapsed="0.000919"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:38.203281" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:38.202552" elapsed="0.000796"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:38.203445" elapsed="0.000066"/>
</return>
<msg time="2026-10-16T01:26:38.203881" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:38.200283" elapsed="0.003669"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:38.204291" elapsed="0.000323"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:38.205859" 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-10-16T01:26:38.205063" elapsed="0.000866"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:38.206942" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:38.206275" elapsed="0.000740"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:38.208069" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:38.207443" elapsed="0.000680"/>
</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-10-16T01:26:38.216132" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:38.215207" elapsed="0.000997"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:38.216286" elapsed="0.000097"/>
</return>
<msg time="2026-10-16T01:26:38.216657" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:38.212437" elapsed="0.004348"/>
</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-10-16T01:26:38.240784" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:38.240210" elapsed="0.000636"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:38.241904" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:38.241551" elapsed="0.000462">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:38.242135" 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-10-16T01:26:38.241090" elapsed="0.001078"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:38.243128" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:38.242602" elapsed="0.000564"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:38.243580" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:38.243821" 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-10-16T01:26:38.243412" elapsed="0.000447"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:38.244481" 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-10-16T01:26:38.244133" elapsed="0.000415"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:38.246002" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:38.245600" elapsed="0.000462"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:38.246961" 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-10-16T01:26:38.246307" elapsed="0.000692"/>
</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-10-16T01:26:38.247405" elapsed="0.000030"/>
</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-10-16T01:26:38.247666" elapsed="0.000052"/>
</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-10-16T01:26:38.247980" elapsed="0.000030"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:38.247223" elapsed="0.000836"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:38.247065" elapsed="0.001034"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:38.248157" elapsed="0.000041"/>
</return>
<msg time="2026-10-16T01:26:38.248364" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:38.245095" elapsed="0.003304"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:38.244638" elapsed="0.003804"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:38.248740" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:38.248478" elapsed="0.000368"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:38.244613" elapsed="0.004263"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:38.249661" 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-10-16T01:26:38.249100" elapsed="0.000619"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:38.249804" elapsed="0.000039"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:38.239404" elapsed="0.010549"/>
</kw>
<msg time="2026-10-16T01:26:38.250022" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:38.233194" elapsed="0.016896"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:38.255956" elapsed="0.000045"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:38.261647" elapsed="0.000036"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:38.265891" elapsed="0.000032"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:38.266133" 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-10-16T01:26:38.266313" elapsed="0.000019"/>
</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-10-16T01:26:38.266653" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:38.266513" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:38.266499" elapsed="0.000245"/>
</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-10-16T01:26:38.266911" 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-10-16T01:26:38.267087" elapsed="0.000018"/>
</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-10-16T01:26:38.267246" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:38.266472" elapsed="0.000821"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:38.266382" elapsed="0.000935"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:38.267465" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:38.267532" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:38.267657" 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-10-16T01:26:38.232278" elapsed="0.035410"/>
</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-10-16T01:26:38.268843" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:38.268611" elapsed="0.000294">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:38.268995" 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-10-16T01:26:38.268290" elapsed="0.000731"/>
</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-10-16T01:26:38.269318" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:38.269086" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:38.269893" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:38.269563" elapsed="0.000355"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:38.269396" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:38.269069" elapsed="0.000901"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:38.270496" 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-10-16T01:26:38.270145" elapsed="0.000375"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:38.270566" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:26:38.270689" 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-manganese/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-10-16T01:26:38.267990" elapsed="0.002739"/>
</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-10-16T01:26:38.271825" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:38.271606" elapsed="0.000286">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:38.271975" 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-10-16T01:26:38.271291" elapsed="0.000706"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:38.272196" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:26:38.272095" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:38.272077" elapsed="0.000196"/>
</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-10-16T01:26:38.272423" elapsed="0.000020"/>
</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-10-16T01:26:38.272616" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:38.272678" elapsed="0.000013"/>
</return>
<msg time="2026-10-16T01:26:38.272842" 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-manganese/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-10-16T01:26:38.270995" elapsed="0.001871"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:38.274268" 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-10-16T01:26:38.274039" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:38.274738" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:38.274496" 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-10-16T01:26:38.278781" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:38.278836" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:38.278946" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:38.275081" elapsed="0.004226">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:38.274856" elapsed="0.004530">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:38.279566" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:38.279416" elapsed="0.000209"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:38.274839" elapsed="0.004808">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:38.280021" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:38.280163" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:38.280129" elapsed="0.000073"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:38.280112" elapsed="0.000111"/>
</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-10-16T01:26:38.280359" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:38.280422" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:26:38.273143" elapsed="0.007380">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:38.280592" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:26:38.222073" elapsed="0.058695">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:38.281160" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:38.280940" elapsed="0.000334"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:38.280892" elapsed="0.000422"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:38.281397" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:26:38.219652" elapsed="0.061916">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:38.217092" elapsed="0.064575">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:38.217065" elapsed="0.064703">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:38.282020" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:38.282366" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:38.282673" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:38.283050" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:38.283480" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:38.283820" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:38.284168" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:38.284404" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:26:38.211031" elapsed="0.073474">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:38.284566" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:38.209036" elapsed="0.075619">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:38.284912" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:38.284765" elapsed="0.000197"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:38.285119" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:38.284984" elapsed="0.000183"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:38.285330" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:38.285189" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:38.284738" elapsed="0.000660"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:38.208624" elapsed="0.076813">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:38.208219" elapsed="0.077271">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:38.285539" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:38.198732" elapsed="0.086898">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:38.285893" elapsed="0.000050"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:38.286147" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:38.286006" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:38.285990" elapsed="0.000226"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:38.286341" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:38.286522" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:38.286580" elapsed="0.000015"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:38.197044" elapsed="0.089631">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:38.196516" elapsed="0.090327">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:38.196268" elapsed="0.090626">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:38.195426" elapsed="0.091550">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:38.287187" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:38.169685" elapsed="0.117607">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:39.306247" elapsed="0.000406"/>
</kw>
<msg time="2026-10-16T01:26:39.306815" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:39.304977" elapsed="0.001954"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:39.303956" elapsed="0.003135"/>
</kw>
<msg time="2026-10-16T01:26:39.307181" 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-10-16T01:26:39.296848" elapsed="0.010422"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:39.295981" elapsed="0.011437"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:39.308447" 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-10-16T01:26:39.307933" elapsed="0.000606"/>
</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-10-16T01:26:39.315194" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:39.314378" elapsed="0.000873"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:39.316240" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:39.315583" elapsed="0.000711"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:39.316387" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:26:39.316675" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:39.313542" elapsed="0.003234"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:39.317111" elapsed="0.000283"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:39.318603" 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-10-16T01:26:39.317815" elapsed="0.000844"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:39.319568" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:39.319051" elapsed="0.000571"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:39.320530" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:39.320023" elapsed="0.000560"/>
</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-10-16T01:26:39.329450" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:39.328001" elapsed="0.001557"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:39.329686" elapsed="0.000195"/>
</return>
<msg time="2026-10-16T01:26:39.330319" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:39.324351" elapsed="0.006098"/>
</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-10-16T01:26:39.363434" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:39.363009" elapsed="0.000462"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:39.364459" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:39.364173" elapsed="0.000381">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:39.364672" 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-10-16T01:26:39.363686" elapsed="0.001037"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:39.365405" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:39.364976" elapsed="0.000464"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:39.365860" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:39.366053" 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-10-16T01:26:39.365665" elapsed="0.000421"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:39.366658" 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-10-16T01:26:39.366352" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:39.368004" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:39.367649" elapsed="0.000412"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:39.368649" 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-10-16T01:26:39.368298" elapsed="0.000386"/>
</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-10-16T01:26:39.369119" elapsed="0.000028"/>
</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-10-16T01:26:39.369369" 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-10-16T01:26:39.369616" elapsed="0.000027"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:39.368942" elapsed="0.000744"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:39.368781" elapsed="0.000965"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:39.369818" elapsed="0.000037"/>
</return>
<msg time="2026-10-16T01:26:39.369999" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:39.367181" elapsed="0.002850"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:39.366838" elapsed="0.003232"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:39.370302" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:39.370104" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:39.366814" elapsed="0.003586"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:39.371384" 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-10-16T01:26:39.370613" elapsed="0.000859"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:39.371538" elapsed="0.000039"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:39.362269" elapsed="0.009414"/>
</kw>
<msg time="2026-10-16T01:26:39.371785" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:39.356130" elapsed="0.015730"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:39.377259" elapsed="0.000035"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:39.382581" elapsed="0.000035"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:39.387935" elapsed="0.000035"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:39.388182" 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-10-16T01:26:39.388427" elapsed="0.000026"/>
</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-10-16T01:26:39.388988" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:39.388792" elapsed="0.000248"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:39.388766" elapsed="0.000296"/>
</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-10-16T01:26:39.389228" elapsed="0.000019"/>
</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-10-16T01:26:39.389403" elapsed="0.000018"/>
</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-10-16T01:26:39.389561" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:39.388681" elapsed="0.000928"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:39.388525" elapsed="0.001108"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:39.389809" elapsed="0.000024"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:39.389886" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:39.389990" 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-10-16T01:26:39.354622" elapsed="0.035392"/>
</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-10-16T01:26:39.391152" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:39.390961" elapsed="0.000251">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:39.391294" 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-10-16T01:26:39.390605" elapsed="0.000712"/>
</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-10-16T01:26:39.391596" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:39.391381" elapsed="0.000267"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:39.392118" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:39.391856" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:39.391670" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:39.391364" elapsed="0.000829"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:39.392688" 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-10-16T01:26:39.392350" elapsed="0.000378"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:39.392786" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:26:39.392911" 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-manganese/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-10-16T01:26:39.390274" elapsed="0.002660"/>
</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-10-16T01:26:39.394011" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:39.393822" elapsed="0.000247">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:39.394151" 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-10-16T01:26:39.393476" elapsed="0.000698"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:39.394334" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:26:39.394236" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:39.394220" elapsed="0.000190"/>
</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-10-16T01:26:39.394558" elapsed="0.000020"/>
</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-10-16T01:26:39.394744" elapsed="0.000031"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:39.394823" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:39.394946" 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-manganese/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-10-16T01:26:39.393179" elapsed="0.001790"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:39.396181" 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-10-16T01:26:39.395956" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:39.396823" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:39.396407" elapsed="0.000458"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:26:39.400483" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:39.400536" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:39.400633" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:39.397150" elapsed="0.003866">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:39.396927" elapsed="0.004197">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:39.401307" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:39.401157" elapsed="0.000209"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:39.396909" elapsed="0.004479">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:39.401740" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:39.401881" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:39.401848" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:39.401832" elapsed="0.000108"/>
</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-10-16T01:26:39.402076" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:39.402138" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:26:39.395238" elapsed="0.007001">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:39.402306" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:26:39.338603" elapsed="0.063826">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:39.402842" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:39.402593" elapsed="0.000340"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:39.402546" elapsed="0.000427"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:39.403056" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:26:39.335122" elapsed="0.068096">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:39.331075" elapsed="0.072242">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:39.331030" elapsed="0.072359">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:39.403637" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:39.404013" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:39.404339" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:39.404687" elapsed="0.000041"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:39.405170" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:39.405477" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:39.405857" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:39.406092" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:26:39.322963" elapsed="0.083230">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:39.406285" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:39.321439" elapsed="0.084938">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:39.406596" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:39.406456" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:39.406836" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:39.406667" elapsed="0.000220"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:39.407049" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:39.406908" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:39.406440" elapsed="0.000677"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:39.321106" elapsed="0.086050">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:39.320678" elapsed="0.086530">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:39.407256" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:39.312147" elapsed="0.095199">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:39.407520" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:39.407816" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:39.407597" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:39.407582" elapsed="0.000314"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:39.408021" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:39.408186" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:39.408243" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:39.310515" elapsed="0.097820">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:39.310072" elapsed="0.098324">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:39.309829" elapsed="0.098615">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:39.309037" elapsed="0.099487">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:39.408812" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:39.287998" elapsed="0.120920">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:40.427556" elapsed="0.000452"/>
</kw>
<msg time="2026-10-16T01:26:40.428114" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:40.426323" elapsed="0.001999"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:40.425350" elapsed="0.003137"/>
</kw>
<msg time="2026-10-16T01:26:40.428578" 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-10-16T01:26:40.418319" elapsed="0.010349"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:40.417389" elapsed="0.011493"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:40.429915" 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-10-16T01:26:40.429349" elapsed="0.000660"/>
</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-10-16T01:26:40.436787" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:40.436001" elapsed="0.000846"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:40.437837" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:40.437180" elapsed="0.000713"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:40.437987" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:26:40.438271" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:40.435169" elapsed="0.003153"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:40.438647" elapsed="0.000339"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:40.440068" 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-10-16T01:26:40.439353" elapsed="0.000771"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:40.441044" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:40.440448" elapsed="0.000649"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:40.441982" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:40.441404" elapsed="0.000631"/>
</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-10-16T01:26:40.450910" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:40.449444" elapsed="0.001577"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:40.451147" elapsed="0.000134"/>
</return>
<msg time="2026-10-16T01:26:40.451766" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:40.446112" elapsed="0.005789"/>
</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-10-16T01:26:40.484916" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:40.484377" elapsed="0.000575"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:40.485929" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:40.485601" elapsed="0.000421">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:40.486141" 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-10-16T01:26:40.485167" elapsed="0.001005"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:40.486904" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:40.486405" elapsed="0.000535"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:40.487321" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:40.487549" 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-10-16T01:26:40.487168" elapsed="0.000415"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:40.488197" 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-10-16T01:26:40.487885" elapsed="0.000369"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:40.489521" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:40.489201" elapsed="0.000376"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:40.490385" 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-10-16T01:26:40.489856" elapsed="0.000564"/>
</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-10-16T01:26:40.490847" elapsed="0.000030"/>
</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-10-16T01:26:40.491103" elapsed="0.000032"/>
</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-10-16T01:26:40.491356" elapsed="0.000027"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:40.490631" elapsed="0.000796"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:40.490481" elapsed="0.000984"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:40.491520" elapsed="0.000036"/>
</return>
<msg time="2026-10-16T01:26:40.491724" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:40.488687" elapsed="0.003085"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:40.488339" elapsed="0.003475"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:40.492047" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:40.491848" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:40.488315" elapsed="0.003829"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:40.492925" 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-10-16T01:26:40.492355" elapsed="0.000605"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:40.493021" elapsed="0.000037"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:40.483650" elapsed="0.009509"/>
</kw>
<msg time="2026-10-16T01:26:40.493225" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:40.477621" elapsed="0.015669"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:40.498770" elapsed="0.000037"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:40.504423" elapsed="0.000037"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:40.508432" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:40.508642" elapsed="0.000020"/>
</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-10-16T01:26:40.508852" 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-10-16T01:26:40.509196" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:40.509053" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:40.509039" 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-10-16T01:26:40.509421" 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-10-16T01:26:40.509601" 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-10-16T01:26:40.509793" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:40.509013" elapsed="0.000831"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:40.508922" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:40.510019" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:40.510086" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:26:40.510191" 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-10-16T01:26:40.476197" elapsed="0.034017"/>
</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-10-16T01:26:40.511315" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:40.511125" elapsed="0.000250">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:40.511457" 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-10-16T01:26:40.510804" elapsed="0.000676"/>
</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-10-16T01:26:40.511787" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:40.511542" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:40.512285" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:40.512023" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:40.511865" elapsed="0.000478"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:40.511525" elapsed="0.000838"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:40.512887" 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-10-16T01:26:40.512519" elapsed="0.000392"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:40.512957" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:26:40.513078" 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-manganese/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-10-16T01:26:40.510474" elapsed="0.002626"/>
</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-10-16T01:26:40.514251" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:40.514063" elapsed="0.000247">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:40.514393" 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-10-16T01:26:40.513644" elapsed="0.000771"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:40.514583" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:26:40.514485" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:40.514469" elapsed="0.000190"/>
</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-10-16T01:26:40.514847" 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-10-16T01:26:40.515057" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:40.515120" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:26:40.515246" 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-manganese/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-10-16T01:26:40.513345" elapsed="0.001924"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:40.516762" 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-10-16T01:26:40.516475" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:40.517214" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:40.516994" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:26:40.521057" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:40.521109" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:40.521203" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:40.517541" elapsed="0.004007">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:40.517314" elapsed="0.004311">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:40.521837" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:40.521655" elapsed="0.000248"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:40.517297" elapsed="0.004628">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:40.522255" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:40.522374" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:40.522341" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:40.522325" elapsed="0.000106"/>
</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-10-16T01:26:40.522566" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:40.522629" elapsed="0.000013"/>
</return>
<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="FAIL" start="2026-10-16T01:26:40.515718" elapsed="0.007046">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:40.522835" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:26:40.460360" elapsed="0.062601">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:40.523342" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:40.523126" elapsed="0.000298"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:40.523080" elapsed="0.000383"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:40.523547" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:26:40.456456" elapsed="0.067323">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:40.452460" elapsed="0.071422">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:40.452417" elapsed="0.071538">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:40.524201" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:40.524544" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:40.524884" elapsed="0.000019"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:40.525228" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:40.525656" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:40.526001" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:40.526351" elapsed="0.000019"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:40.526585" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:26:40.444340" elapsed="0.082345">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:40.526800" elapsed="0.000019"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:40.442889" elapsed="0.084005">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:40.527113" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:40.526974" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:40.527319" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:40.527184" elapsed="0.000184"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:40.527527" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:40.527389" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:40.526958" elapsed="0.000637"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:40.442501" elapsed="0.085131">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:40.442129" elapsed="0.085555">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:40.527765" elapsed="0.000016"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:40.433822" elapsed="0.094037">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:40.528031" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:40.528248" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:40.528110" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:40.528094" elapsed="0.000222"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:40.528472" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:40.528644" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:40.528822" elapsed="0.000016"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:40.432102" elapsed="0.096818">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:40.431569" elapsed="0.097414">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:40.431333" elapsed="0.097699">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:40.430536" elapsed="0.098577">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:40.529321" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:40.409527" elapsed="0.119899">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:41.551652" elapsed="0.000473"/>
</kw>
<msg time="2026-10-16T01:26:41.552242" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:41.550388" elapsed="0.001970"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:41.549418" elapsed="0.003095"/>
</kw>
<msg time="2026-10-16T01:26:41.552602" 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-10-16T01:26:41.542679" elapsed="0.010012"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:41.541819" elapsed="0.011079"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:41.553939" 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-10-16T01:26:41.553375" elapsed="0.000660"/>
</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-10-16T01:26:41.560694" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:41.559953" elapsed="0.000860"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:41.561811" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:41.561147" elapsed="0.000722"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:41.561964" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:26:41.562256" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:41.559014" elapsed="0.003295"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:41.562639" elapsed="0.000338"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:41.564144" 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-10-16T01:26:41.563348" elapsed="0.000860"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:41.565192" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:41.564539" elapsed="0.000709"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:41.566287" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:41.565559" elapsed="0.000782"/>
</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-10-16T01:26:41.575053" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:41.573639" elapsed="0.001522"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:41.575290" elapsed="0.000132"/>
</return>
<msg time="2026-10-16T01:26:41.575984" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:41.570394" elapsed="0.005714"/>
</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-10-16T01:26:41.598950" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:41.598486" elapsed="0.000500"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:41.599995" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:41.599640" elapsed="0.000454">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:41.600212" 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-10-16T01:26:41.599201" elapsed="0.001043"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:41.600991" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:41.600479" elapsed="0.000548"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:41.601412" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:41.601613" 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-10-16T01:26:41.601253" elapsed="0.000401"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:41.602239" 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-10-16T01:26:41.602014" elapsed="0.000266"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:41.603187" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:41.602959" elapsed="0.000269"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:41.603829" 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-10-16T01:26:41.603400" elapsed="0.000454"/>
</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-10-16T01:26:41.604137" 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-10-16T01:26:41.604319" elapsed="0.000022"/>
</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-10-16T01:26:41.604497" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:41.604009" elapsed="0.000539"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:41.603899" elapsed="0.000677"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:41.604618" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:26:41.604784" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:41.602589" elapsed="0.002219"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:41.602341" elapsed="0.002496"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:41.605008" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:41.604863" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:41.602324" elapsed="0.002754"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:41.605617" 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-10-16T01:26:41.605231" elapsed="0.000411"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:41.605686" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:41.597723" elapsed="0.008104"/>
</kw>
<msg time="2026-10-16T01:26:41.605909" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:41.592006" elapsed="0.013952"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:41.609780" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:41.613615" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:41.617425" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:41.617601" elapsed="0.000020"/>
</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-10-16T01:26:41.617810" elapsed="0.000025"/>
</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-10-16T01:26:41.618152" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:41.618012" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:41.617999" elapsed="0.000226"/>
</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-10-16T01:26:41.618375" elapsed="0.000019"/>
</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-10-16T01:26:41.618550" elapsed="0.000018"/>
</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-10-16T01:26:41.618722" elapsed="0.000032"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:41.617973" elapsed="0.000812"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:41.617884" elapsed="0.000926"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:41.618967" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:41.619034" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:26:41.619139" 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-10-16T01:26:41.591102" elapsed="0.028060"/>
</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-10-16T01:26:41.620261" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:41.620072" elapsed="0.000249">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:41.620440" 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-10-16T01:26:41.619732" elapsed="0.000732"/>
</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-10-16T01:26:41.620772" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:41.620528" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:41.621271" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:41.621008" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:41.620850" elapsed="0.000478"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:41.620511" elapsed="0.000837"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:41.621880" 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-10-16T01:26:41.621506" elapsed="0.000399"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:41.621951" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:26:41.622074" 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-manganese/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-10-16T01:26:41.619421" elapsed="0.002676"/>
</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-10-16T01:26:41.623196" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:41.623008" elapsed="0.000246">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:41.623336" 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-10-16T01:26:41.622633" elapsed="0.000726"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:41.623521" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:26:41.623421" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:41.623405" elapsed="0.000193"/>
</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-10-16T01:26:41.623781" 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-10-16T01:26:41.623955" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:41.624015" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:41.624139" 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-manganese/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-10-16T01:26:41.622338" elapsed="0.001825"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:41.625553" 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-10-16T01:26:41.625327" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:41.626039" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:41.625818" elapsed="0.000262"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:26:41.630207" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:41.630260" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:41.630366" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:41.626362" elapsed="0.004393">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:41.626139" elapsed="0.004704">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:41.631026" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:41.630874" elapsed="0.000242"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:41.626123" elapsed="0.005018">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:41.631490" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:41.631613" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:41.631579" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:41.631562" elapsed="0.000109"/>
</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-10-16T01:26:41.631838" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:41.631902" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:26:41.624435" elapsed="0.007569">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:41.632072" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:26:41.581350" elapsed="0.050850">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:41.632585" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:41.632366" elapsed="0.000300"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:41.632319" elapsed="0.000408"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:41.632837" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:26:41.579216" elapsed="0.053788">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:41.576557" elapsed="0.056547">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:41.576514" elapsed="0.056663">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:41.633425" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:41.633799" elapsed="0.000029"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:41.634128" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:41.634474" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:41.634962" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:41.635274" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:41.635618" elapsed="0.000019"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:41.635897" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:26:41.569072" elapsed="0.066928">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:41.636062" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:41.567203" elapsed="0.068948">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:41.636449" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:41.636306" elapsed="0.000194"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:41.636661" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:41.636523" elapsed="0.000207"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:41.636910" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:41.636765" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:41.636289" elapsed="0.000692"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:41.566875" elapsed="0.070145">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:41.566436" elapsed="0.070637">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:41.637122" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:41.557597" elapsed="0.079616">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:41.637389" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:41.637608" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:41.637468" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:41.637453" elapsed="0.000231"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:41.637937" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:41.638107" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:41.638166" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:41.556010" elapsed="0.082249">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:41.555505" elapsed="0.082817">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:41.555263" elapsed="0.083109">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:41.554473" elapsed="0.083981">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:41.638663" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:41.530276" elapsed="0.108527">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:42.657853" elapsed="0.000405"/>
</kw>
<msg time="2026-10-16T01:26:42.658374" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:42.656543" elapsed="0.001946"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:42.655607" elapsed="0.003037"/>
</kw>
<msg time="2026-10-16T01:26:42.658895" 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-10-16T01:26:42.649073" elapsed="0.009920"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:42.648088" elapsed="0.011056"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:42.660193" 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-10-16T01:26:42.659622" elapsed="0.000663"/>
</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-10-16T01:26:42.667249" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:42.666328" elapsed="0.000989"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:42.668354" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:42.667684" elapsed="0.000724"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:42.668502" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:26:42.668848" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:42.665496" elapsed="0.003404"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:42.669229" elapsed="0.000284"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:42.670600" 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-10-16T01:26:42.669928" elapsed="0.000728"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:42.671542" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:42.671034" elapsed="0.000560"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:42.672458" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:42.671953" elapsed="0.000558"/>
</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-10-16T01:26:42.681379" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:42.680001" elapsed="0.001485"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:42.681614" elapsed="0.000191"/>
</return>
<msg time="2026-10-16T01:26:42.682233" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:42.676680" elapsed="0.005677"/>
</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-10-16T01:26:42.708936" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:42.708477" elapsed="0.000495"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:42.709974" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:42.709636" elapsed="0.000439">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:42.710192" 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-10-16T01:26:42.709189" elapsed="0.001034"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:42.710926" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:42.710458" elapsed="0.000504"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:42.711347" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:42.711539" 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-10-16T01:26:42.711190" elapsed="0.000382"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:42.712234" 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-10-16T01:26:42.711874" elapsed="0.000418"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:42.713781" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:42.713233" elapsed="0.000607"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:42.714446" 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-10-16T01:26:42.714086" elapsed="0.000394"/>
</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-10-16T01:26:42.714907" elapsed="0.000030"/>
</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-10-16T01:26:42.715165" 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-10-16T01:26:42.715417" elapsed="0.000026"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:42.714692" elapsed="0.000795"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:42.714540" elapsed="0.000988"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:42.715584" elapsed="0.000036"/>
</return>
<msg time="2026-10-16T01:26:42.715802" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:42.712761" elapsed="0.003074"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:42.712378" elapsed="0.003498"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:42.716114" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:42.715911" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:42.712354" elapsed="0.003856"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:42.716997" 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-10-16T01:26:42.716427" elapsed="0.000606"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:42.717094" elapsed="0.000036"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:42.707781" elapsed="0.009451"/>
</kw>
<msg time="2026-10-16T01:26:42.717297" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:42.702088" elapsed="0.015273"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:42.721617" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:42.725435" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:42.729413" elapsed="0.000033"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:42.729614" elapsed="0.000020"/>
</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-10-16T01:26:42.729834" 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-10-16T01:26:42.730238" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:42.730050" elapsed="0.000241"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:42.730035" 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-10-16T01:26:42.730468" elapsed="0.000019"/>
</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-10-16T01:26:42.730645" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:42.730835" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:42.730005" elapsed="0.000881"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:42.729907" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:42.731063" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:42.731133" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:26:42.731248" 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-10-16T01:26:42.701219" elapsed="0.030052"/>
</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-10-16T01:26:42.732433" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:42.732220" elapsed="0.000280">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:42.732583" 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-10-16T01:26:42.731881" elapsed="0.000725"/>
</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-10-16T01:26:42.732921" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:42.732673" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:42.733428" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:42.733164" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:42.732996" elapsed="0.000488"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:42.732652" elapsed="0.000852"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:42.734033" 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-10-16T01:26:42.733659" elapsed="0.000397"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:42.734102" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:26:42.734225" 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-manganese/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-10-16T01:26:42.731542" elapsed="0.002706"/>
</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-10-16T01:26:42.735326" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:42.735137" elapsed="0.000248">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:42.735468" 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-10-16T01:26:42.734818" elapsed="0.000672"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:42.735653" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:26:42.735555" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:42.735538" elapsed="0.000220"/>
</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-10-16T01:26:42.735908" elapsed="0.000020"/>
</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-10-16T01:26:42.736080" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:42.736140" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:26:42.736264" 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-manganese/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-10-16T01:26:42.734494" elapsed="0.001825"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:42.737764" 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-10-16T01:26:42.737510" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:42.738216" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:42.737996" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:26:42.742615" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:42.742668" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:42.742794" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:42.738540" elapsed="0.004629">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:42.738317" elapsed="0.004929">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:42.743426" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:42.743277" elapsed="0.000208"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:42.738300" elapsed="0.005206">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:42.743875" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:42.743995" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:42.743963" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:42.743946" elapsed="0.000107"/>
</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-10-16T01:26:42.744188" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:42.744251" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:26:42.736808" elapsed="0.007545">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:42.744420" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:26:42.690690" elapsed="0.053866">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:42.744989" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:42.744764" elapsed="0.000306"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:42.744677" elapsed="0.000433"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:42.745191" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:26:42.687237" elapsed="0.058117">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:42.683061" elapsed="0.062424">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:42.683016" elapsed="0.062546">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:42.745851" elapsed="0.000025"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:42.746201" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:42.746512" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:42.746903" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:42.747329" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:42.747644" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:42.748025" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:42.748263" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:26:42.675372" elapsed="0.072995">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:42.748430" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:42.673521" elapsed="0.075000">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:42.748771" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:42.748602" elapsed="0.000224"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:42.748987" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:42.748848" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:42.749200" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:42.749059" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:42.748586" elapsed="0.000682"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:42.673191" elapsed="0.076115">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:42.672804" elapsed="0.076555">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:42.749408" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:42.664138" elapsed="0.085362">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:42.749676" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:42.749994" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:42.749851" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:42.749834" elapsed="0.000228"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:42.750188" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:42.750357" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:42.750414" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:42.662303" elapsed="0.088248">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:42.661842" elapsed="0.088772">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:42.661520" elapsed="0.089145">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:42.660774" elapsed="0.090071">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:42.751062" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:42.639536" elapsed="0.111633">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:43.770498" elapsed="0.000453"/>
</kw>
<msg time="2026-10-16T01:26:43.771070" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:43.769212" elapsed="0.001977"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:43.768000" elapsed="0.003344"/>
</kw>
<msg time="2026-10-16T01:26:43.771434" 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-10-16T01:26:43.761443" elapsed="0.010080"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:43.760569" elapsed="0.011102"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:43.772757" 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-10-16T01:26:43.772203" elapsed="0.000650"/>
</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-10-16T01:26:43.779510" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:43.778765" elapsed="0.000802"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:43.780660" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:43.779947" elapsed="0.000819"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:43.780870" elapsed="0.000063"/>
</return>
<msg time="2026-10-16T01:26:43.781161" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:43.777938" elapsed="0.003273"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:43.781539" elapsed="0.000335"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:43.782961" 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-10-16T01:26:43.782242" elapsed="0.000774"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:43.784036" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:43.783343" elapsed="0.000750"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:43.784980" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:43.784409" elapsed="0.000625"/>
</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-10-16T01:26:43.794037" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:43.792586" elapsed="0.001659"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:43.794381" elapsed="0.000135"/>
</return>
<msg time="2026-10-16T01:26:43.795011" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:43.789202" elapsed="0.005937"/>
</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-10-16T01:26:43.821229" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:43.820805" elapsed="0.000461"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:43.822247" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:43.821956" elapsed="0.000390">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:43.822467" 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-10-16T01:26:43.821481" elapsed="0.001017"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:43.823202" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:43.822766" elapsed="0.000471"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:43.823621" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:43.823854" 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-10-16T01:26:43.823463" elapsed="0.000425"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:43.824461" 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-10-16T01:26:43.824156" elapsed="0.000362"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:43.825998" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:43.825635" elapsed="0.000420"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:43.826653" 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-10-16T01:26:43.826298" elapsed="0.000390"/>
</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-10-16T01:26:43.827117" elapsed="0.000028"/>
</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-10-16T01:26:43.827369" 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-10-16T01:26:43.827618" elapsed="0.000027"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:43.826936" elapsed="0.000753"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:43.826781" elapsed="0.000983"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:43.827823" elapsed="0.000037"/>
</return>
<msg time="2026-10-16T01:26:43.828004" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:43.825164" elapsed="0.002873"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:43.824602" elapsed="0.003475"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:43.828314" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:43.828112" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:43.824578" elapsed="0.003833"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:43.829203" 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-10-16T01:26:43.828626" elapsed="0.000612"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:43.829299" elapsed="0.000037"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:43.820075" elapsed="0.009362"/>
</kw>
<msg time="2026-10-16T01:26:43.829551" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:43.814401" elapsed="0.015217"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:43.833781" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:43.837563" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:43.841367" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:43.841545" elapsed="0.000020"/>
</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-10-16T01:26:43.841745" 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-10-16T01:26:43.842088" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:43.841947" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:43.841933" elapsed="0.000227"/>
</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-10-16T01:26:43.842314" elapsed="0.000019"/>
</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-10-16T01:26:43.842489" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:43.842646" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:43.841907" elapsed="0.000787"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:43.841816" elapsed="0.000917"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:43.842896" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:43.842963" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:43.843066" 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-10-16T01:26:43.813543" elapsed="0.029547"/>
</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-10-16T01:26:43.844190" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:43.843999" elapsed="0.000251">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:43.844331" 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-10-16T01:26:43.843647" elapsed="0.000707"/>
</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-10-16T01:26:43.844631" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:43.844418" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:43.845187" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:43.844925" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:43.844761" elapsed="0.000483"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:43.844401" elapsed="0.000862"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:43.845782" 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-10-16T01:26:43.845420" elapsed="0.000387"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:43.845852" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:26:43.845977" 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-manganese/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-10-16T01:26:43.843351" elapsed="0.002651"/>
</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-10-16T01:26:43.847070" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:43.846881" elapsed="0.000248">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:43.847212" 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-10-16T01:26:43.846538" elapsed="0.000698"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:43.847558" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:26:43.847455" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:43.847283" elapsed="0.000352"/>
</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-10-16T01:26:43.847813" 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-10-16T01:26:43.847996" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:43.848057" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:26:43.848181" 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-manganese/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-10-16T01:26:43.846243" elapsed="0.001961"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:43.849411" 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-10-16T01:26:43.849187" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:43.849891" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:43.849638" 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-10-16T01:26:43.854049" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:43.854102" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:43.854202" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:43.850212" elapsed="0.004354">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:43.849991" elapsed="0.004656">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:43.854854" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:43.854677" elapsed="0.000236"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:43.849974" elapsed="0.004961">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:43.855273" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:43.855426" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:43.855392" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:43.855375" elapsed="0.000109"/>
</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-10-16T01:26:43.855621" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:43.855684" elapsed="0.000029"/>
</return>
<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="FAIL" start="2026-10-16T01:26:43.848471" elapsed="0.007348">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:43.855888" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:26:43.803281" elapsed="0.052731">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:43.856395" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:43.856176" elapsed="0.000301"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:43.856129" elapsed="0.000388"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:43.856599" elapsed="0.000034"/>
</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="FAIL" start="2026-10-16T01:26:43.799819" elapsed="0.056986">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:43.795600" elapsed="0.061310">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:43.795556" elapsed="0.061425">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:43.857231" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:43.857579" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:43.857916" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:43.858262" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:43.858687" elapsed="0.000042"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:43.859082" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:43.859424" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:43.859662" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:26:43.787901" elapsed="0.071914">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:43.859878" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:43.786000" elapsed="0.073968">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:43.860191" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:43.860049" elapsed="0.000191"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:43.860441" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:43.860263" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:43.860658" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:43.860515" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:43.860032" elapsed="0.000727"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:43.785610" elapsed="0.075191">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:43.785127" elapsed="0.075727">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:43.860902" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:43.776522" elapsed="0.084471">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:43.861170" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:43.861392" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:43.861248" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:43.861233" elapsed="0.000228"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:43.861587" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:43.861875" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:43.861936" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:43.774915" elapsed="0.087115">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:43.774340" elapsed="0.087751">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:43.774095" elapsed="0.088045">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:43.773299" elapsed="0.088921">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:43.862426" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:43.751935" elapsed="0.110596">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:44.884219" elapsed="0.000398"/>
</kw>
<msg time="2026-10-16T01:26:44.884776" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:44.882955" elapsed="0.001947"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:44.881853" elapsed="0.003206"/>
</kw>
<msg time="2026-10-16T01:26:44.885151" 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-10-16T01:26:44.875315" elapsed="0.009927"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:44.874425" elapsed="0.010964"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:44.886555" 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-10-16T01:26:44.886031" elapsed="0.000619"/>
</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-10-16T01:26:44.893414" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:44.892479" elapsed="0.000993"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:44.894532" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:44.893864" elapsed="0.000725"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:44.894684" elapsed="0.000113"/>
</return>
<msg time="2026-10-16T01:26:44.895032" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:44.891643" elapsed="0.003441"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:44.895412" elapsed="0.000284"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:44.896843" 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-10-16T01:26:44.896115" elapsed="0.000785"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:44.897794" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:44.897231" elapsed="0.000620"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:44.898670" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:44.898162" elapsed="0.000612"/>
</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-10-16T01:26:44.907655" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:44.906314" elapsed="0.001602"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:44.908047" elapsed="0.000133"/>
</return>
<msg time="2026-10-16T01:26:44.908599" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:44.902917" elapsed="0.006018"/>
</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-10-16T01:26:44.934132" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:44.933670" elapsed="0.000499"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:44.935158" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:44.934862" elapsed="0.000395">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:44.935374" 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-10-16T01:26:44.934384" elapsed="0.001022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:44.936109" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:44.935642" elapsed="0.000502"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:44.936528" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:44.936752" 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-10-16T01:26:44.936370" elapsed="0.000418"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:44.937366" 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-10-16T01:26:44.937056" elapsed="0.000367"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:44.938678" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:44.938358" elapsed="0.000412"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:44.939627" 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-10-16T01:26:44.939023" elapsed="0.000639"/>
</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-10-16T01:26:44.940094" elapsed="0.000029"/>
</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-10-16T01:26:44.940349" 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-10-16T01:26:44.940599" elapsed="0.000027"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:44.939914" elapsed="0.000757"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:44.939757" elapsed="0.000987"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:44.940804" elapsed="0.000038"/>
</return>
<msg time="2026-10-16T01:26:44.940989" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:44.937888" elapsed="0.003133"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:44.937508" elapsed="0.003554"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:44.941296" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:44.941096" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:44.937484" elapsed="0.003911"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:44.942090" 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-10-16T01:26:44.941607" elapsed="0.000509"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:44.942160" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:44.932974" elapsed="0.009285"/>
</kw>
<msg time="2026-10-16T01:26:44.942306" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:44.927306" elapsed="0.015046"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:44.946181" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:44.950015" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:44.953872" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:44.954051" elapsed="0.000020"/>
</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-10-16T01:26:44.954229" elapsed="0.000019"/>
</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-10-16T01:26:44.954567" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:44.954427" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:44.954413" elapsed="0.000228"/>
</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-10-16T01:26:44.954821" 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-10-16T01:26:44.955001" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:44.955200" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:44.954386" elapsed="0.000864"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:44.954295" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:44.955424" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:44.955493" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:26:44.955599" 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-10-16T01:26:44.926453" elapsed="0.029170"/>
</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-10-16T01:26:44.956746" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:44.956529" elapsed="0.000279">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:44.956891" 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-10-16T01:26:44.956207" elapsed="0.000707"/>
</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-10-16T01:26:44.957193" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:44.956976" elapsed="0.000270"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:44.957691" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:44.957428" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:44.957269" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:44.956960" elapsed="0.000839"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:44.958296" 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-10-16T01:26:44.957958" elapsed="0.000363"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:44.958367" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:26:44.958491" 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-manganese/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-10-16T01:26:44.955909" elapsed="0.002605"/>
</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-10-16T01:26:44.959590" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:44.959402" elapsed="0.000247">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:44.959763" 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-10-16T01:26:44.959086" elapsed="0.000701"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:44.959951" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:26:44.959852" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:44.959835" elapsed="0.000192"/>
</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-10-16T01:26:44.960177" elapsed="0.000020"/>
</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-10-16T01:26:44.960348" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:44.960408" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:44.960531" 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-manganese/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-10-16T01:26:44.958787" elapsed="0.001767"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:44.961984" 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-10-16T01:26:44.961755" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:44.962473" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:44.962250" elapsed="0.000264"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:26:44.966583" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:44.966638" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:44.966777" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:44.962826" elapsed="0.004332">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:44.962575" elapsed="0.004662">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:44.967419" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:44.967267" elapsed="0.000211"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:44.962558" elapsed="0.004942">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:44.967868" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:44.967991" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:44.967957" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:44.967941" elapsed="0.000109"/>
</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-10-16T01:26:44.968187" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:44.968250" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:26:44.960863" elapsed="0.007489">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:44.968420" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:26:44.916861" elapsed="0.051684">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:44.968971" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:44.968737" elapsed="0.000316"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:44.968662" elapsed="0.000431"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:44.969175" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:26:44.913391" elapsed="0.055948">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:44.909409" elapsed="0.060029">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:44.909367" elapsed="0.060143">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:44.969784" elapsed="0.000028"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:44.970176" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:44.970494" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:44.970875" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:44.971311" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:44.971626" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:44.972016" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:44.972259" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:26:44.901547" elapsed="0.070814">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:44.972422" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:44.899611" elapsed="0.072899">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:44.972759" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:44.972590" elapsed="0.000224"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:44.972972" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:44.972837" elapsed="0.000183"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:44.973182" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:44.973043" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:44.972574" elapsed="0.000676"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:44.899248" elapsed="0.074039">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:44.898873" elapsed="0.074466">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:44.973387" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:44.890288" elapsed="0.083189">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:44.973650" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:44.974004" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:44.973860" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:44.973842" elapsed="0.000231"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:44.974198" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:44.974364" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:44.974423" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:44.888659" elapsed="0.085856">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:44.888222" elapsed="0.086354">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:44.887981" elapsed="0.086689">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:44.887147" elapsed="0.087634">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:44.975000" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:44.863257" elapsed="0.111848">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:45.994533" elapsed="0.000450"/>
</kw>
<msg time="2026-10-16T01:26:45.995099" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:45.993259" elapsed="0.001957"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:45.992307" elapsed="0.003068"/>
</kw>
<msg time="2026-10-16T01:26:45.995467" 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-10-16T01:26:45.985451" elapsed="0.010398"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:45.984547" elapsed="0.011469"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:45.997069" 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-10-16T01:26:45.996488" elapsed="0.000676"/>
</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-10-16T01:26:46.003794" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:46.002993" elapsed="0.000866"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:46.004856" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:46.004193" elapsed="0.000719"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:46.005007" elapsed="0.000063"/>
</return>
<msg time="2026-10-16T01:26:46.005298" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:46.002149" elapsed="0.003201"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:46.005680" elapsed="0.000345"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:46.007121" 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-10-16T01:26:46.006395" elapsed="0.000782"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:46.008209" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:46.007628" elapsed="0.000636"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:46.009134" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:46.008574" elapsed="0.000614"/>
</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-10-16T01:26:46.018008" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:46.016497" elapsed="0.001622"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:46.018246" elapsed="0.000133"/>
</return>
<msg time="2026-10-16T01:26:46.018875" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:46.013240" elapsed="0.005763"/>
</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-10-16T01:26:46.043484" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:46.043060" elapsed="0.000460"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:46.044495" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:46.044206" elapsed="0.000383">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:46.044740" 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-10-16T01:26:46.043764" elapsed="0.001011"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:46.045445" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:46.045011" elapsed="0.000469"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:46.045918" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:46.046108" 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-10-16T01:26:46.045724" elapsed="0.000417"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:46.046779" 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-10-16T01:26:46.046405" elapsed="0.000435"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:46.048279" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:46.047770" elapsed="0.000568"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:46.048932" 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-10-16T01:26:46.048578" elapsed="0.000378"/>
</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-10-16T01:26:46.049234" 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-10-16T01:26:46.049417" elapsed="0.000022"/>
</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-10-16T01:26:46.049596" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:46.049107" elapsed="0.000540"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:46.048998" elapsed="0.000676"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:46.049741" elapsed="0.000028"/>
</return>
<msg time="2026-10-16T01:26:46.049874" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:46.047270" elapsed="0.002627"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:46.046925" elapsed="0.003000"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:46.050092" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:46.049949" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:46.046901" elapsed="0.003259"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:46.050698" 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-10-16T01:26:46.050311" elapsed="0.000437"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:46.050793" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:46.042334" elapsed="0.008558"/>
</kw>
<msg time="2026-10-16T01:26:46.050939" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:46.036698" elapsed="0.014287"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:46.054779" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:46.058631" elapsed="0.000032"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:46.062501" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:46.062686" 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-10-16T01:26:46.062897" 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-10-16T01:26:46.063253" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:46.063108" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:46.063093" 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-10-16T01:26:46.063480" elapsed="0.000019"/>
</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-10-16T01:26:46.063654" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:46.063842" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:46.063063" elapsed="0.000829"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:46.062967" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:46.064067" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:46.064135" elapsed="0.000016"/>
</return>
<msg time="2026-10-16T01:26:46.064252" 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-10-16T01:26:46.035874" elapsed="0.028402"/>
</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-10-16T01:26:46.065438" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:46.065221" elapsed="0.000285">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:46.065588" 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-10-16T01:26:46.064875" elapsed="0.000735"/>
</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-10-16T01:26:46.065929" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:46.065673" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:46.066438" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:46.066174" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:46.066003" elapsed="0.000491"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:46.065656" elapsed="0.000858"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:46.067036" 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-10-16T01:26:46.066669" elapsed="0.000436"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:46.067153" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:26:46.067279" 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-manganese/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-10-16T01:26:46.064538" elapsed="0.002764"/>
</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-10-16T01:26:46.068371" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:46.068184" elapsed="0.000245">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:46.068514" 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-10-16T01:26:46.067868" elapsed="0.000669"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:46.068712" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-10-16T01:26:46.068601" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:46.068584" elapsed="0.000221"/>
</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-10-16T01:26:46.068958" elapsed="0.000020"/>
</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-10-16T01:26:46.069129" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:46.069189" elapsed="0.000013"/>
</return>
<msg time="2026-10-16T01:26:46.069313" 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-manganese/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-10-16T01:26:46.067544" elapsed="0.001792"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:46.070836" 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-10-16T01:26:46.070575" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:46.071281" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:46.071064" elapsed="0.000258"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:26:46.075326" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:46.075380" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:46.075477" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:46.071603" elapsed="0.004272">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:46.071382" elapsed="0.004572">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:46.076133" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:46.075984" elapsed="0.000207"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:46.071365" elapsed="0.004848">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:46.076556" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:46.076675" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:46.076642" elapsed="0.000097"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:46.076626" 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-10-16T01:26:46.076904" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:46.076998" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:26:46.069882" elapsed="0.007222">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:46.077172" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:26:46.026044" elapsed="0.051265">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:46.077720" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:46.077479" elapsed="0.000338"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:46.077430" elapsed="0.000428"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:46.077947" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:26:46.023663" elapsed="0.054451">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:46.019456" elapsed="0.058757">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:46.019414" elapsed="0.058872">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:46.078536" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:46.078915" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:46.079227" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:46.079572" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:46.080034" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:46.080346" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:46.080692" elapsed="0.000056"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:46.080967" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:26:46.011921" elapsed="0.069149">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:46.081132" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:46.010035" elapsed="0.071187">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:46.081441" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:46.081301" elapsed="0.000191"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:46.081652" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:46.081516" elapsed="0.000203"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:46.081921" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:46.081774" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:46.081286" elapsed="0.000735"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:46.009651" elapsed="0.072413">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:46.009282" elapsed="0.072835">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:46.082167" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:46.000775" elapsed="0.081487">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:46.082438" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:46.082661" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:46.082518" elapsed="0.000321"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:46.082503" elapsed="0.000361"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:46.082993" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:46.083163" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:46.083222" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:45.999148" elapsed="0.084169">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:45.998649" elapsed="0.084731">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:45.998408" elapsed="0.085021">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:45.997608" elapsed="0.085905">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:46.083754" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:45.975934" elapsed="0.107929">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:47.104026" elapsed="0.000407"/>
</kw>
<msg time="2026-10-16T01:26:47.104551" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:47.102595" elapsed="0.002076"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:47.101637" elapsed="0.003248"/>
</kw>
<msg time="2026-10-16T01:26:47.104978" 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-10-16T01:26:47.094532" elapsed="0.010537"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:47.093618" elapsed="0.011600"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:47.106267" 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-10-16T01:26:47.105746" elapsed="0.000613"/>
</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-10-16T01:26:47.113365" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:47.112568" elapsed="0.000855"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:47.114417" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:47.113811" elapsed="0.000660"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:47.114567" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:26:47.114933" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:47.111774" elapsed="0.003212"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:47.115315" elapsed="0.000285"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:47.116781" 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-10-16T01:26:47.116054" elapsed="0.000785"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:47.117754" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:47.117167" elapsed="0.000659"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:47.118661" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:47.118150" elapsed="0.000633"/>
</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-10-16T01:26:47.128287" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:47.126864" elapsed="0.001537"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:47.128531" elapsed="0.000136"/>
</return>
<msg time="2026-10-16T01:26:47.129413" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:47.123110" elapsed="0.006428"/>
</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-10-16T01:26:47.156649" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:47.156230" elapsed="0.000455"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:47.157670" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:47.157379" elapsed="0.000431">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:47.157929" 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-10-16T01:26:47.156941" elapsed="0.001020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:47.158624" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:47.158196" elapsed="0.000464"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:47.159088" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:47.159281" 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-10-16T01:26:47.158928" elapsed="0.000386"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:47.159960" 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-10-16T01:26:47.159584" elapsed="0.000434"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:47.161447" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:47.161128" elapsed="0.000376"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:47.162142" 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-10-16T01:26:47.161783" elapsed="0.000393"/>
</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-10-16T01:26:47.162564" elapsed="0.000028"/>
</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-10-16T01:26:47.162852" elapsed="0.000032"/>
</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-10-16T01:26:47.163156" elapsed="0.000029"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:47.162386" elapsed="0.000844"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:47.162235" elapsed="0.001035"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:47.163326" elapsed="0.000037"/>
</return>
<msg time="2026-10-16T01:26:47.163506" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:47.160620" elapsed="0.002918"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:47.160102" elapsed="0.003477"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:47.163852" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:47.163614" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:47.160078" elapsed="0.003875"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:47.164750" 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-10-16T01:26:47.164168" elapsed="0.000630"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:47.164863" elapsed="0.000038"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:47.155467" elapsed="0.009540"/>
</kw>
<msg time="2026-10-16T01:26:47.165073" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:47.149813" elapsed="0.015324"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:47.171410" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:47.175183" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:47.178929" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:47.179107" elapsed="0.000019"/>
</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-10-16T01:26:47.179282" elapsed="0.000019"/>
</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-10-16T01:26:47.179622" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:47.179480" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:47.179466" elapsed="0.000228"/>
</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-10-16T01:26:47.179872" elapsed="0.000019"/>
</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-10-16T01:26:47.180045" elapsed="0.000018"/>
</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-10-16T01:26:47.180201" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:47.179440" elapsed="0.000808"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:47.179350" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:47.180455" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:47.180524" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:47.180631" 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-10-16T01:26:47.148955" elapsed="0.031700"/>
</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-10-16T01:26:47.181807" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:47.181582" elapsed="0.000292">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:47.181957" 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-10-16T01:26:47.181257" elapsed="0.000723"/>
</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-10-16T01:26:47.182262" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:47.182043" elapsed="0.000270"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:47.182803" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:47.182493" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:47.182336" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:47.182026" elapsed="0.000854"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:47.183375" 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-10-16T01:26:47.183038" elapsed="0.000361"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:47.183444" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:26:47.183567" 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-manganese/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-10-16T01:26:47.180958" elapsed="0.002631"/>
</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-10-16T01:26:47.184665" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:47.184478" elapsed="0.000274">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:47.184839" 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-10-16T01:26:47.184162" elapsed="0.000700"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:47.185184" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:26:47.185082" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:47.184908" elapsed="0.000353"/>
</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-10-16T01:26:47.185410" elapsed="0.000020"/>
</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-10-16T01:26:47.185582" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:47.185642" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:47.185796" 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-manganese/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-10-16T01:26:47.183863" elapsed="0.001957"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:47.187068" 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-10-16T01:26:47.186842" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:47.187511" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:47.187294" elapsed="0.000256"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:26:47.191539" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:47.191647" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:47.191776" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:47.187855" elapsed="0.004289">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:47.187608" elapsed="0.004614">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:47.192402" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:47.192253" elapsed="0.000207"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:47.187592" elapsed="0.004890">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:47.192845" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:47.192965" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:47.192932" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:47.192916" elapsed="0.000106"/>
</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-10-16T01:26:47.193157" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:47.193220" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:26:47.186099" elapsed="0.007222">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:47.193388" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:26:47.138171" elapsed="0.055342">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:47.193932" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:47.193677" elapsed="0.000337"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:47.193631" elapsed="0.000422"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:47.194136" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:26:47.134243" elapsed="0.060055">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:47.130084" elapsed="0.064312">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:47.130038" elapsed="0.064430">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:47.194758" elapsed="0.000028"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:47.195110" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:47.195423" elapsed="0.000019"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:47.195805" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:47.196270" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:47.196585" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:47.196972" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:47.197215" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:26:47.121560" elapsed="0.075756">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:47.197377" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:47.119606" elapsed="0.077860">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:47.197684" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:47.197545" elapsed="0.000238"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:47.197944" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:47.197807" elapsed="0.000186"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:47.198155" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:47.198014" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:47.197530" elapsed="0.000692"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:47.119273" elapsed="0.078987">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:47.118890" elapsed="0.079423">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:47.198361" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:47.110049" elapsed="0.088446">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:47.198685" elapsed="0.000153"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:47.199044" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:47.198902" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:47.198886" elapsed="0.000228"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:47.199238" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:47.199405" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:47.199462" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:47.108352" elapsed="0.091202">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:47.107904" elapsed="0.091713">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:47.107607" elapsed="0.092058">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:47.106865" elapsed="0.092908">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:47.200109" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:47.084629" elapsed="0.115588">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:48.222669" elapsed="0.000486"/>
</kw>
<msg time="2026-10-16T01:26:48.223274" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:48.221410" elapsed="0.001985"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:48.220424" elapsed="0.003131"/>
</kw>
<msg time="2026-10-16T01:26:48.223644" 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-10-16T01:26:48.213520" elapsed="0.010289"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:48.212625" elapsed="0.011340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:48.225021" 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-10-16T01:26:48.224444" elapsed="0.000669"/>
</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-10-16T01:26:48.231896" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:48.231109" elapsed="0.000845"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:48.232940" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:48.232286" elapsed="0.000708"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:48.233091" elapsed="0.000063"/>
</return>
<msg time="2026-10-16T01:26:48.233380" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:48.230279" elapsed="0.003152"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:48.233808" elapsed="0.000476"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:48.235387" 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-10-16T01:26:48.234659" elapsed="0.000785"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:48.236386" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:48.235831" elapsed="0.000610"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:48.237304" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:48.236800" elapsed="0.000557"/>
</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-10-16T01:26:48.246061" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:48.244659" elapsed="0.001512"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:48.246299" elapsed="0.000135"/>
</return>
<msg time="2026-10-16T01:26:48.246928" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:48.241408" elapsed="0.005652"/>
</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-10-16T01:26:48.271217" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:48.270789" elapsed="0.000465"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:48.272321" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:48.272031" elapsed="0.000384">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:48.272532" 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-10-16T01:26:48.271539" elapsed="0.001024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:48.273268" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:48.272834" elapsed="0.000469"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:48.273685" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:48.273912" 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-10-16T01:26:48.273529" elapsed="0.000417"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:48.274520" 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-10-16T01:26:48.274212" elapsed="0.000366"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:48.275879" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:48.275520" elapsed="0.000415"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:48.276759" 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-10-16T01:26:48.276173" elapsed="0.000622"/>
</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-10-16T01:26:48.277189" elapsed="0.000029"/>
</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-10-16T01:26:48.277445" elapsed="0.000032"/>
</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-10-16T01:26:48.277698" elapsed="0.000061"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:48.277010" elapsed="0.000796"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:48.276856" elapsed="0.000990"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:48.277916" elapsed="0.000045"/>
</return>
<msg time="2026-10-16T01:26:48.278141" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:48.275053" elapsed="0.003128"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:48.274662" elapsed="0.003569"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:48.278413" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:48.278264" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:48.274638" elapsed="0.003845"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:48.279056" 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-10-16T01:26:48.278637" elapsed="0.000445"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:48.279125" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:48.270056" elapsed="0.009168"/>
</kw>
<msg time="2026-10-16T01:26:48.279271" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:48.264325" elapsed="0.014992"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:48.283133" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:48.286959" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:48.290798" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:48.290976" elapsed="0.000020"/>
</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-10-16T01:26:48.291152" elapsed="0.000019"/>
</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-10-16T01:26:48.291489" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:48.291349" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:48.291335" elapsed="0.000226"/>
</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-10-16T01:26:48.291736" 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-10-16T01:26:48.291919" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:48.292078" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:48.291310" elapsed="0.000817"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:48.291219" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:48.292298" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:48.292365" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:48.292467" 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-10-16T01:26:48.263348" elapsed="0.029143"/>
</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-10-16T01:26:48.293602" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:48.293409" elapsed="0.000253">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:48.293780" 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-10-16T01:26:48.293085" elapsed="0.000719"/>
</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-10-16T01:26:48.294089" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:48.293869" elapsed="0.000273"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:48.294593" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:48.294325" elapsed="0.000294"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:48.294166" elapsed="0.000485"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:48.293852" elapsed="0.000820"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:48.295205" 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-10-16T01:26:48.294863" elapsed="0.000367"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:48.295277" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:26:48.295401" 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-manganese/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-10-16T01:26:48.292780" elapsed="0.002644"/>
</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-10-16T01:26:48.296577" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:48.296380" elapsed="0.000256">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:48.296748" 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-10-16T01:26:48.296063" elapsed="0.000709"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:48.296948" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:26:48.296848" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:48.296831" elapsed="0.000196"/>
</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-10-16T01:26:48.297176" 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-10-16T01:26:48.297350" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:48.297411" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:48.297536" 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-manganese/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-10-16T01:26:48.295754" elapsed="0.001806"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:48.298982" 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-10-16T01:26:48.298752" elapsed="0.000273"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:48.299432" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:48.299213" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:26:48.303610" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:48.303663" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:48.303809" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:48.299788" elapsed="0.004387">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:48.299534" elapsed="0.004719">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:48.304435" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:48.304284" elapsed="0.000210"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:48.299517" elapsed="0.004999">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:48.304881" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:48.305009" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:48.304972" elapsed="0.000075"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:48.304953" 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-10-16T01:26:48.305205" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:48.305267" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:26:48.297859" elapsed="0.007510">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:48.305468" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:26:48.253622" elapsed="0.051979">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:48.306033" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:48.305810" elapsed="0.000306"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:48.305755" elapsed="0.000402"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:48.306244" elapsed="0.000037"/>
</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="FAIL" start="2026-10-16T01:26:48.251483" elapsed="0.054927">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:48.247522" elapsed="0.058990">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:48.247478" elapsed="0.059108">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:48.306867" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:48.307225" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:48.307574" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:48.307999" elapsed="0.000028"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:48.308490" elapsed="0.000027"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:48.308859" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:48.309221" elapsed="0.000023"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:48.309488" elapsed="0.000019"/>
</return>
<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="FAIL" start="2026-10-16T01:26:48.240103" elapsed="0.069490">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:48.309656" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:48.238206" elapsed="0.071571">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:48.310017" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:48.309870" elapsed="0.000197"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:48.310225" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:48.310089" elapsed="0.000186"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:48.310439" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:48.310296" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:48.309853" elapsed="0.000655"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:48.237871" elapsed="0.072676">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:48.237450" elapsed="0.073150">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:48.310649" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:48.228692" elapsed="0.082113">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:48.310986" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:48.311208" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:48.311066" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:48.311051" elapsed="0.000227"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:48.311403" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:48.311570" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:48.311628" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:48.227123" elapsed="0.084726">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:48.226616" elapsed="0.085300">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:48.226369" elapsed="0.085597">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:48.225563" elapsed="0.086484">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:48.312258" elapsed="0.000021"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:48.201031" elapsed="0.111331">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:49.332299" elapsed="0.000464"/>
</kw>
<msg time="2026-10-16T01:26:49.332884" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:49.330988" elapsed="0.002017"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:49.329847" elapsed="0.003323"/>
</kw>
<msg time="2026-10-16T01:26:49.333265" 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-10-16T01:26:49.323005" elapsed="0.010357"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:49.322095" elapsed="0.011425"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:49.334592" 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-10-16T01:26:49.334066" elapsed="0.000620"/>
</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-10-16T01:26:49.341955" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:49.341147" elapsed="0.000868"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:49.343018" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:49.342352" elapsed="0.000723"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:49.343287" elapsed="0.000066"/>
</return>
<msg time="2026-10-16T01:26:49.343588" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:49.339991" elapsed="0.003649"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:49.344040" elapsed="0.000292"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:49.345467" 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-10-16T01:26:49.344779" elapsed="0.000745"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:49.346419" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:49.345909" elapsed="0.000563"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:49.347338" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:49.346832" elapsed="0.000559"/>
</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-10-16T01:26:49.356203" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:49.354839" elapsed="0.001473"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:49.356439" elapsed="0.000136"/>
</return>
<msg time="2026-10-16T01:26:49.357257" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:49.351522" elapsed="0.005861"/>
</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-10-16T01:26:49.380891" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:49.380401" elapsed="0.000527"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:49.381928" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:49.381589" elapsed="0.000459">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:49.382194" 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-10-16T01:26:49.381147" elapsed="0.001087"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:49.382770" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:49.382435" elapsed="0.000360"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:49.383074" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:49.383222" 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-10-16T01:26:49.382960" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:49.383659" 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-10-16T01:26:49.383441" elapsed="0.000363"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:49.384946" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:49.384469" elapsed="0.000522"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:49.385435" 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-10-16T01:26:49.385177" elapsed="0.000282"/>
</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-10-16T01:26:49.385774" 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-10-16T01:26:49.385965" elapsed="0.000022"/>
</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-10-16T01:26:49.386148" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:49.385616" elapsed="0.000583"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:49.385503" elapsed="0.000724"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:49.386268" elapsed="0.000030"/>
</return>
<msg time="2026-10-16T01:26:49.386465" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:49.384134" elapsed="0.002354"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:49.383881" elapsed="0.002636"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:49.386689" elapsed="0.000128"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:49.386543" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:49.383862" elapsed="0.003009"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:49.387429" 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-10-16T01:26:49.387027" elapsed="0.000427"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:49.387499" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:49.379665" elapsed="0.007933"/>
</kw>
<msg time="2026-10-16T01:26:49.387646" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:49.374058" elapsed="0.013637"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:49.391513" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:49.395347" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:49.399117" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:49.399297" elapsed="0.000020"/>
</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-10-16T01:26:49.399473" elapsed="0.000019"/>
</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-10-16T01:26:49.399844" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:49.399672" elapsed="0.000223"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:49.399658" 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-10-16T01:26:49.400068" 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-10-16T01:26:49.400244" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:49.400403" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:49.399631" elapsed="0.000820"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:49.399541" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:49.400622" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:49.400689" elapsed="0.000040"/>
</return>
<msg time="2026-10-16T01:26:49.400823" 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-10-16T01:26:49.373199" elapsed="0.027648"/>
</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-10-16T01:26:49.402010" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:49.401799" elapsed="0.000280">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:49.402163" 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-10-16T01:26:49.401443" elapsed="0.000743"/>
</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-10-16T01:26:49.402464" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:49.402249" elapsed="0.000267"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:49.403023" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:49.402756" elapsed="0.000292"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:49.402539" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:49.402232" elapsed="0.000869"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:49.403594" 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-10-16T01:26:49.403257" elapsed="0.000361"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:49.403664" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:26:49.403825" 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-manganese/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-10-16T01:26:49.401142" elapsed="0.002706"/>
</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-10-16T01:26:49.404938" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:49.404738" elapsed="0.000258">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:49.405079" 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-10-16T01:26:49.404393" elapsed="0.000708"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:49.405263" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:26:49.405164" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:49.405147" elapsed="0.000193"/>
</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-10-16T01:26:49.405489" elapsed="0.000020"/>
</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-10-16T01:26:49.405661" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:49.405748" elapsed="0.000016"/>
</return>
<msg time="2026-10-16T01:26:49.405875" 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-manganese/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-10-16T01:26:49.404097" elapsed="0.001801"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:49.407305" 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-10-16T01:26:49.407083" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:49.407780" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:49.407532" 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-10-16T01:26:49.411735" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:49.411792" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:49.411926" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:49.408105" elapsed="0.004178">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:49.407881" elapsed="0.004480">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:49.412544" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:49.412393" elapsed="0.000211"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:49.407864" elapsed="0.004762">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:49.412991" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:49.413113" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:49.413079" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:49.413063" elapsed="0.000109"/>
</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-10-16T01:26:49.413308" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:49.413371" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:26:49.406344" elapsed="0.007130">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:49.413542" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:26:49.363431" elapsed="0.050251">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:49.414118" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:49.413891" elapsed="0.000309"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:49.413838" elapsed="0.000402"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:49.414325" elapsed="0.000038"/>
</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="FAIL" start="2026-10-16T01:26:49.361271" elapsed="0.053220">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:49.358083" elapsed="0.056507">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:49.358038" elapsed="0.056624">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:49.414966" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:49.415325" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:49.415641" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:49.416028" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:49.416461" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:49.416808" elapsed="0.000026"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:49.417171" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:49.417444" elapsed="0.000019"/>
</return>
<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="FAIL" start="2026-10-16T01:26:49.350202" elapsed="0.067345">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:49.417610" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:49.348238" elapsed="0.069492">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:49.417957" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:49.417815" elapsed="0.000192"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:49.418165" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:49.418029" elapsed="0.000185"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:49.418379" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:49.418236" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:49.417799" elapsed="0.000647"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:49.347909" elapsed="0.070575">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:49.347484" elapsed="0.071053">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:49.418585" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:49.338571" elapsed="0.080107">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:49.418907" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:49.419126" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:49.418986" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:49.418971" elapsed="0.000223"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:49.419320" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:49.419488" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:49.419545" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:49.336986" elapsed="0.082654">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:49.336442" elapsed="0.083378">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:49.336165" elapsed="0.083711">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:49.335350" elapsed="0.084611">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:49.420182" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:49.313162" elapsed="0.107128">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:50.439877" elapsed="0.000399"/>
</kw>
<msg time="2026-10-16T01:26:50.440390" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:50.438555" elapsed="0.001950"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:50.437612" elapsed="0.003049"/>
</kw>
<msg time="2026-10-16T01:26:50.440809" 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-10-16T01:26:50.430888" elapsed="0.010014"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:50.429951" elapsed="0.011103"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:50.442099" 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-10-16T01:26:50.441526" elapsed="0.000668"/>
</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-10-16T01:26:50.449054" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:50.448256" elapsed="0.000855"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:50.450105" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:50.449443" elapsed="0.000716"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:50.450254" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:26:50.450537" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:50.447345" elapsed="0.003242"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:50.450966" elapsed="0.000284"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:50.452340" 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-10-16T01:26:50.451613" elapsed="0.000783"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:50.453293" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:50.452783" elapsed="0.000564"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:50.454208" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:50.453654" elapsed="0.000607"/>
</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-10-16T01:26:50.463029" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:50.461606" elapsed="0.001531"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:50.463267" elapsed="0.000133"/>
</return>
<msg time="2026-10-16T01:26:50.463899" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:50.458346" elapsed="0.005681"/>
</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-10-16T01:26:50.487923" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:50.487466" elapsed="0.000494"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:50.488945" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:50.488619" elapsed="0.000425">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:50.489161" 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-10-16T01:26:50.488176" elapsed="0.001016"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:50.489975" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:50.489501" elapsed="0.000510"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:50.490395" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:50.490588" 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-10-16T01:26:50.490238" elapsed="0.000383"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:50.491235" 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-10-16T01:26:50.490927" elapsed="0.000366"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:50.492679" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:50.492450" elapsed="0.000297"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:50.493179" 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-10-16T01:26:50.492924" elapsed="0.000279"/>
</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-10-16T01:26:50.493483" elapsed="0.000020"/>
</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-10-16T01:26:50.493665" 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-10-16T01:26:50.493876" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:50.493354" elapsed="0.000573"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:50.493246" elapsed="0.000709"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:50.493994" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:26:50.494123" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:50.491936" elapsed="0.002210"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:50.491378" elapsed="0.002796"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:50.494344" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:50.494201" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:50.491354" elapsed="0.003060"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:50.494987" 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-10-16T01:26:50.494566" elapsed="0.000446"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:50.495059" elapsed="0.000041"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:50.486773" elapsed="0.008402"/>
</kw>
<msg time="2026-10-16T01:26:50.495222" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:50.481078" elapsed="0.014190"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:50.499057" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:50.502866" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:50.506664" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:50.506898" 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-10-16T01:26:50.507077" elapsed="0.000019"/>
</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-10-16T01:26:50.507415" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:50.507274" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:50.507260" elapsed="0.000228"/>
</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-10-16T01:26:50.507637" elapsed="0.000019"/>
</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-10-16T01:26:50.507840" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:50.508006" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:50.507234" elapsed="0.000820"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:50.507144" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:50.508227" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:50.508294" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:50.508398" 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-10-16T01:26:50.480222" elapsed="0.028199"/>
</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-10-16T01:26:50.509517" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:50.509327" elapsed="0.000249">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:50.509658" 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-10-16T01:26:50.509008" elapsed="0.000672"/>
</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-10-16T01:26:50.509984" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:50.509770" elapsed="0.000265"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:50.510474" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:50.510212" elapsed="0.000287"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:50.510058" elapsed="0.000472"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:50.509753" elapsed="0.000797"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:50.511069" 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-10-16T01:26:50.510731" elapsed="0.000362"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:50.511138" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:26:50.511260" 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-manganese/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-10-16T01:26:50.508685" elapsed="0.002598"/>
</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-10-16T01:26:50.512357" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:50.512162" elapsed="0.000254">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:50.512499" 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-10-16T01:26:50.511849" elapsed="0.000673"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:50.512921" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:26:50.512803" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:50.512610" elapsed="0.000389"/>
</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-10-16T01:26:50.513148" elapsed="0.000020"/>
</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-10-16T01:26:50.513319" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:50.513379" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:50.513505" 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-manganese/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-10-16T01:26:50.511526" elapsed="0.002002"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:50.514773" 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-10-16T01:26:50.514521" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:50.515234" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:50.515019" elapsed="0.000254"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:26:50.519222" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:50.519275" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:50.519374" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:50.515552" elapsed="0.004215">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:50.515332" elapsed="0.004515">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:50.520027" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:50.519878" elapsed="0.000206"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:50.515316" elapsed="0.004790">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:50.520438" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:50.520556" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:50.520523" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:50.520508" elapsed="0.000105"/>
</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-10-16T01:26:50.520777" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:50.520841" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:26:50.513835" elapsed="0.007108">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:50.521010" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:26:50.470601" elapsed="0.050535">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:50.521516" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:50.521301" elapsed="0.000327"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:50.521254" elapsed="0.000414"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:50.521789" elapsed="0.000044"/>
</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="FAIL" start="2026-10-16T01:26:50.468460" elapsed="0.053501">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:50.464485" elapsed="0.057579">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:50.464443" elapsed="0.057693">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:50.522381" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:50.522748" elapsed="0.000023"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:50.523067" elapsed="0.000022"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:50.523416" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:50.523875" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:50.524192" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:50.524539" elapsed="0.000019"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:50.524833" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:26:50.456960" elapsed="0.067976">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:50.524997" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:50.455105" elapsed="0.069980">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:50.525305" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:50.525165" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:50.525511" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:50.525377" elapsed="0.000182"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:50.525752" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:50.525581" elapsed="0.000221"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:50.525149" elapsed="0.000674"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:50.454772" elapsed="0.071089">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:50.454354" elapsed="0.071558">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:50.525960" elapsed="0.000013"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:50.445992" elapsed="0.080057">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:50.526222" elapsed="0.000048"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:50.526472" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:50.526332" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:50.526316" elapsed="0.000225"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:50.526665" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:50.526959" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:50.527019" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:50.444353" elapsed="0.082764">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:50.443906" elapsed="0.083274">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:50.443593" elapsed="0.083636">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:50.442837" elapsed="0.084474">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:50.527517" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:50.421162" elapsed="0.106459">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:51.549595" elapsed="0.000451"/>
</kw>
<msg time="2026-10-16T01:26:51.550168" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:51.548333" elapsed="0.002275"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:51.547374" elapsed="0.003580"/>
</kw>
<msg time="2026-10-16T01:26:51.551054" 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-10-16T01:26:51.540550" elapsed="0.010600"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:51.539458" elapsed="0.011844"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:51.552473" 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-10-16T01:26:51.551948" elapsed="0.000617"/>
</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-10-16T01:26:51.559403" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:51.558613" elapsed="0.000847"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:51.560489" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:51.559840" elapsed="0.000706"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:51.560644" elapsed="0.000120"/>
</return>
<msg time="2026-10-16T01:26:51.561022" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:51.557833" elapsed="0.003240"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:51.561398" elapsed="0.000283"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:51.563168" 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-10-16T01:26:51.562100" elapsed="0.001131"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:51.564180" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:51.563576" elapsed="0.000661"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:51.565121" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:51.564554" elapsed="0.000621"/>
</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-10-16T01:26:51.573980" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:51.572499" elapsed="0.001593"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:51.574221" elapsed="0.000136"/>
</return>
<msg time="2026-10-16T01:26:51.574853" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:51.569190" elapsed="0.005793"/>
</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-10-16T01:26:51.599316" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:51.598890" elapsed="0.000462"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:51.600346" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:51.600052" elapsed="0.000392">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:51.600563" 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-10-16T01:26:51.599570" elapsed="0.001026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:51.601304" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:51.600867" elapsed="0.000472"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:51.601756" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:51.601952" 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-10-16T01:26:51.601565" elapsed="0.000420"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:51.602558" 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-10-16T01:26:51.602251" elapsed="0.000363"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:51.603939" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:51.603549" elapsed="0.000448"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:51.604757" 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-10-16T01:26:51.604292" elapsed="0.000492"/>
</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-10-16T01:26:51.605067" 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-10-16T01:26:51.605248" elapsed="0.000022"/>
</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-10-16T01:26:51.605427" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:51.604938" elapsed="0.000540"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:51.604829" elapsed="0.000678"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:51.605549" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:26:51.605678" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:51.603082" elapsed="0.002645"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:51.602733" elapsed="0.003026"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:51.605929" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:51.605784" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:51.602675" elapsed="0.003325"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:51.606546" 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-10-16T01:26:51.606155" elapsed="0.000449"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:51.606650" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:51.598154" elapsed="0.008642"/>
</kw>
<msg time="2026-10-16T01:26:51.606845" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:51.592417" elapsed="0.014476"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:51.613277" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:51.617313" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:51.621152" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:51.621361" 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-10-16T01:26:51.621552" 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-10-16T01:26:51.621970" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:51.621817" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:51.621801" 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-10-16T01:26:51.622202" elapsed="0.000019"/>
</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-10-16T01:26:51.622379" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:51.622540" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:51.621764" elapsed="0.000825"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:51.621632" elapsed="0.000982"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:51.622797" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:51.622870" elapsed="0.000017"/>
</return>
<msg time="2026-10-16T01:26:51.623006" 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-10-16T01:26:51.591557" elapsed="0.031475"/>
</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-10-16T01:26:51.624738" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:51.624451" elapsed="0.000366">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:51.624904" 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-10-16T01:26:51.623877" elapsed="0.001050"/>
</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-10-16T01:26:51.625228" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:51.624990" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:51.625799" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:51.625476" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:51.625302" elapsed="0.000557"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:51.624974" elapsed="0.000905"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:51.626381" 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-10-16T01:26:51.626036" elapsed="0.000369"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:51.626451" elapsed="0.000029"/>
</return>
<msg time="2026-10-16T01:26:51.626578" 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-manganese/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-10-16T01:26:51.623301" elapsed="0.003301"/>
</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-10-16T01:26:51.627724" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:51.627507" elapsed="0.000281">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:51.627872" 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-10-16T01:26:51.627186" elapsed="0.000708"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:51.628059" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-16T01:26:51.627958" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:51.627941" elapsed="0.000197"/>
</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-10-16T01:26:51.628289" elapsed="0.000020"/>
</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-10-16T01:26:51.628462" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:51.628520" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:26:51.628643" 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-manganese/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-10-16T01:26:51.626879" elapsed="0.001787"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:51.630169" 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-10-16T01:26:51.629932" elapsed="0.000281"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:51.630622" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:51.630400" elapsed="0.000262"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:26:51.634488" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:51.634544" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:51.634662" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:51.630980" elapsed="0.004091">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:51.630752" elapsed="0.004444">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:51.635380" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:51.635228" elapsed="0.000211"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:51.630734" elapsed="0.004726">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:51.635837" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:51.635957" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:51.635924" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:51.635908" elapsed="0.000108"/>
</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-10-16T01:26:51.636154" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:51.636218" elapsed="0.000013"/>
</return>
<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="FAIL" start="2026-10-16T01:26:51.628992" elapsed="0.007330">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:51.636389" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:26:51.581659" elapsed="0.054869">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:51.636958" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:51.636730" elapsed="0.000312"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:51.636650" elapsed="0.000432"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:51.637168" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:26:51.579430" elapsed="0.057908">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:51.575444" elapsed="0.061997">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:51.575399" elapsed="0.062118">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:51.637809" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:51.638163" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:51.638476" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:51.638856" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:51.639291" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:51.639606" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:51.639991" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:51.640235" elapsed="0.000130"/>
</return>
<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="FAIL" start="2026-10-16T01:26:51.567890" elapsed="0.072565">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:51.640556" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:51.566036" elapsed="0.074615">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:51.640920" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:51.640776" elapsed="0.000195"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:51.641132" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:51.640993" elapsed="0.000188"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:51.641346" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:51.641203" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:51.640757" elapsed="0.000658"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:51.565650" elapsed="0.075803">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:51.565273" elapsed="0.076234">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:51.641557" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:51.556379" elapsed="0.085270">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:51.641915" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:51.642136" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:51.641995" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:51.641979" elapsed="0.000225"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:51.642329" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:51.642497" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:51.642555" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:51.554551" elapsed="0.088097">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:51.554107" elapsed="0.088682">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:51.553865" elapsed="0.088978">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:51.553078" elapsed="0.089849">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:51.643146" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:51.528384" elapsed="0.114868">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:52.662766" elapsed="0.000466"/>
</kw>
<msg time="2026-10-16T01:26:52.663348" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:52.661456" elapsed="0.002115"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:52.660508" elapsed="0.003277"/>
</kw>
<msg time="2026-10-16T01:26:52.663881" 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-10-16T01:26:52.653790" elapsed="0.010183"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:52.652908" elapsed="0.011219"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:52.665185" 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-10-16T01:26:52.664601" elapsed="0.000679"/>
</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-10-16T01:26:52.671934" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:52.671132" elapsed="0.000862"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:52.672997" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:52.672333" elapsed="0.000719"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:52.673150" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:26:52.673438" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:52.670288" elapsed="0.003203"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:52.673874" elapsed="0.000292"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:52.675260" 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-10-16T01:26:52.674534" elapsed="0.000783"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:52.676206" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:52.675645" elapsed="0.000615"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:52.677155" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:52.676569" elapsed="0.000638"/>
</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-10-16T01:26:52.685909" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:52.684456" elapsed="0.001565"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:52.686147" elapsed="0.000131"/>
</return>
<msg time="2026-10-16T01:26:52.686696" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:52.681244" elapsed="0.005681"/>
</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-10-16T01:26:52.709531" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:52.709108" elapsed="0.000459"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:52.710550" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:52.710256" elapsed="0.000393">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:52.710802" 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-10-16T01:26:52.709814" elapsed="0.001020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:52.711499" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:52.711071" elapsed="0.000463"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:52.711952" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:52.712190" 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-10-16T01:26:52.711792" elapsed="0.000433"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:52.712900" 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-10-16T01:26:52.712493" elapsed="0.000468"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:52.714267" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:52.713869" elapsed="0.000440"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:52.714777" 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-10-16T01:26:52.714487" elapsed="0.000316"/>
</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-10-16T01:26:52.715095" 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-10-16T01:26:52.715279" elapsed="0.000022"/>
</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-10-16T01:26:52.715461" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:52.714963" elapsed="0.000550"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:52.714849" elapsed="0.000692"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:52.715582" elapsed="0.000030"/>
</return>
<msg time="2026-10-16T01:26:52.715745" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:52.713478" elapsed="0.002293"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:52.713061" elapsed="0.002740"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:52.715969" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:52.715825" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:52.713029" elapsed="0.003011"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:52.716585" 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-10-16T01:26:52.716194" elapsed="0.000440"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:52.716679" elapsed="0.000051"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:52.708355" elapsed="0.008453"/>
</kw>
<msg time="2026-10-16T01:26:52.716856" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:52.702689" elapsed="0.014217"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:52.720755" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:52.724529" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:52.728368" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:52.728597" 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-10-16T01:26:52.728812" elapsed="0.000026"/>
</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-10-16T01:26:52.729166" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:52.729022" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:52.729008" 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-10-16T01:26:52.729394" elapsed="0.000019"/>
</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-10-16T01:26:52.729570" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:52.729762" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:52.728981" elapsed="0.000832"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:52.728888" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:52.729989" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:52.730057" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:52.730163" 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-10-16T01:26:52.701862" elapsed="0.028324"/>
</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-10-16T01:26:52.731333" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:52.731116" elapsed="0.000286">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:52.731485" 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-10-16T01:26:52.730789" elapsed="0.000719"/>
</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-10-16T01:26:52.731819" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:52.731570" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:52.732335" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:52.732067" elapsed="0.000292"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:52.731896" elapsed="0.000495"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:52.731553" elapsed="0.000858"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:52.732932" 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-10-16T01:26:52.732566" elapsed="0.000390"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:52.733001" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:26:52.733122" 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-manganese/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-10-16T01:26:52.730447" elapsed="0.002698"/>
</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-10-16T01:26:52.734222" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:52.734026" elapsed="0.000255">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:52.734365" 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-10-16T01:26:52.733680" elapsed="0.000708"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:52.734549" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:26:52.734452" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:52.734434" elapsed="0.000191"/>
</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-10-16T01:26:52.734807" 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-10-16T01:26:52.735022" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:52.735084" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:52.735209" 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-manganese/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-10-16T01:26:52.733385" elapsed="0.001848"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:52.736628" 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-10-16T01:26:52.736402" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:52.737193" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:52.736973" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:26:52.741239" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:52.741291" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:52.741388" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:52.737518" elapsed="0.004259">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:52.737294" elapsed="0.004561">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:52.742037" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:52.741886" elapsed="0.000210"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:52.737277" elapsed="0.004841">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:52.742456" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:52.742578" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:52.742543" elapsed="0.000073"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:52.742527" elapsed="0.000111"/>
</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-10-16T01:26:52.742819" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:52.742887" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:26:52.735671" elapsed="0.007319">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:52.743058" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:26:52.692077" elapsed="0.051129">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:52.743599" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:52.743375" elapsed="0.000307"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:52.743326" elapsed="0.000563"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:52.743987" elapsed="0.000038"/>
</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="FAIL" start="2026-10-16T01:26:52.689878" elapsed="0.054337">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:52.687347" elapsed="0.056970">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:52.687320" elapsed="0.057071">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:52.744642" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:52.745022" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:52.745335" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:52.745682" elapsed="0.000054"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:52.746144" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:52.746475" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:52.746857" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:52.747094" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:26:52.679940" elapsed="0.067260">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:52.747262" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:52.678052" elapsed="0.069298">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:52.747568" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:52.747429" elapsed="0.000188"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:52.747941" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:52.747640" elapsed="0.000353"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:52.748157" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:52.748016" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:52.747414" elapsed="0.000811"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:52.677670" elapsed="0.070592">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:52.677302" elapsed="0.071012">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:52.748363" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:52.668870" elapsed="0.079586">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:52.748629" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:52.748940" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:52.748795" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:52.748691" elapsed="0.000318"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:52.749168" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:52.749338" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:52.749396" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:52.667255" elapsed="0.082235">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:52.666809" elapsed="0.082745">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:52.666515" elapsed="0.083089">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:52.665771" elapsed="0.083916">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:52.749985" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:52.644064" elapsed="0.106027">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:53.769450" elapsed="0.000457"/>
</kw>
<msg time="2026-10-16T01:26:53.770028" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:53.768198" elapsed="0.001954"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:53.767232" elapsed="0.003078"/>
</kw>
<msg time="2026-10-16T01:26:53.770403" 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-10-16T01:26:53.760475" elapsed="0.010019"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:53.759553" elapsed="0.011089"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:53.771691" 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-10-16T01:26:53.771173" elapsed="0.000659"/>
</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-10-16T01:26:53.778598" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:53.777857" elapsed="0.000798"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:53.779636" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:53.779036" elapsed="0.000652"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:53.779837" elapsed="0.000065"/>
</return>
<msg time="2026-10-16T01:26:53.780132" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:53.777032" elapsed="0.003152"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:53.780508" elapsed="0.000332"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:53.781921" 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-10-16T01:26:53.781207" elapsed="0.000769"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:53.782849" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:53.782298" elapsed="0.000605"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:53.783882" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:53.783209" elapsed="0.000727"/>
</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-10-16T01:26:53.792465" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:53.791121" elapsed="0.001449"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:53.792696" elapsed="0.000201"/>
</return>
<msg time="2026-10-16T01:26:53.793366" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:53.787929" elapsed="0.005561"/>
</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-10-16T01:26:53.817927" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:53.817473" elapsed="0.000491"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:53.818946" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:53.818616" elapsed="0.000432">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:53.819166" 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-10-16T01:26:53.818178" elapsed="0.001019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:53.819899" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:53.819429" elapsed="0.000506"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:53.820318" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:53.820513" 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-10-16T01:26:53.820160" elapsed="0.000387"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:53.821181" 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-10-16T01:26:53.820872" elapsed="0.000367"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:53.822690" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:53.822371" elapsed="0.000412"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:53.823383" 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-10-16T01:26:53.823027" elapsed="0.000389"/>
</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-10-16T01:26:53.823844" elapsed="0.000031"/>
</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-10-16T01:26:53.824105" elapsed="0.000038"/>
</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-10-16T01:26:53.824414" elapsed="0.000033"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:53.823630" elapsed="0.000859"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:53.823477" elapsed="0.001045"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:53.824563" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:26:53.824691" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:53.821900" elapsed="0.002841"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:53.821324" elapsed="0.003446"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:53.824940" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:53.824796" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:53.821300" elapsed="0.003710"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:53.825548" 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-10-16T01:26:53.825163" elapsed="0.000410"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:53.825616" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:53.816780" elapsed="0.008961"/>
</kw>
<msg time="2026-10-16T01:26:53.825828" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:53.811164" elapsed="0.014713"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:53.829646" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:53.833444" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:53.837213" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:53.837388" elapsed="0.000020"/>
</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-10-16T01:26:53.837562" 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-10-16T01:26:53.837926" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:53.837785" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:53.837772" elapsed="0.000228"/>
</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-10-16T01:26:53.838149" elapsed="0.000019"/>
</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-10-16T01:26:53.838322" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:53.838479" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:53.837744" elapsed="0.000784"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:53.837631" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:53.838698" elapsed="0.000043"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:53.838791" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:53.838894" 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-10-16T01:26:53.810284" elapsed="0.028634"/>
</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-10-16T01:26:53.840007" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:53.839815" elapsed="0.000251">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:53.840179" 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-10-16T01:26:53.839472" elapsed="0.000731"/>
</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-10-16T01:26:53.840479" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:53.840266" elapsed="0.000265"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:53.841008" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:53.840741" elapsed="0.000291"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:53.840554" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:53.840249" elapsed="0.000836"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:53.841574" 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-10-16T01:26:53.841240" elapsed="0.000358"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:53.841643" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:26:53.841794" 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-manganese/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-10-16T01:26:53.839177" elapsed="0.002641"/>
</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-10-16T01:26:53.842891" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:53.842668" elapsed="0.000281">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:53.843032" 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-10-16T01:26:53.842354" elapsed="0.000700"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:53.843372" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:26:53.843269" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:53.843100" elapsed="0.000350"/>
</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-10-16T01:26:53.843598" 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-10-16T01:26:53.843814" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:53.843878" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:53.844003" 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-manganese/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-10-16T01:26:53.842060" elapsed="0.001966"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:53.845410" 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-10-16T01:26:53.845185" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:53.845883" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:53.845635" 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-10-16T01:26:53.849894" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:53.849947" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:53.850044" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:53.846202" elapsed="0.004212">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:53.845983" elapsed="0.004509">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:53.850669" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:53.850521" elapsed="0.000276"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:53.845966" elapsed="0.004858">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:53.851163" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:53.851282" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:53.851250" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:53.851234" elapsed="0.000106"/>
</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-10-16T01:26:53.851474" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:53.851537" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:26:53.844295" elapsed="0.007344">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:53.851731" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:26:53.800681" elapsed="0.051178">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:53.852247" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:53.852026" elapsed="0.000302"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:53.851978" elapsed="0.000390"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:53.852453" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:26:53.798075" elapsed="0.054542">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:53.794149" elapsed="0.058599">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:53.794104" elapsed="0.058719">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:53.853072" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:53.853414" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:53.853751" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:53.854104" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:53.854531" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:53.854903" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:53.855255" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:53.855620" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:26:53.786565" elapsed="0.069250">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:53.855880" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:53.784775" elapsed="0.071195">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:53.856239" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:53.856098" elapsed="0.000192"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:53.856447" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:53.856312" elapsed="0.000184"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:53.856657" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:53.856518" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:53.856081" elapsed="0.000678"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:53.784404" elapsed="0.072394">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:53.784034" elapsed="0.072816">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:53.856898" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:53.775639" elapsed="0.081348">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:53.857159" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:53.857381" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:53.857242" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:53.857227" elapsed="0.000222"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:53.857572" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:53.857859" elapsed="0.000021"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:53.857921" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:53.774067" elapsed="0.083946">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:53.773559" elapsed="0.084516">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:53.773306" elapsed="0.084817">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:53.772276" elapsed="0.085928">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:53.858412" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:53.750924" elapsed="0.107592">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:54.879511" elapsed="0.000432"/>
</kw>
<msg time="2026-10-16T01:26:54.880044" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:54.878277" elapsed="0.001871"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:54.877294" elapsed="0.003007"/>
</kw>
<msg time="2026-10-16T01:26:54.880647" 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-10-16T01:26:54.870587" elapsed="0.010209"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:54.869782" elapsed="0.011172"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:54.881975" 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-10-16T01:26:54.881408" elapsed="0.000659"/>
</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-10-16T01:26:54.888539" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:54.887812" elapsed="0.000786"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:54.889580" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:54.888979" elapsed="0.000654"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:54.889770" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:26:54.890062" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:54.886991" elapsed="0.003123"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:54.890437" elapsed="0.000371"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:54.891890" 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-10-16T01:26:54.891179" elapsed="0.000769"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:54.892823" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:54.892274" elapsed="0.000604"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:54.893677" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:54.893184" elapsed="0.000592"/>
</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-10-16T01:26:54.902259" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:54.900926" elapsed="0.001442"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:54.902494" elapsed="0.000133"/>
</return>
<msg time="2026-10-16T01:26:54.903231" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:54.897683" elapsed="0.005672"/>
</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-10-16T01:26:54.926758" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:54.926305" elapsed="0.000491"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:54.927753" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:54.927446" elapsed="0.000399">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:54.927963" 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-10-16T01:26:54.927011" elapsed="0.000984"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:54.928661" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:54.928230" elapsed="0.000467"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:54.929110" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:54.929279" 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-10-16T01:26:54.928955" elapsed="0.000358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:54.929968" 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-10-16T01:26:54.929575" elapsed="0.000451"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:54.931302" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:54.930978" elapsed="0.000382"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:54.932200" 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-10-16T01:26:54.931598" elapsed="0.000645"/>
</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-10-16T01:26:54.932644" 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-10-16T01:26:54.932853" elapsed="0.000022"/>
</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-10-16T01:26:54.933033" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:54.932506" elapsed="0.000578"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:54.932320" elapsed="0.000791"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:54.933151" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:26:54.933279" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:54.930454" elapsed="0.002848"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:54.930112" elapsed="0.003218"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:54.933496" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:54.933353" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:54.930088" elapsed="0.003477"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:54.934122" 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-10-16T01:26:54.933741" elapsed="0.000406"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:54.934191" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:54.925584" elapsed="0.008707"/>
</kw>
<msg time="2026-10-16T01:26:54.934337" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:54.919961" elapsed="0.014422"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:54.938204" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:54.942057" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:54.945860" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:54.946037" elapsed="0.000019"/>
</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-10-16T01:26:54.946212" elapsed="0.000019"/>
</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-10-16T01:26:54.946584" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:54.946409" elapsed="0.000227"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:54.946395" 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-10-16T01:26:54.946834" 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-10-16T01:26:54.947013" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:54.947172" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:54.946368" elapsed="0.000852"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:54.946279" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:54.947391" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:54.947458" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:26:54.947563" 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-10-16T01:26:54.919083" elapsed="0.028504"/>
</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-10-16T01:26:54.948680" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:54.948490" elapsed="0.000277">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:54.948850" 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-10-16T01:26:54.948170" elapsed="0.000703"/>
</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-10-16T01:26:54.949153" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:54.948937" elapsed="0.000268"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:54.949648" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:54.949384" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:54.949228" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:54.948920" elapsed="0.000845"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:54.950263" 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-10-16T01:26:54.949924" elapsed="0.000363"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:54.950333" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:26:54.950456" 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-manganese/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-10-16T01:26:54.947870" elapsed="0.002609"/>
</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-10-16T01:26:54.951558" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:54.951361" elapsed="0.000255">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:54.951724" 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-10-16T01:26:54.951047" elapsed="0.000702"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:54.951914" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:26:54.951814" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:54.951797" elapsed="0.000192"/>
</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-10-16T01:26:54.952138" 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-10-16T01:26:54.952308" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:54.952367" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:54.952491" 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-manganese/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-10-16T01:26:54.950749" elapsed="0.001807"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:54.953992" 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-10-16T01:26:54.953763" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:54.954438" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:54.954220" elapsed="0.000259"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:26:54.958430" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:54.958481" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:54.958582" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:54.954789" elapsed="0.004141">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:54.954541" elapsed="0.004466">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:54.959187" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:54.959038" elapsed="0.000209"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:54.954523" elapsed="0.004746">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:54.959603" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:54.959754" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:54.959690" elapsed="0.000103"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:54.959674" elapsed="0.000140"/>
</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-10-16T01:26:54.959949" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:54.960013" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:26:54.952876" elapsed="0.007237">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:54.960181" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:26:54.909432" elapsed="0.050875">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:54.960690" elapsed="0.000078"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:54.960473" elapsed="0.000357"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:54.960425" elapsed="0.000446"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:54.960955" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:26:54.907222" elapsed="0.053898">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:54.903964" elapsed="0.057288">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:54.903921" elapsed="0.057406">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:54.961576" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:54.961949" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:54.962260" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:54.962606" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:54.963075" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:54.963388" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:54.963790" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:54.964031" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:26:54.896379" elapsed="0.067755">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:54.964195" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:54.894564" elapsed="0.069720">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:54.964503" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:54.964363" elapsed="0.000191"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:54.964742" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:54.964576" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:54.964958" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:54.964816" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:54.964348" elapsed="0.000678"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:54.894240" elapsed="0.070824">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:54.893873" elapsed="0.071242">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:54.965163" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:54.885542" elapsed="0.079711">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:54.965425" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:54.965641" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:54.965503" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:54.965488" elapsed="0.000302"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:54.965919" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:54.966085" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:54.966143" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:54.883998" elapsed="0.082279">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:54.883516" elapsed="0.082824">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:54.883284" elapsed="0.083104">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:54.882504" elapsed="0.083965">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:54.966677" elapsed="0.000099"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:54.859138" elapsed="0.107725">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:55.985434" elapsed="0.000449"/>
</kw>
<msg time="2026-10-16T01:26:55.985986" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:55.984168" elapsed="0.001923"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:55.983224" elapsed="0.003032"/>
</kw>
<msg time="2026-10-16T01:26:55.986359" 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-10-16T01:26:55.976589" elapsed="0.009866"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:55.975771" elapsed="0.010827"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:55.987623" 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-10-16T01:26:55.987107" elapsed="0.000649"/>
</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-10-16T01:26:55.994542" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:55.993693" elapsed="0.000908"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:55.995590" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:55.994983" elapsed="0.000660"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:55.995780" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:26:55.996069" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:55.992911" elapsed="0.003209"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:55.996449" elapsed="0.000339"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:55.997879" 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-10-16T01:26:55.997161" elapsed="0.000774"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:55.998811" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:55.998262" elapsed="0.000603"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:55.999674" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:55.999174" elapsed="0.000597"/>
</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-10-16T01:26:56.008350" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:56.006977" elapsed="0.001558"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:56.008667" elapsed="0.000195"/>
</return>
<msg time="2026-10-16T01:26:56.009291" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:56.003694" elapsed="0.005725"/>
</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-10-16T01:26:56.033985" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:56.033524" elapsed="0.000497"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:56.034974" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:56.034676" elapsed="0.000385">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:56.035176" 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-10-16T01:26:56.034237" elapsed="0.000970"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:56.035903" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:56.035440" elapsed="0.000498"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:56.036314" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:56.036482" 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-10-16T01:26:56.036162" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:56.037118" 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-10-16T01:26:56.036811" elapsed="0.000363"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:56.038614" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:56.038112" elapsed="0.000561"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:56.039302" 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-10-16T01:26:56.038951" elapsed="0.000385"/>
</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-10-16T01:26:56.039756" elapsed="0.000031"/>
</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-10-16T01:26:56.040039" elapsed="0.000034"/>
</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-10-16T01:26:56.040297" elapsed="0.000027"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:56.039545" elapsed="0.000840"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:56.039396" elapsed="0.001027"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:56.040479" elapsed="0.000037"/>
</return>
<msg time="2026-10-16T01:26:56.040660" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:56.037611" elapsed="0.003081"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:56.037260" elapsed="0.003515"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:56.041012" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:56.040808" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:56.037235" elapsed="0.003874"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:56.041860" 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-10-16T01:26:56.041362" elapsed="0.000524"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:56.041930" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:56.032829" elapsed="0.009200"/>
</kw>
<msg time="2026-10-16T01:26:56.042110" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:56.027138" elapsed="0.015020"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:56.045979" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:56.049777" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:56.053530" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:56.053730" 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-10-16T01:26:56.053911" elapsed="0.000019"/>
</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-10-16T01:26:56.054248" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:56.054107" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:56.054093" elapsed="0.000228"/>
</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-10-16T01:26:56.054472" elapsed="0.000019"/>
</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-10-16T01:26:56.054646" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:56.054833" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:56.054067" elapsed="0.000815"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:56.053978" elapsed="0.000927"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:56.055053" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:56.055120" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:56.055224" 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-10-16T01:26:56.026280" elapsed="0.028968"/>
</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-10-16T01:26:56.056360" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:56.056170" elapsed="0.000249">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:56.056500" 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-10-16T01:26:56.055846" elapsed="0.000677"/>
</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-10-16T01:26:56.056825" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:56.056585" elapsed="0.000325"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:56.057361" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:56.057095" elapsed="0.000290"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:56.056935" elapsed="0.000483"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:56.056569" elapsed="0.000869"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:56.057961" 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-10-16T01:26:56.057595" elapsed="0.000390"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:56.058031" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:26:56.058154" 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-manganese/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-10-16T01:26:56.055505" elapsed="0.002671"/>
</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-10-16T01:26:56.059294" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:56.059097" elapsed="0.000256">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:56.059436" 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-10-16T01:26:56.058777" elapsed="0.000682"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:56.059619" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:26:56.059521" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:56.059505" elapsed="0.000213"/>
</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-10-16T01:26:56.059872" elapsed="0.000020"/>
</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-10-16T01:26:56.060043" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:56.060103" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:56.060226" 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-manganese/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-10-16T01:26:56.058422" elapsed="0.001826"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:56.061631" 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-10-16T01:26:56.061407" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:56.062102" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:56.061886" elapsed="0.000257"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:26:56.065916" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:56.065966" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:56.066060" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:56.062422" elapsed="0.003961">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:56.062203" elapsed="0.004255">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:56.066638" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:56.066488" elapsed="0.000233"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:56.062186" elapsed="0.004560">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:56.067076" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:56.067229" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:56.067195" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:56.067177" 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-10-16T01:26:56.067427" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:56.067489" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:26:56.060687" elapsed="0.006902">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:56.067657" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:26:56.016612" elapsed="0.051195">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:56.068195" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:56.067976" elapsed="0.000305"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:56.067927" elapsed="0.000394"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:56.068404" elapsed="0.000037"/>
</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="FAIL" start="2026-10-16T01:26:56.013965" elapsed="0.054607">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:56.010059" elapsed="0.058613">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:56.010015" elapsed="0.058764">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:56.069026" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:56.069373" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:56.069681" elapsed="0.000067"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:56.070078" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:56.070505" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:56.070851" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:56.071198" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:56.071434" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:26:56.002380" elapsed="0.069156">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:56.071597" elapsed="0.000017"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:56.000566" elapsed="0.071122">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:56.071961" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:56.071821" elapsed="0.000190"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:56.072204" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:56.072033" elapsed="0.000223"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:56.072420" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:56.072278" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:56.071802" elapsed="0.000687"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:56.000241" elapsed="0.072286">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:55.999868" elapsed="0.072712">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:56.072627" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:55.991497" elapsed="0.081254">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:56.072928" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:56.073147" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:56.073007" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:56.072992" elapsed="0.000227"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:56.073344" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:56.073510" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:56.073569" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:55.989942" elapsed="0.083719">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:55.989463" elapsed="0.084379">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:55.989229" elapsed="0.084665">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:55.988431" elapsed="0.085544">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:56.074184" elapsed="0.000021"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:55.967420" elapsed="0.106868">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:57.094131" elapsed="0.000403"/>
</kw>
<msg time="2026-10-16T01:26:57.094652" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:57.092815" elapsed="0.001998"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:57.091895" elapsed="0.003080"/>
</kw>
<msg time="2026-10-16T01:26:57.095064" 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-10-16T01:26:57.085007" elapsed="0.010147"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:57.084077" elapsed="0.011241"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:57.096611" 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-10-16T01:26:57.096026" elapsed="0.000748"/>
</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-10-16T01:26:57.103817" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:57.102954" elapsed="0.000923"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:57.104909" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:57.104212" elapsed="0.000753"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:57.105063" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:26:57.105354" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:57.102106" elapsed="0.003301"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:57.105784" elapsed="0.000290"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:57.107163" 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-10-16T01:26:57.106442" elapsed="0.000778"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:57.108104" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:57.107547" elapsed="0.000611"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:57.109016" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:57.108464" elapsed="0.000604"/>
</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-10-16T01:26:57.117926" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:57.116380" elapsed="0.001657"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:57.118164" elapsed="0.000132"/>
</return>
<msg time="2026-10-16T01:26:57.118895" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:57.113037" elapsed="0.005993"/>
</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-10-16T01:26:57.144256" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:57.143833" elapsed="0.000458"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:57.145263" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:57.144976" elapsed="0.000385">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:57.145480" 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-10-16T01:26:57.144505" elapsed="0.001006"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:57.146213" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:57.145780" elapsed="0.000476"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:57.146759" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:57.146954" 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-10-16T01:26:57.146535" elapsed="0.000452"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:57.147556" 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-10-16T01:26:57.147251" elapsed="0.000362"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:57.149126" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:57.148803" elapsed="0.000380"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:57.149870" 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-10-16T01:26:57.149423" elapsed="0.000481"/>
</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-10-16T01:26:57.150297" elapsed="0.000029"/>
</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-10-16T01:26:57.150549" 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-10-16T01:26:57.150834" elapsed="0.000029"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:57.150118" elapsed="0.000791"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:57.149966" elapsed="0.000981"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:57.151004" elapsed="0.000036"/>
</return>
<msg time="2026-10-16T01:26:57.151186" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:57.148301" elapsed="0.002917"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:57.147733" elapsed="0.003525"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:57.151495" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:57.151294" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:57.147674" elapsed="0.003918"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:57.152414" 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-10-16T01:26:57.151836" elapsed="0.000621"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:57.152533" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:57.143111" elapsed="0.009557"/>
</kw>
<msg time="2026-10-16T01:26:57.152740" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:57.137472" elapsed="0.015316"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:57.156542" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:57.160354" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:57.164189" elapsed="0.000028"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:57.164402" 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-10-16T01:26:57.164582" elapsed="0.000019"/>
</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-10-16T01:26:57.164942" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:57.164800" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:57.164787" elapsed="0.000227"/>
</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-10-16T01:26:57.165166" elapsed="0.000019"/>
</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-10-16T01:26:57.165338" elapsed="0.000018"/>
</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-10-16T01:26:57.165532" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:57.164759" elapsed="0.000822"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:57.164647" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:57.165779" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:57.165849" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:57.165953" 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-10-16T01:26:57.136551" elapsed="0.029426"/>
</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-10-16T01:26:57.167096" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:57.166883" elapsed="0.000273">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:57.167238" 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-10-16T01:26:57.166533" elapsed="0.000731"/>
</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-10-16T01:26:57.167543" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:57.167327" elapsed="0.000267"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:57.168067" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:57.167805" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:57.167617" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:57.167311" elapsed="0.000831"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:57.168629" 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-10-16T01:26:57.168298" elapsed="0.000354"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:57.168734" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:26:57.168860" 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-manganese/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-10-16T01:26:57.166238" elapsed="0.002645"/>
</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-10-16T01:26:57.169957" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:57.169759" elapsed="0.000257">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:57.170099" 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-10-16T01:26:57.169421" elapsed="0.000701"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:57.170446" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:26:57.170343" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:57.170168" elapsed="0.000354"/>
</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-10-16T01:26:57.170670" elapsed="0.000020"/>
</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-10-16T01:26:57.170874" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:57.170935" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:57.171060" 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-manganese/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-10-16T01:26:57.169124" elapsed="0.001959"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:57.172294" 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-10-16T01:26:57.172073" elapsed="0.000263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:57.172842" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:57.172591" 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-10-16T01:26:57.176810" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:57.176864" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:57.176959" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:57.173167" elapsed="0.004171">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:57.172943" elapsed="0.004487">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:57.177612" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:57.177461" elapsed="0.000210"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:57.172926" elapsed="0.004790">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:57.178053" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:57.178174" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:57.178141" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:57.178124" elapsed="0.000109"/>
</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-10-16T01:26:57.178373" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:57.178435" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:26:57.171351" elapsed="0.007186">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:57.178604" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:26:57.126772" elapsed="0.051990">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:57.179153" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:57.178933" elapsed="0.000301"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:57.178885" elapsed="0.000389"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:57.179364" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:26:57.123294" elapsed="0.056236">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:57.119486" elapsed="0.060145">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:57.119443" elapsed="0.060290">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:57.179984" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:57.180363" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:57.180674" elapsed="0.000052"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:57.181060" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:57.181497" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:57.181861" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:57.182214" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:57.182454" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:26:57.111679" elapsed="0.070877">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:57.182618" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:57.109897" elapsed="0.072841">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:57.182962" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:57.182822" elapsed="0.000191"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:57.183172" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:57.183035" elapsed="0.000186"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:57.183388" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:57.183245" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:57.182806" elapsed="0.000651"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:57.109524" elapsed="0.073971">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:57.109161" elapsed="0.074386">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:57.183595" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:57.100498" elapsed="0.083188">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:57.183945" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:57.184162" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:57.184023" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:57.184008" elapsed="0.000223"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:57.184353" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:57.184518" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:57.184575" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:57.098810" elapsed="0.085856">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:57.098312" elapsed="0.086510">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:57.098067" elapsed="0.086863">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:57.097234" elapsed="0.087781">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:57.185225" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:57.075156" elapsed="0.110173">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:58.206430" elapsed="0.000435"/>
</kw>
<msg time="2026-10-16T01:26:58.206975" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:58.205186" elapsed="0.001902"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:58.204251" elapsed="0.002992"/>
</kw>
<msg time="2026-10-16T01:26:58.207334" 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-10-16T01:26:58.197740" elapsed="0.009683"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:58.196872" elapsed="0.010696"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:58.208858" 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-10-16T01:26:58.208079" elapsed="0.000873"/>
</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-10-16T01:26:58.215443" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:58.214665" elapsed="0.000836"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:58.216473" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:58.215876" elapsed="0.000651"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:58.216619" elapsed="0.000060"/>
</return>
<msg time="2026-10-16T01:26:58.216953" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:58.213890" elapsed="0.003113"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:58.217328" elapsed="0.000282"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:58.218684" 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-10-16T01:26:58.218018" elapsed="0.000775"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:58.219625" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:58.219120" elapsed="0.000557"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:58.220532" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:58.220037" elapsed="0.000547"/>
</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-10-16T01:26:58.229188" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:58.227837" elapsed="0.001460"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:58.229427" elapsed="0.000133"/>
</return>
<msg time="2026-10-16T01:26:58.230238" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:58.224555" elapsed="0.005810"/>
</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-10-16T01:26:58.254445" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:58.254019" elapsed="0.000462"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:58.255460" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:58.255179" elapsed="0.000372">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:58.255668" 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-10-16T01:26:58.254732" elapsed="0.001002"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:58.256407" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:58.255975" elapsed="0.000467"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:58.256858" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:58.257043" 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-10-16T01:26:58.256669" elapsed="0.000406"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:58.257646" 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-10-16T01:26:58.257343" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:58.258980" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:58.258633" elapsed="0.000403"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:58.259910" 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-10-16T01:26:58.259282" elapsed="0.000663"/>
</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-10-16T01:26:58.260358" elapsed="0.000036"/>
</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-10-16T01:26:58.260671" elapsed="0.000054"/>
</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-10-16T01:26:58.260886" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:58.260159" elapsed="0.000779"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:58.260005" elapsed="0.000960"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:58.261006" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:26:58.261135" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:58.258167" elapsed="0.002991"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:58.257822" elapsed="0.003364"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:58.261355" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:58.261211" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:58.257798" elapsed="0.003625"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:58.261993" 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-10-16T01:26:58.261576" elapsed="0.000442"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:58.262062" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:58.253292" elapsed="0.008868"/>
</kw>
<msg time="2026-10-16T01:26:58.262207" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:58.247639" elapsed="0.014618"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:58.266155" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:58.270167" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:58.274078" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:58.274257" 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-10-16T01:26:58.274464" 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-10-16T01:26:58.274827" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:58.274662" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:58.274649" 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-10-16T01:26:58.275053" elapsed="0.000019"/>
</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-10-16T01:26:58.275228" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:58.275422" elapsed="0.000023"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:58.274623" elapsed="0.000856"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:58.274534" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:58.275653" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:58.275744" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:26:58.275850" 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-10-16T01:26:58.246819" elapsed="0.029055"/>
</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-10-16T01:26:58.277024" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:58.276824" elapsed="0.000259">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:58.277166" 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-10-16T01:26:58.276471" elapsed="0.000717"/>
</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-10-16T01:26:58.277469" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:58.277252" elapsed="0.000270"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:58.278005" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:58.277736" elapsed="0.000294"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:58.277545" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:58.277235" elapsed="0.000848"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:58.278581" 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-10-16T01:26:58.278243" elapsed="0.000403"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:58.278722" elapsed="0.000028"/>
</return>
<msg time="2026-10-16T01:26:58.278853" 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-manganese/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-10-16T01:26:58.276134" elapsed="0.002742"/>
</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-10-16T01:26:58.279972" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:58.279770" elapsed="0.000262">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:58.280116" 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-10-16T01:26:58.279419" elapsed="0.000720"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:58.280302" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:26:58.280203" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:58.280186" elapsed="0.000193"/>
</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-10-16T01:26:58.280528" 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-10-16T01:26:58.280722" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:58.280786" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:58.280910" 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-manganese/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-10-16T01:26:58.279121" elapsed="0.001812"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:58.282328" 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-10-16T01:26:58.282101" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:58.282806" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:58.282558" 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-10-16T01:26:58.286990" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:58.287044" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:58.287150" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:58.283133" elapsed="0.004368">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:58.282909" elapsed="0.004669">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:58.287789" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:58.287609" elapsed="0.000240"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:58.282892" elapsed="0.004979">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:58.288205" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:58.288329" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:58.288294" elapsed="0.000073"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:58.288276" elapsed="0.000111"/>
</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-10-16T01:26:58.288521" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:58.288615" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:26:58.281206" elapsed="0.007541">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:58.288817" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:26:58.237188" elapsed="0.051756">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:58.289333" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:58.289114" elapsed="0.000306"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:58.289065" elapsed="0.000395"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:58.289544" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:26:58.234873" elapsed="0.054870">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:58.230872" elapsed="0.058976">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:58.230829" elapsed="0.059093">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:58.290168" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:58.290518" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:58.290856" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:58.291203" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:58.291627" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:58.291984" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:58.292331" elapsed="0.000024"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:58.292573" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:26:58.223255" elapsed="0.069419">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:58.292783" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:58.221430" elapsed="0.071445">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:58.293094" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:58.292953" elapsed="0.000191"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:58.293302" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:58.293166" elapsed="0.000185"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:58.293510" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:58.293372" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:58.292938" elapsed="0.000678"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:58.221096" elapsed="0.072563">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:58.220678" elapsed="0.073066">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:58.293796" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:58.212450" elapsed="0.081438">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:58.294064" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:58.294283" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:58.294143" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:58.294127" elapsed="0.000225"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:58.294478" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:58.294645" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:58.294787" elapsed="0.000016"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:58.210900" elapsed="0.083984">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:58.210410" elapsed="0.084535">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:58.210171" elapsed="0.084823">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:58.209394" elapsed="0.085681">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:58.295282" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:58.185991" elapsed="0.109394">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:26:59.314599" elapsed="0.000457"/>
</kw>
<msg time="2026-10-16T01:26:59.315176" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:59.313342" elapsed="0.001955"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:26:59.312389" elapsed="0.003068"/>
</kw>
<msg time="2026-10-16T01:26:59.315547" 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-10-16T01:26:59.305582" elapsed="0.010053"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:26:59.304748" elapsed="0.011238"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:59.317154" 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-10-16T01:26:59.316529" elapsed="0.000718"/>
</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-10-16T01:26:59.324458" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:26:59.323550" elapsed="0.000967"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:59.325502" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:59.324895" elapsed="0.000659"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:26:59.325652" elapsed="0.000105"/>
</return>
<msg time="2026-10-16T01:26:59.325990" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:26:59.322523" elapsed="0.003518"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:26:59.326367" elapsed="0.000281"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:59.327769" 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-10-16T01:26:59.327063" elapsed="0.000764"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:59.328656" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:59.328152" elapsed="0.000598"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:26:59.329555" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:26:59.329061" elapsed="0.000545"/>
</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-10-16T01:26:59.338147" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:26:59.336813" elapsed="0.001440"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:26:59.338376" elapsed="0.000130"/>
</return>
<msg time="2026-10-16T01:26:59.338988" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:26:59.333559" elapsed="0.005552"/>
</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-10-16T01:26:59.365145" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:59.364663" elapsed="0.000520"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:26:59.366230" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:26:59.365914" elapsed="0.000423">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:59.366460" 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-10-16T01:26:59.365413" elapsed="0.001081"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:59.367260" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:59.366800" elapsed="0.000498"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:26:59.367738" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:26:59.367944" 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-10-16T01:26:59.367539" elapsed="0.000439"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:59.368631" 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-10-16T01:26:59.368260" elapsed="0.000461"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:59.370248" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:59.369680" elapsed="0.000629"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:26:59.370781" 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-10-16T01:26:59.370496" elapsed="0.000310"/>
</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-10-16T01:26:59.371092" elapsed="0.000020"/>
</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-10-16T01:26:59.371274" elapsed="0.000022"/>
</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-10-16T01:26:59.371509" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:26:59.370963" elapsed="0.000599"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:26:59.370849" elapsed="0.000743"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:26:59.371634" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:26:59.371793" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:26:59.369186" elapsed="0.002630"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:59.368815" elapsed="0.003031"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:59.372015" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:59.371871" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:59.368789" elapsed="0.003297"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:26:59.372631" 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-10-16T01:26:59.372240" elapsed="0.000416"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:26:59.372724" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:26:59.363920" elapsed="0.008907"/>
</kw>
<msg time="2026-10-16T01:26:59.372874" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:26:59.357835" elapsed="0.015085"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:59.376718" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:59.380529" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:59.384353" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:59.384533" elapsed="0.000020"/>
</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-10-16T01:26:59.384734" 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-10-16T01:26:59.385088" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:59.384944" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:59.384929" 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-10-16T01:26:59.385313" elapsed="0.000019"/>
</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-10-16T01:26:59.385486" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:59.385644" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:26:59.384900" elapsed="0.000815"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:26:59.384806" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:59.385944" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:59.386014" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:26:59.386128" 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-10-16T01:26:59.356928" elapsed="0.029224"/>
</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-10-16T01:26:59.387343" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:59.387103" elapsed="0.000310">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:59.387497" 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-10-16T01:26:59.386753" 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-10-16T01:26:59.387836" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:59.387583" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:26:59.388357" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:26:59.388091" elapsed="0.000291"/>
</kw>
<status status="PASS" start="2026-10-16T01:26:59.387913" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:59.387566" elapsed="0.000867"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:26:59.388990" 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-10-16T01:26:59.388597" elapsed="0.000418"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:26:59.389059" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:26:59.389183" 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-manganese/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-10-16T01:26:59.386415" elapsed="0.002790"/>
</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-10-16T01:26:59.390389" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:26:59.390084" elapsed="0.000366">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:26:59.390533" 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-10-16T01:26:59.389769" elapsed="0.000787"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:26:59.390747" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:26:59.390619" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-10-16T01:26:59.390602" elapsed="0.000224"/>
</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-10-16T01:26:59.390975" elapsed="0.000020"/>
</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-10-16T01:26:59.391146" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:59.391205" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:26:59.391328" 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-manganese/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-10-16T01:26:59.389450" elapsed="0.001902"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:59.392974" 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-10-16T01:26:59.392739" elapsed="0.000278"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:26:59.393419" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:26:59.393201" elapsed="0.000258"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:26:59.397361" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:26:59.397458" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:26:59.397561" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:59.393763" elapsed="0.004205">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:59.393517" elapsed="0.004534">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:59.398233" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:59.398082" elapsed="0.000209"/>
</branch>
<status status="FAIL" start="2026-10-16T01:26:59.393501" elapsed="0.004812">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:26:59.398661" elapsed="0.000048"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:59.398807" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:26:59.398775" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:59.398758" elapsed="0.000107"/>
</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-10-16T01:26:59.399004" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:26:59.399066" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:26:59.391841" elapsed="0.007328">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:59.399236" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:26:59.346546" elapsed="0.052839">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:26:59.399843" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:59.399557" elapsed="0.000371"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:59.399507" elapsed="0.000462"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:26:59.400054" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:26:59.343641" elapsed="0.056582">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:26:59.339573" elapsed="0.060751">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:26:59.339530" elapsed="0.060869">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:59.400652" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:26:59.401044" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:59.401358" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:26:59.401746" elapsed="0.000024"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:26:59.402220" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:59.402540" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:26:59.402928" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:26:59.403180" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:26:59.332266" elapsed="0.071018">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:26:59.403354" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:26:59.330439" elapsed="0.073007">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:59.403670" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:59.403529" elapsed="0.000223"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:59.403912" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:59.403774" elapsed="0.000186"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:59.404125" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:59.403982" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:59.403513" elapsed="0.000678"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:26:59.330113" elapsed="0.074117">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:26:59.329742" elapsed="0.074544">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:59.404339" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:26:59.320873" elapsed="0.083559">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:59.404610" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:59.404926" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:26:59.404779" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:26:59.404672" elapsed="0.000323"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:59.405122" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:59.405289" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:26:59.405347" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:26:59.319244" elapsed="0.086199">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:26:59.318788" elapsed="0.086720">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:26:59.318491" elapsed="0.087066">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:26:59.317740" elapsed="0.087903">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:26:59.406055" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:26:59.296185" elapsed="0.109980">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:27:00.425787" elapsed="0.000207"/>
</kw>
<msg time="2026-10-16T01:27:00.426056" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:00.424418" elapsed="0.001699"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:27:00.423143" elapsed="0.003047"/>
</kw>
<msg time="2026-10-16T01:27:00.426231" 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-10-16T01:27:00.416513" elapsed="0.009758"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:27:00.415638" elapsed="0.010698"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:00.426826" 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-10-16T01:27:00.426563" elapsed="0.000305"/>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<for flavor="IN">
<iter>
<kw name="Get_Leader_And_Followers_For_Shard" owner="ClusterManagement">
<kw name="Get_State_Info_For_Shard" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:00.429773" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:00.429413" elapsed="0.000385"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:00.430215" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:00.429948" elapsed="0.000291"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:00.430282" elapsed="0.000031"/>
</return>
<msg time="2026-10-16T01:27:00.430415" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:00.429064" elapsed="0.001374"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:27:00.430589" elapsed="0.000159"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:00.431210" 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-10-16T01:27:00.430913" elapsed="0.000321"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:00.431602" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:00.431378" elapsed="0.000247"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:00.432010" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:00.431789" elapsed="0.000245"/>
</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-10-16T01:27:00.435911" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:27:00.435293" elapsed="0.000666"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:27:00.436015" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:27:00.436266" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:27:00.433879" elapsed="0.002442"/>
</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-10-16T01:27:00.452274" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:00.451972" elapsed="0.000328"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:27:00.453088" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:27:00.452862" elapsed="0.000305">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:00.453251" 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-10-16T01:27:00.452516" elapsed="0.000758"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:00.453778" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:00.453441" elapsed="0.000362"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:27:00.454081" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:27:00.454229" 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-10-16T01:27:00.453967" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:00.454659" 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-10-16T01:27:00.454441" 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-10-16T01:27:00.455776" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:00.455507" elapsed="0.000311"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:27:00.456246" 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-10-16T01:27:00.455990" elapsed="0.000280"/>
</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-10-16T01:27:00.456548" elapsed="0.000020"/>
</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-10-16T01:27:00.456755" 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-10-16T01:27:00.456934" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:27:00.456420" elapsed="0.000565"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:27:00.456312" elapsed="0.000702"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:27:00.457055" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:27:00.457181" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:27:00.455163" elapsed="0.002041"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:00.454794" 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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:00.457400" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:00.457259" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:00.454776" elapsed="0.002693"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:27:00.458041" 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-10-16T01:27:00.457621" elapsed="0.000445"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:27:00.458110" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:27:00.451450" elapsed="0.006757"/>
</kw>
<msg time="2026-10-16T01:27:00.458253" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:00.447405" elapsed="0.010894"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:00.462129" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:00.465895" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:00.469669" elapsed="0.000049"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:00.469871" elapsed="0.000020"/>
</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-10-16T01:27:00.470047" elapsed="0.000019"/>
</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-10-16T01:27:00.470380" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:00.470242" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:00.470229" elapsed="0.000224"/>
</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-10-16T01:27:00.470602" elapsed="0.000019"/>
</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-10-16T01:27:00.470804" 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-10-16T01:27:00.470965" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:27:00.470203" elapsed="0.000810"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:27:00.470115" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:00.471185" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:00.471252" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:27:00.471354" 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-10-16T01:27:00.446820" elapsed="0.024558"/>
</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-10-16T01:27:00.472467" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:00.472277" elapsed="0.000249">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:00.472608" 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-10-16T01:27:00.471961" elapsed="0.000669"/>
</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-10-16T01:27:00.472935" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:00.472720" elapsed="0.000267"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:27:00.473432" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:00.473170" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:00.473010" elapsed="0.000478"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:00.472676" elapsed="0.000831"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:00.474031" 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-10-16T01:27:00.473669" elapsed="0.000387"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:27:00.474100" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:27:00.474221" 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-manganese/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-10-16T01:27:00.471636" elapsed="0.002607"/>
</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-10-16T01:27:00.475344" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:00.475157" elapsed="0.000244">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:00.475484" 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-10-16T01:27:00.474843" elapsed="0.000663"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:27:00.475854" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:27:00.475749" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:00.475553" elapsed="0.000380"/>
</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-10-16T01:27:00.476083" elapsed="0.000020"/>
</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-10-16T01:27:00.476254" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:00.476314" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:27:00.476437" 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-manganese/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-10-16T01:27:00.474519" elapsed="0.001941"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:00.477670" 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-10-16T01:27:00.477448" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:00.478144" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:00.477926" elapsed="0.000257"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:27:00.482102" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:27:00.482155" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:27:00.482252" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:00.478463" elapsed="0.004138">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:00.478242" elapsed="0.004436">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:00.482892" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:00.482743" elapsed="0.000208"/>
</branch>
<status status="FAIL" start="2026-10-16T01:27:00.478226" elapsed="0.004747">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:00.483301" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:00.483421" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:00.483388" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:00.483372" elapsed="0.000108"/>
</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-10-16T01:27:00.483615" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:27:00.483678" elapsed="0.000042"/>
</return>
<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="FAIL" start="2026-10-16T01:27:00.476758" elapsed="0.007052">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:00.483907" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:27:00.439955" elapsed="0.044079">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:27:00.484416" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:00.484199" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:00.484153" elapsed="0.000385"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:00.484620" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:27:00.438216" elapsed="0.046604">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:00.436527" elapsed="0.048392">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:27:00.436508" elapsed="0.048482">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:00.485237" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:27:00.485586" elapsed="0.000063"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:00.485967" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:27:00.486312" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:27:00.486769" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:00.487079" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:00.487429" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:27:00.487668" elapsed="0.000065"/>
</return>
<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="FAIL" start="2026-10-16T01:27:00.433285" elapsed="0.054535">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:27:00.487882" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:27:00.432454" elapsed="0.055516">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:00.488187" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:00.488048" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:00.488393" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:00.488259" elapsed="0.000183"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:00.488604" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:00.488464" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:00.488033" elapsed="0.000639"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:27:00.432303" elapsed="0.056441">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:27:00.432076" elapsed="0.056723">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:00.488847" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:27:00.428453" elapsed="0.060516">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:00.489146" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:00.489364" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:00.489225" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:00.489209" elapsed="0.000224"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:00.489559" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:00.489862" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:00.489924" elapsed="0.000015"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:27:00.427769" elapsed="0.062249">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:27:00.427528" elapsed="0.062553">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:27:00.427410" elapsed="0.062719">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:27:00.427073" elapsed="0.063138">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:00.490417" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:27:00.406988" elapsed="0.083538">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:27:01.511263" elapsed="0.000372"/>
</kw>
<msg time="2026-10-16T01:27:01.511784" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:01.510049" elapsed="0.001842"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:27:01.509126" elapsed="0.002917"/>
</kw>
<msg time="2026-10-16T01:27:01.512131" 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-10-16T01:27:01.502538" elapsed="0.009680"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:27:01.501565" elapsed="0.010795"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:01.513361" 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-10-16T01:27:01.512858" elapsed="0.000592"/>
</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-10-16T01:27:01.519934" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:01.519168" elapsed="0.000823"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:01.521149" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:01.520318" elapsed="0.000887"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:01.521367" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:27:01.521656" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:01.518352" elapsed="0.003407"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:27:01.522087" elapsed="0.000278"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:01.523443" 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-10-16T01:27:01.522776" elapsed="0.000723"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:01.524386" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:01.523874" elapsed="0.000565"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:01.525399" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:01.524893" elapsed="0.000559"/>
</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-10-16T01:27:01.534267" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:27:01.532930" elapsed="0.001445"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:27:01.534502" elapsed="0.000133"/>
</return>
<msg time="2026-10-16T01:27:01.535121" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:27:01.529421" elapsed="0.005825"/>
</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-10-16T01:27:01.563630" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:01.563205" elapsed="0.000462"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:27:01.564624" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:27:01.564363" elapsed="0.000383">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:01.564865" 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-10-16T01:27:01.563921" elapsed="0.000976"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:01.565561" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:01.565131" elapsed="0.000465"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:27:01.566011" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:27:01.566184" 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-10-16T01:27:01.565856" elapsed="0.000361"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:01.566822" 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-10-16T01:27:01.566480" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:01.568122" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:01.567803" elapsed="0.000375"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:27:01.568994" 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-10-16T01:27:01.568415" elapsed="0.000615"/>
</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-10-16T01:27:01.569421" elapsed="0.000027"/>
</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-10-16T01:27:01.569670" elapsed="0.000066"/>
</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-10-16T01:27:01.569959" elapsed="0.000027"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:27:01.569242" elapsed="0.000788"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:27:01.569090" elapsed="0.000977"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:27:01.570123" elapsed="0.000036"/>
</return>
<msg time="2026-10-16T01:27:01.570353" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:27:01.567305" elapsed="0.003081"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:01.566964" elapsed="0.003463"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:01.570660" elapsed="0.000119"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:01.570459" elapsed="0.000367"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:01.566940" elapsed="0.003914"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:27:01.571598" 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-10-16T01:27:01.571071" elapsed="0.000563"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:27:01.571730" elapsed="0.000039"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:27:01.562464" elapsed="0.009411"/>
</kw>
<msg time="2026-10-16T01:27:01.571941" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:01.556804" elapsed="0.015202"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:01.576643" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:01.580473" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:01.584296" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:01.584476" elapsed="0.000020"/>
</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-10-16T01:27:01.584652" elapsed="0.000019"/>
</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-10-16T01:27:01.585019" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:01.584879" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:01.584865" elapsed="0.000227"/>
</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-10-16T01:27:01.585244" elapsed="0.000019"/>
</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-10-16T01:27:01.585419" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:01.585578" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:27:01.584839" elapsed="0.000786"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:27:01.584747" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:01.585826" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:01.585896" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:27:01.585998" 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-10-16T01:27:01.555945" elapsed="0.030077"/>
</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-10-16T01:27:01.587158" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:01.586968" elapsed="0.000249">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:01.587300" 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-10-16T01:27:01.586613" elapsed="0.000709"/>
</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-10-16T01:27:01.587606" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:01.587386" elapsed="0.000271"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:27:01.588131" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:01.587868" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:01.587694" elapsed="0.000494"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:01.587369" elapsed="0.000839"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:01.588814" 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-10-16T01:27:01.588365" elapsed="0.000475"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:27:01.588886" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:27:01.589011" 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-manganese/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-10-16T01:27:01.586316" elapsed="0.002718"/>
</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-10-16T01:27:01.590113" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:01.589925" elapsed="0.000247">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:01.590254" 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-10-16T01:27:01.589574" elapsed="0.000702"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:27:01.590436" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:27:01.590339" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:01.590323" elapsed="0.000189"/>
</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-10-16T01:27:01.590661" elapsed="0.000034"/>
</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-10-16T01:27:01.590865" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:01.590924" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:27:01.591048" 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-manganese/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-10-16T01:27:01.589276" elapsed="0.001795"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:01.592464" 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-10-16T01:27:01.592236" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:01.592947" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:01.592723" elapsed="0.000265"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:27:01.597079" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:27:01.597180" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:27:01.597450" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:01.593272" elapsed="0.004553">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:01.593049" elapsed="0.004853">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:01.598089" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:01.597934" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-10-16T01:27:01.593032" elapsed="0.005140">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:01.598505" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:01.598625" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:01.598592" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:01.598576" 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-10-16T01:27:01.598852" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:27:01.598915" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:27:01.591339" elapsed="0.007677">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:01.599083" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:27:01.543500" elapsed="0.055706">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:27:01.599589" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:01.599368" elapsed="0.000303"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:01.599322" elapsed="0.000439"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:01.599844" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:27:01.539913" elapsed="0.060093">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:01.535913" elapsed="0.064192">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:27:01.535655" elapsed="0.064521">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:01.600419" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:27:01.600783" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:01.601092" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:27:01.601435" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:27:01.601893" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:01.602199" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:01.602539" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:27:01.602873" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:27:01.528094" elapsed="0.074883">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:27:01.603038" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:27:01.526294" elapsed="0.076832">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:01.603348" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:01.603206" elapsed="0.000192"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:01.603557" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:01.603420" elapsed="0.000186"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:01.603802" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:01.603627" elapsed="0.000224"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:01.603190" elapsed="0.000682"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:27:01.525969" elapsed="0.077942">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:27:01.525547" elapsed="0.078416">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:01.604011" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:27:01.516982" elapsed="0.087118">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:01.604272" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:01.604489" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:01.604350" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:01.604334" elapsed="0.000223"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:01.604693" elapsed="0.000135"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:01.604982" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:01.605040" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:27:01.515364" elapsed="0.089768">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:27:01.514933" elapsed="0.090260">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:27:01.514652" elapsed="0.090590">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:27:01.513932" elapsed="0.091389">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:01.605527" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:27:01.491124" elapsed="0.114506">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:27:02.624976" elapsed="0.000402"/>
</kw>
<msg time="2026-10-16T01:27:02.625492" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:02.623649" elapsed="0.001963"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:27:02.622770" elapsed="0.003050"/>
</kw>
<msg time="2026-10-16T01:27:02.625913" 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-10-16T01:27:02.616215" elapsed="0.009789"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:27:02.615320" elapsed="0.010830"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:02.627190" 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-10-16T01:27:02.626630" elapsed="0.000652"/>
</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-10-16T01:27:02.634046" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:02.633231" elapsed="0.000873"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:02.635150" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:02.634440" elapsed="0.000766"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:02.635301" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:27:02.635587" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:02.632400" elapsed="0.003237"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:27:02.636017" elapsed="0.000286"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:02.637382" 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-10-16T01:27:02.636663" elapsed="0.000773"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:02.638311" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:02.637808" elapsed="0.000555"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:02.639430" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:02.638731" elapsed="0.000753"/>
</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-10-16T01:27:02.648195" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:27:02.646738" elapsed="0.001565"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:27:02.648432" elapsed="0.000156"/>
</return>
<msg time="2026-10-16T01:27:02.649082" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:27:02.643456" elapsed="0.005752"/>
</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-10-16T01:27:02.674136" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:02.673713" elapsed="0.000459"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:27:02.675141" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:27:02.674851" elapsed="0.000389">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:02.675357" 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-10-16T01:27:02.674384" elapsed="0.001005"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:02.676168" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:02.675729" elapsed="0.000475"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:27:02.676592" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:27:02.676862" 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-10-16T01:27:02.676432" elapsed="0.000465"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:02.677479" 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-10-16T01:27:02.677164" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:02.679090" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:02.678518" elapsed="0.000644"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:27:02.679850" 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-10-16T01:27:02.679449" elapsed="0.000435"/>
</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-10-16T01:27:02.680277" elapsed="0.000028"/>
</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-10-16T01:27:02.680557" elapsed="0.000038"/>
</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-10-16T01:27:02.680875" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:27:02.680098" elapsed="0.000831"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:27:02.679945" elapsed="0.001015"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:27:02.681001" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:27:02.681129" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:27:02.678047" elapsed="0.003105"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:02.677636" elapsed="0.003545"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:02.681350" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:02.681207" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:02.677610" elapsed="0.003810"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:27:02.682006" 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-10-16T01:27:02.681580" elapsed="0.000452"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:27:02.682077" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:27:02.672989" elapsed="0.009187"/>
</kw>
<msg time="2026-10-16T01:27:02.682224" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:02.667304" elapsed="0.014966"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:02.686114" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:02.689947" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:02.693742" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:02.693954" 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-10-16T01:27:02.694134" 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-10-16T01:27:02.694476" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:02.694335" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:02.694320" 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-10-16T01:27:02.694741" 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-10-16T01:27:02.694921" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:02.695083" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:27:02.694294" elapsed="0.000837"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:27:02.694204" elapsed="0.000951"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:02.695304" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:02.695371" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:27:02.695474" 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-10-16T01:27:02.666430" elapsed="0.029067"/>
</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-10-16T01:27:02.696598" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:02.696409" elapsed="0.000248">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:02.696773" 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-10-16T01:27:02.696090" elapsed="0.000706"/>
</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-10-16T01:27:02.697073" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:02.696859" elapsed="0.000265"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:27:02.697598" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:02.697304" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:02.697147" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:02.696842" elapsed="0.000832"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:02.698195" 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-10-16T01:27:02.697861" elapsed="0.000358"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:27:02.698263" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:27:02.698384" 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-manganese/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-10-16T01:27:02.695791" elapsed="0.002615"/>
</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-10-16T01:27:02.699475" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:02.699286" elapsed="0.000247">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:02.699614" 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-10-16T01:27:02.698972" elapsed="0.000665"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:27:02.699912" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:27:02.699811" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:02.699793" elapsed="0.000198"/>
</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-10-16T01:27:02.700141" elapsed="0.000020"/>
</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-10-16T01:27:02.700312" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:02.700373" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:27:02.700496" 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-manganese/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-10-16T01:27:02.698647" elapsed="0.001875"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:02.701966" 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-10-16T01:27:02.701738" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:02.702413" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:02.702196" elapsed="0.000256"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:27:02.706378" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:27:02.706432" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:27:02.706532" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:02.702760" elapsed="0.004167">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:02.702512" elapsed="0.004494">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:02.707187" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:02.707037" elapsed="0.000210"/>
</branch>
<status status="FAIL" start="2026-10-16T01:27:02.702496" elapsed="0.004773">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:02.707599" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:02.707748" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:02.707712" elapsed="0.000075"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:02.707669" elapsed="0.000139"/>
</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-10-16T01:27:02.707943" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:27:02.708006" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:27:02.701011" elapsed="0.007098">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:02.708176" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:27:02.656775" elapsed="0.051527">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:27:02.708720" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:02.708468" elapsed="0.000369"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:02.708420" elapsed="0.000457"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:02.708960" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:27:02.653837" elapsed="0.055287">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:02.649847" elapsed="0.059376">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:27:02.649802" elapsed="0.059492">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:02.709540" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:27:02.709912" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:02.710220" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:27:02.710564" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:27:02.711020" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:02.711330" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:02.711675" elapsed="0.000060"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:27:02.711948" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:27:02.642150" elapsed="0.069899">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:27:02.712111" elapsed="0.000014"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:27:02.640333" elapsed="0.071865">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:02.712421" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:02.712277" elapsed="0.000194"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:02.712628" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:02.712493" elapsed="0.000234"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:02.712898" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:02.712753" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:02.712261" elapsed="0.000705"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:27:02.640003" elapsed="0.073001">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:27:02.639580" elapsed="0.073476">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:02.713103" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:27:02.631054" elapsed="0.082139">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:02.713365" elapsed="0.000050"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:02.713621" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:02.713478" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:02.713462" elapsed="0.000318"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:02.713912" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:02.714081" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:02.714140" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:27:02.629443" elapsed="0.084790">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:27:02.628993" elapsed="0.085301">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:27:02.628739" elapsed="0.085603">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:27:02.627772" elapsed="0.086652">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:02.714632" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:27:02.606596" elapsed="0.108219">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:27:03.733624" elapsed="0.000446"/>
</kw>
<msg time="2026-10-16T01:27:03.734183" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:03.732389" elapsed="0.001907"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:27:03.731458" elapsed="0.002993"/>
</kw>
<msg time="2026-10-16T01:27:03.734540" 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-10-16T01:27:03.724982" elapsed="0.009645"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:27:03.724109" elapsed="0.010718"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:03.735889" 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-10-16T01:27:03.735298" elapsed="0.000682"/>
</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-10-16T01:27:03.742640" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:03.741909" elapsed="0.000835"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:03.743893" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:03.743231" elapsed="0.000716"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:03.744040" elapsed="0.000060"/>
</return>
<msg time="2026-10-16T01:27:03.744322" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:03.741057" elapsed="0.003319"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:27:03.744754" elapsed="0.000286"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:03.746249" 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-10-16T01:27:03.745402" elapsed="0.000902"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:03.747189" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:03.746632" elapsed="0.000611"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:03.748437" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:03.747550" elapsed="0.000942"/>
</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-10-16T01:27:03.757222" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:27:03.755654" elapsed="0.001679"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:27:03.757459" elapsed="0.000133"/>
</return>
<msg time="2026-10-16T01:27:03.758072" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:27:03.752426" elapsed="0.005772"/>
</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-10-16T01:27:03.784384" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:03.783961" elapsed="0.000460"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:27:03.785401" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:27:03.785112" elapsed="0.000389">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:03.785619" 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-10-16T01:27:03.784635" elapsed="0.001015"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:03.786350" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:03.785919" elapsed="0.000466"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:27:03.786872" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:27:03.787064" 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-10-16T01:27:03.786610" elapsed="0.000487"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:03.787669" 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-10-16T01:27:03.787365" elapsed="0.000395"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:03.789187" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:03.788863" elapsed="0.000381"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:27:03.789876" 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-10-16T01:27:03.789488" elapsed="0.000422"/>
</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-10-16T01:27:03.790298" elapsed="0.000028"/>
</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-10-16T01:27:03.790551" 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-10-16T01:27:03.790837" elapsed="0.000028"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:27:03.790120" elapsed="0.000791"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:27:03.789969" elapsed="0.000981"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:27:03.791007" elapsed="0.000036"/>
</return>
<msg time="2026-10-16T01:27:03.791186" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:27:03.788357" elapsed="0.002862"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:03.787846" elapsed="0.003412"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:03.791494" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:03.791294" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:03.787822" elapsed="0.003769"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:27:03.792381" 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-10-16T01:27:03.791844" elapsed="0.000620"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:27:03.792529" elapsed="0.000038"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:27:03.783224" elapsed="0.009446"/>
</kw>
<msg time="2026-10-16T01:27:03.792772" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:03.777540" elapsed="0.015298"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:03.797269" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:03.801066" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:03.804868" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:03.805043" elapsed="0.000019"/>
</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-10-16T01:27:03.805219" elapsed="0.000019"/>
</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-10-16T01:27:03.805555" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:03.805414" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:03.805400" elapsed="0.000227"/>
</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-10-16T01:27:03.805807" elapsed="0.000019"/>
</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-10-16T01:27:03.805983" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:03.806141" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:27:03.805375" elapsed="0.000814"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:27:03.805287" elapsed="0.000925"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:03.806361" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:03.806427" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:27:03.806530" 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-10-16T01:27:03.776728" elapsed="0.029825"/>
</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-10-16T01:27:03.807719" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:03.807499" elapsed="0.000282">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:03.807864" 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-10-16T01:27:03.807179" elapsed="0.000707"/>
</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-10-16T01:27:03.808167" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:03.807950" elapsed="0.000268"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:27:03.808661" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:03.808399" elapsed="0.000312"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:03.808241" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:03.807933" elapsed="0.000832"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:03.809261" 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-10-16T01:27:03.808922" elapsed="0.000363"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:27:03.809330" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:27:03.809453" 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-manganese/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-10-16T01:27:03.806848" elapsed="0.002629"/>
</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-10-16T01:27:03.810558" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:03.810371" elapsed="0.000246">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:03.810727" 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-10-16T01:27:03.810056" elapsed="0.000695"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:27:03.811072" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:27:03.810969" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:03.810798" elapsed="0.000351"/>
</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-10-16T01:27:03.811298" elapsed="0.000020"/>
</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-10-16T01:27:03.811467" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:03.811527" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:27:03.811651" 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-manganese/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-10-16T01:27:03.809756" elapsed="0.001929"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:03.812914" 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-10-16T01:27:03.812663" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:03.813356" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:03.813139" elapsed="0.000258"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:27:03.817246" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:27:03.817300" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:27:03.817395" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:03.813693" elapsed="0.004097">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:03.813455" elapsed="0.004443">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:03.818082" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:03.817931" elapsed="0.000209"/>
</branch>
<status status="FAIL" start="2026-10-16T01:27:03.813439" elapsed="0.004724">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:03.818499" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:03.818620" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:03.818586" elapsed="0.000073"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:03.818570" 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-10-16T01:27:03.818848" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:27:03.818912" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:27:03.811974" elapsed="0.007041">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:03.819084" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:27:03.766175" elapsed="0.053035">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:27:03.819595" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:03.819377" elapsed="0.000312"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:03.819330" elapsed="0.000424"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:03.819840" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:27:03.762751" elapsed="0.057253">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:03.758654" elapsed="0.061449">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:27:03.758610" elapsed="0.061565">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:03.820426" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:27:03.820801" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:03.821112" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:27:03.821457" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:27:03.821915" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:03.822225" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:03.822568" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:27:03.822850" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:27:03.751144" elapsed="0.071808">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:27:03.823053" elapsed="0.000017"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:27:03.749340" elapsed="0.073806">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:03.823367" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:03.823225" elapsed="0.000192"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:03.823576" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:03.823439" elapsed="0.000186"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:03.823828" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:03.823646" elapsed="0.000231"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:03.823210" elapsed="0.000688"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:27:03.749013" elapsed="0.074923">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:27:03.748588" elapsed="0.075401">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:03.824037" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:27:03.739695" elapsed="0.084432">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:03.824302" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:03.824521" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:03.824380" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:03.824365" elapsed="0.000224"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:03.824749" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:03.824918" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:03.824976" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:27:03.738130" elapsed="0.086936">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:27:03.737604" elapsed="0.087524">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:27:03.737366" elapsed="0.087810">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:27:03.736583" elapsed="0.088674">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:03.825464" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:27:03.715497" elapsed="0.110073">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:27:04.847298" elapsed="0.000468"/>
</kw>
<msg time="2026-10-16T01:27:04.847886" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:04.846043" elapsed="0.002074"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:27:04.845100" elapsed="0.003180"/>
</kw>
<msg time="2026-10-16T01:27:04.848371" 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-10-16T01:27:04.838394" elapsed="0.010067"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:27:04.837516" elapsed="0.011094"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:04.849657" 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-10-16T01:27:04.849145" elapsed="0.000661"/>
</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-10-16T01:27:04.856508" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:04.855771" elapsed="0.000797"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:04.857636" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:04.857024" elapsed="0.000712"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:04.857844" elapsed="0.000063"/>
</return>
<msg time="2026-10-16T01:27:04.858137" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:04.854948" elapsed="0.003240"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:27:04.858829" elapsed="0.000297"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:04.860224" 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-10-16T01:27:04.859495" elapsed="0.000785"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:04.861183" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:04.860607" elapsed="0.000630"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:04.862116" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:04.861547" elapsed="0.000622"/>
</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-10-16T01:27:04.871025" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:27:04.869596" elapsed="0.001539"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:27:04.871262" elapsed="0.000134"/>
</return>
<msg time="2026-10-16T01:27:04.872084" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:27:04.866321" elapsed="0.005892"/>
</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-10-16T01:27:04.896470" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:04.896046" elapsed="0.000461"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:27:04.897493" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:27:04.897202" elapsed="0.000390">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:04.897747" 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-10-16T01:27:04.896757" elapsed="0.001024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:04.898454" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:04.898021" elapsed="0.000467"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:27:04.898913" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:27:04.899151" 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-10-16T01:27:04.898751" elapsed="0.000433"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:04.899797" 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-10-16T01:27:04.899450" elapsed="0.000405"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:04.901104" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:04.900782" elapsed="0.000378"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:27:04.901994" 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-10-16T01:27:04.901400" elapsed="0.000629"/>
</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-10-16T01:27:04.902426" elapsed="0.000029"/>
</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-10-16T01:27:04.902765" elapsed="0.000040"/>
</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-10-16T01:27:04.903011" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:27:04.902246" elapsed="0.000816"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:27:04.902091" elapsed="0.001000"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:27:04.903133" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:27:04.903263" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:27:04.900284" elapsed="0.003002"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:04.899940" elapsed="0.003374"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:04.903482" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:04.903339" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:04.899916" elapsed="0.003636"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:27:04.904135" 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-10-16T01:27:04.903735" elapsed="0.000426"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:27:04.904205" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:27:04.895306" elapsed="0.008999"/>
</kw>
<msg time="2026-10-16T01:27:04.904353" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:04.889615" elapsed="0.014785"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:04.908232" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:04.912028" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:04.915832" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:04.916044" 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-10-16T01:27:04.916224" elapsed="0.000019"/>
</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-10-16T01:27:04.916564" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:04.916420" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:04.916406" 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-10-16T01:27:04.916821" 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-10-16T01:27:04.916999" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:04.917159" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:27:04.916380" elapsed="0.000827"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:27:04.916291" elapsed="0.000940"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:04.917380" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:04.917447" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:27:04.917558" 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-10-16T01:27:04.888795" elapsed="0.028787"/>
</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-10-16T01:27:04.918709" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:04.918491" elapsed="0.000279">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:04.918852" 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-10-16T01:27:04.918170" elapsed="0.000705"/>
</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-10-16T01:27:04.919151" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:04.918938" elapsed="0.000265"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:27:04.919647" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:04.919382" elapsed="0.000301"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:04.919226" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:04.918921" elapsed="0.000830"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:04.920249" 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-10-16T01:27:04.919910" elapsed="0.000364"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:27:04.920319" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:27:04.920442" 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-manganese/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-10-16T01:27:04.917873" elapsed="0.002592"/>
</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-10-16T01:27:04.921542" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:04.921353" elapsed="0.000247">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:04.921709" 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-10-16T01:27:04.921039" elapsed="0.000695"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:27:04.921899" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:27:04.921800" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:04.921783" elapsed="0.000192"/>
</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-10-16T01:27:04.922123" elapsed="0.000019"/>
</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-10-16T01:27:04.922342" elapsed="0.000024"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:04.922414" elapsed="0.000016"/>
</return>
<msg time="2026-10-16T01:27:04.922544" 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-manganese/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-10-16T01:27:04.920741" elapsed="0.001830"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:04.923997" 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-10-16T01:27:04.923768" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:04.924446" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:04.924225" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:27:04.928377" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:27:04.928430" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:27:04.928537" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:04.924799" elapsed="0.004139">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:04.924547" elapsed="0.004469">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:04.929197" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:04.929047" elapsed="0.000209"/>
</branch>
<status status="FAIL" start="2026-10-16T01:27:04.924530" elapsed="0.004747">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:04.929618" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:04.929767" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:04.929734" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:04.929716" elapsed="0.000110"/>
</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-10-16T01:27:04.929962" elapsed="0.000019"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:27:04.930024" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:27:04.922880" elapsed="0.007247">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:04.930196" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:27:04.879165" elapsed="0.051155">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:27:04.930733" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:04.930484" elapsed="0.000333"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:04.930437" elapsed="0.000420"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:04.930939" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:27:04.876482" elapsed="0.054653">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:04.872661" elapsed="0.058576">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:27:04.872618" elapsed="0.058692">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:04.931560" elapsed="0.000026"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:27:04.931937" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:04.932244" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:27:04.932592" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:27:04.933053" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:04.933377" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:04.933779" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:27:04.934019" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:27:04.865005" elapsed="0.069116">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:27:04.934183" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:27:04.863048" elapsed="0.071224">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:04.934491" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:04.934351" elapsed="0.000190"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:04.934733" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:04.934562" elapsed="0.000222"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:04.934949" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:04.934806" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:04.934335" elapsed="0.000686"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:27:04.862644" elapsed="0.072418">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:27:04.862263" elapsed="0.072853">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:04.935165" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:27:04.853533" elapsed="0.081722">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:04.935429" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:04.935652" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:04.935506" elapsed="0.000293"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:04.935491" elapsed="0.000331"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:04.935991" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:04.936162" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:04.936220" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:27:04.851850" elapsed="0.084464">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:27:04.851318" elapsed="0.085059">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:27:04.851074" elapsed="0.085352">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:27:04.850249" elapsed="0.086259">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:04.936799" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:27:04.826291" elapsed="0.110615">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:27:05.955480" elapsed="0.000441"/>
</kw>
<msg time="2026-10-16T01:27:05.956026" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:05.954247" elapsed="0.001885"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:27:05.953311" elapsed="0.002974"/>
</kw>
<msg time="2026-10-16T01:27:05.956375" 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-10-16T01:27:05.946607" elapsed="0.009857"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:27:05.945788" elapsed="0.010821"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:05.957772" 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-10-16T01:27:05.957206" elapsed="0.000663"/>
</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-10-16T01:27:05.964751" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:05.963966" elapsed="0.000847"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:05.965799" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:05.965145" elapsed="0.000711"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:05.965948" elapsed="0.000060"/>
</return>
<msg time="2026-10-16T01:27:05.966383" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:05.963134" elapsed="0.003304"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:27:05.966821" elapsed="0.000292"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:05.968209" 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-10-16T01:27:05.967479" elapsed="0.000785"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:05.969153" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:05.968588" elapsed="0.000618"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:05.970187" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:05.969512" elapsed="0.000728"/>
</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-10-16T01:27:05.979015" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:27:05.977583" elapsed="0.001540"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:27:05.979251" elapsed="0.000132"/>
</return>
<msg time="2026-10-16T01:27:05.979872" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:27:05.974238" elapsed="0.005759"/>
</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-10-16T01:27:06.005601" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:06.005177" elapsed="0.000460"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:27:06.006847" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:27:06.006534" elapsed="0.000404">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:06.007055" 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-10-16T01:27:06.006080" elapsed="0.001006"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:06.007787" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:06.007319" elapsed="0.000504"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:27:06.008202" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:27:06.008379" 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-10-16T01:27:06.008047" elapsed="0.000366"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:06.009023" 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-10-16T01:27:06.008712" elapsed="0.000368"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:06.010508" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:06.010012" elapsed="0.000553"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:27:06.011194" 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-10-16T01:27:06.010840" elapsed="0.000387"/>
</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-10-16T01:27:06.011622" elapsed="0.000028"/>
</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-10-16T01:27:06.011911" elapsed="0.000032"/>
</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-10-16T01:27:06.012163" elapsed="0.000027"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:27:06.011443" elapsed="0.000791"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:27:06.011293" elapsed="0.000980"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:27:06.012329" elapsed="0.000036"/>
</return>
<msg time="2026-10-16T01:27:06.012507" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:27:06.009507" elapsed="0.003031"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:06.009165" elapsed="0.003412"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:06.012846" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:06.012609" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:06.009141" elapsed="0.003806"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:27:06.013724" 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-10-16T01:27:06.013158" elapsed="0.000604"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:27:06.013823" elapsed="0.000037"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:27:06.004426" elapsed="0.009535"/>
</kw>
<msg time="2026-10-16T01:27:06.014077" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:05.998819" elapsed="0.015324"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:06.018234" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:06.022046" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:06.025881" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:06.026056" elapsed="0.000019"/>
</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-10-16T01:27:06.026231" elapsed="0.000019"/>
</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-10-16T01:27:06.026562" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:06.026423" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:06.026410" elapsed="0.000224"/>
</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-10-16T01:27:06.026811" 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-10-16T01:27:06.026986" elapsed="0.000018"/>
</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-10-16T01:27:06.027143" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:27:06.026384" elapsed="0.000806"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:27:06.026296" elapsed="0.000917"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:06.027358" elapsed="0.000018"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:06.027424" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:27:06.027527" 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-10-16T01:27:05.997941" elapsed="0.029610"/>
</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-10-16T01:27:06.028649" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:06.028458" elapsed="0.000281">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:06.028857" 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-10-16T01:27:06.028138" 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-10-16T01:27:06.029161" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:06.028945" elapsed="0.000268"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:27:06.029660" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:06.029393" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:06.029236" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:06.028928" elapsed="0.000838"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:06.030259" 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-10-16T01:27:06.029923" elapsed="0.000360"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:27:06.030328" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:27:06.030451" 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-manganese/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-10-16T01:27:06.027841" elapsed="0.002633"/>
</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-10-16T01:27:06.031544" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:06.031356" elapsed="0.000246">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:06.031713" 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-10-16T01:27:06.031040" elapsed="0.000698"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:27:06.031903" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:27:06.031803" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:06.031786" elapsed="0.000194"/>
</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-10-16T01:27:06.032130" elapsed="0.000019"/>
</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-10-16T01:27:06.032301" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:06.032359" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:27:06.032482" 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-manganese/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-10-16T01:27:06.030742" elapsed="0.001764"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:06.033922" 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-10-16T01:27:06.033684" elapsed="0.000279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:06.034364" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:06.034148" elapsed="0.000255"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:27:06.038290" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:27:06.038341" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:27:06.038446" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:06.034709" elapsed="0.004111">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:06.034463" elapsed="0.004434">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:06.039076" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:06.038928" elapsed="0.000235"/>
</branch>
<status status="FAIL" start="2026-10-16T01:27:06.034446" elapsed="0.004741">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:06.039522" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:06.039641" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:06.039608" elapsed="0.000087"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:06.039592" elapsed="0.000140"/>
</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-10-16T01:27:06.039868" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:27:06.039931" elapsed="0.000013"/>
</return>
<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="FAIL" start="2026-10-16T01:27:06.032974" elapsed="0.007057">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:06.040098" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:27:05.988009" elapsed="0.052214">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:27:06.040605" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:06.040387" elapsed="0.000337"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:06.040340" elapsed="0.000429"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:06.040851" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:27:05.984468" elapsed="0.056546">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:05.980453" elapsed="0.060658">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:27:05.980412" elapsed="0.060770">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:06.041426" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:27:06.041812" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:06.042124" elapsed="0.000019"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:27:06.042465" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:27:06.042921" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:06.043229" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:06.043571" elapsed="0.000019"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:27:06.043855" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:27:05.972928" elapsed="0.071030">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:27:06.044020" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:27:05.971098" elapsed="0.073012">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:06.044363" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:06.044223" elapsed="0.000190"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:06.044571" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:06.044435" elapsed="0.000184"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:06.044821" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:06.044640" elapsed="0.000230"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:06.044206" elapsed="0.000686"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:27:05.970764" elapsed="0.074166">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:27:05.970335" elapsed="0.074648">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:06.045031" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:27:05.961749" elapsed="0.083374">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:06.045297" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:06.045515" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:06.045376" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:06.045360" elapsed="0.000224"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:06.045746" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:06.045917" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:06.045975" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:27:05.959945" elapsed="0.086124">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:27:05.959323" elapsed="0.086808">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:27:05.959090" elapsed="0.087090">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:27:05.958308" elapsed="0.087953">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:06.046471" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:27:05.937490" elapsed="0.109085">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:27:07.065248" elapsed="0.000390"/>
</kw>
<msg time="2026-10-16T01:27:07.065799" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:07.063876" elapsed="0.002034"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:27:07.062935" elapsed="0.003130"/>
</kw>
<msg time="2026-10-16T01:27:07.066260" 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-10-16T01:27:07.056324" elapsed="0.010033"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:27:07.055460" elapsed="0.011048"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:07.067543" 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-10-16T01:27:07.067026" elapsed="0.000609"/>
</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-10-16T01:27:07.074439" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:07.073656" elapsed="0.000841"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:07.075479" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:07.074879" elapsed="0.000653"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:07.075626" elapsed="0.000109"/>
</return>
<msg time="2026-10-16T01:27:07.075967" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:07.072875" elapsed="0.003143"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:27:07.076346" elapsed="0.000283"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:07.077767" 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-10-16T01:27:07.077045" elapsed="0.000781"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:07.078650" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:07.078152" elapsed="0.000605"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:07.079562" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:07.079067" elapsed="0.000547"/>
</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-10-16T01:27:07.088343" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:27:07.087021" elapsed="0.001429"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:27:07.088577" elapsed="0.000195"/>
</return>
<msg time="2026-10-16T01:27:07.089204" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:27:07.083865" elapsed="0.005465"/>
</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-10-16T01:27:07.114362" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:07.113942" elapsed="0.000456"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:27:07.115372" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:27:07.115096" elapsed="0.000368">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:07.115580" 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-10-16T01:27:07.114620" elapsed="0.000991"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:07.116314" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:07.115882" elapsed="0.000467"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:27:07.116772" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:27:07.116957" 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-10-16T01:27:07.116574" elapsed="0.000416"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:07.117626" 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-10-16T01:27:07.117264" elapsed="0.000477"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:07.119191" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:07.118866" elapsed="0.000382"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:27:07.119885" 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-10-16T01:27:07.119490" elapsed="0.000430"/>
</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-10-16T01:27:07.120311" elapsed="0.000028"/>
</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-10-16T01:27:07.120563" 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-10-16T01:27:07.120906" elapsed="0.000035"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:27:07.120132" elapsed="0.000862"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:27:07.119981" elapsed="0.001048"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:27:07.121071" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:27:07.121202" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:27:07.118363" elapsed="0.002862"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:07.117839" elapsed="0.003414"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:07.121420" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:07.121277" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:07.117807" elapsed="0.003683"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:27:07.122059" 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-10-16T01:27:07.121644" elapsed="0.000441"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:27:07.122129" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:27:07.113214" elapsed="0.009013"/>
</kw>
<msg time="2026-10-16T01:27:07.122273" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:07.107578" elapsed="0.014741"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:07.126108" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:07.129902" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:07.133675" elapsed="0.000037"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:07.133865" elapsed="0.000019"/>
</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-10-16T01:27:07.134040" elapsed="0.000019"/>
</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-10-16T01:27:07.134410" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:07.134235" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:07.134222" elapsed="0.000263"/>
</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-10-16T01:27:07.134639" elapsed="0.000019"/>
</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-10-16T01:27:07.134851" 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-10-16T01:27:07.135014" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:27:07.134196" elapsed="0.000866"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:27:07.134107" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:07.135235" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:07.135304" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:27:07.135407" 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-10-16T01:27:07.106762" elapsed="0.028669"/>
</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-10-16T01:27:07.136542" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:07.136350" elapsed="0.000252">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:07.136715" 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-10-16T01:27:07.136021" elapsed="0.000719"/>
</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-10-16T01:27:07.137019" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:07.136804" elapsed="0.000266"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:27:07.137510" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:07.137250" elapsed="0.000284"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:07.137093" elapsed="0.000473"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:07.136787" elapsed="0.000798"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:07.138103" 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-10-16T01:27:07.137768" elapsed="0.000359"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:27:07.138172" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:27:07.138294" 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-manganese/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-10-16T01:27:07.135721" elapsed="0.002595"/>
</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-10-16T01:27:07.139390" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:07.139202" elapsed="0.000246">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:07.139530" 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-10-16T01:27:07.138887" elapsed="0.000666"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:27:07.139906" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:27:07.139800" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:07.139599" elapsed="0.000384"/>
</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-10-16T01:27:07.140132" elapsed="0.000020"/>
</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-10-16T01:27:07.140303" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:07.140361" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:27:07.140485" 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-manganese/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-10-16T01:27:07.138559" elapsed="0.001981"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:07.141787" 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-10-16T01:27:07.141536" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:07.142230" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:07.142013" elapsed="0.000257"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:27:07.146541" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:27:07.146593" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:27:07.146773" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:07.142548" elapsed="0.004580">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:07.142329" elapsed="0.004878">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:07.147385" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:07.147237" elapsed="0.000206"/>
</branch>
<status status="FAIL" start="2026-10-16T01:27:07.142313" elapsed="0.005151">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:07.147826" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:07.147946" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:07.147913" elapsed="0.000070"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:07.147897" elapsed="0.000106"/>
</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-10-16T01:27:07.148140" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:27:07.148203" elapsed="0.000013"/>
</return>
<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="FAIL" start="2026-10-16T01:27:07.140844" elapsed="0.007459">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:07.148370" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:27:07.097137" elapsed="0.051356">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:27:07.148919" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:07.148661" elapsed="0.000343"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:07.148609" elapsed="0.000436"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:07.149128" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:27:07.093920" elapsed="0.055371">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:07.089874" elapsed="0.059557">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:27:07.089832" elapsed="0.059672">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:07.149784" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:27:07.150128" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:07.150436" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:27:07.150816" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:27:07.151237" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:07.151544" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:07.151936" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:27:07.152170" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:27:07.082502" elapsed="0.069769">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:27:07.152332" elapsed="0.000014"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:27:07.080593" elapsed="0.071826">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:07.152637" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:07.152498" elapsed="0.000224"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:07.152884" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:07.152747" elapsed="0.000185"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:07.153095" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:07.152954" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:07.152482" elapsed="0.000681"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:27:07.080268" elapsed="0.072932">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:27:07.079871" elapsed="0.073382">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:07.153300" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:27:07.071476" elapsed="0.081914">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:07.153562" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:07.153918" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:07.153639" elapsed="0.000328"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:07.153624" elapsed="0.000366"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:07.154114" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:07.154278" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:07.154335" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:27:07.069919" elapsed="0.084550">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:27:07.069197" elapsed="0.085335">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:27:07.068961" elapsed="0.085619">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:27:07.068133" elapsed="0.086527">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:07.154901" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:27:07.047172" elapsed="0.107834">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:27:08.176022" elapsed="0.000389"/>
</kw>
<msg time="2026-10-16T01:27:08.176514" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:08.174786" elapsed="0.001836"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:27:08.173847" elapsed="0.002979"/>
</kw>
<msg time="2026-10-16T01:27:08.176917" 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-10-16T01:27:08.167156" elapsed="0.009851"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:27:08.166291" elapsed="0.010863"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:08.178298" 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-10-16T01:27:08.177610" elapsed="0.000781"/>
</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-10-16T01:27:08.185572" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:08.184840" elapsed="0.000790"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:08.186619" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:08.186021" elapsed="0.000677"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:08.186822" elapsed="0.000060"/>
</return>
<msg time="2026-10-16T01:27:08.187108" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:08.184012" elapsed="0.003147"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:27:08.187485" elapsed="0.000332"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:08.188918" 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-10-16T01:27:08.188184" elapsed="0.000790"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:08.189857" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:08.189298" elapsed="0.000613"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:08.190839" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:08.190285" elapsed="0.000607"/>
</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-10-16T01:27:08.199490" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:27:08.198108" elapsed="0.001731"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:27:08.200019" elapsed="0.000139"/>
</return>
<msg time="2026-10-16T01:27:08.200588" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:27:08.194869" elapsed="0.006045"/>
</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-10-16T01:27:08.225025" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:08.224554" elapsed="0.000507"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:27:08.226026" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:27:08.225750" elapsed="0.000367">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:08.226234" 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-10-16T01:27:08.225275" elapsed="0.000990"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:08.226964" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:08.226496" elapsed="0.000503"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:27:08.227376" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:27:08.227555" 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-10-16T01:27:08.227222" elapsed="0.000365"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:08.228227" 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-10-16T01:27:08.227918" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:08.229540" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:08.229218" elapsed="0.000379"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:27:08.230415" 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-10-16T01:27:08.229872" elapsed="0.000578"/>
</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-10-16T01:27:08.230883" elapsed="0.000028"/>
</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-10-16T01:27:08.231137" 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-10-16T01:27:08.231385" elapsed="0.000026"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:27:08.230682" elapsed="0.000774"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:27:08.230512" elapsed="0.000981"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:27:08.231548" elapsed="0.000036"/>
</return>
<msg time="2026-10-16T01:27:08.231791" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:27:08.228750" elapsed="0.003082"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:08.228368" elapsed="0.003515"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:08.232119" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:08.231923" elapsed="0.000246"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:08.228344" elapsed="0.003844"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:27:08.232753" 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-10-16T01:27:08.232339" elapsed="0.000440"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:27:08.232823" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:27:08.223861" elapsed="0.009062"/>
</kw>
<msg time="2026-10-16T01:27:08.233001" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:08.218183" elapsed="0.014867"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:08.236866" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:08.240732" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:08.244529" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:08.244739" 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-10-16T01:27:08.244919" elapsed="0.000019"/>
</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-10-16T01:27:08.245253" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:08.245114" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:08.245100" elapsed="0.000225"/>
</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-10-16T01:27:08.245473" elapsed="0.000019"/>
</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-10-16T01:27:08.245647" elapsed="0.000032"/>
</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-10-16T01:27:08.245836" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:27:08.245074" elapsed="0.000811"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:27:08.244985" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:08.246054" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:08.246120" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:27:08.246224" 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-10-16T01:27:08.217325" elapsed="0.028922"/>
</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-10-16T01:27:08.247337" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:08.247147" elapsed="0.000249">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:08.247478" 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-10-16T01:27:08.246827" elapsed="0.000674"/>
</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-10-16T01:27:08.247810" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:08.247564" elapsed="0.000330"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:27:08.248344" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:08.248080" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:08.247919" elapsed="0.000482"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:08.247548" elapsed="0.000873"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:08.248947" 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-10-16T01:27:08.248578" elapsed="0.000393"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:27:08.249017" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:27:08.249139" 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-manganese/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-10-16T01:27:08.246505" elapsed="0.002657"/>
</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-10-16T01:27:08.250234" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:08.250045" elapsed="0.000248">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:08.250375" 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-10-16T01:27:08.249726" elapsed="0.000672"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:27:08.250559" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:27:08.250461" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:08.250444" elapsed="0.000191"/>
</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-10-16T01:27:08.250811" 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-10-16T01:27:08.250982" elapsed="0.000024"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:08.251050" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:27:08.251174" 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-manganese/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-10-16T01:27:08.249402" elapsed="0.001795"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:08.252583" 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-10-16T01:27:08.252354" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:08.253060" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:08.252840" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:27:08.256867" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:27:08.256917" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:27:08.257021" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:08.253381" elapsed="0.003979">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:08.253161" elapsed="0.004275">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:08.257619" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:08.257468" elapsed="0.000225"/>
</branch>
<status status="FAIL" start="2026-10-16T01:27:08.253144" elapsed="0.004587">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:08.258073" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:08.258228" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:08.258194" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:08.258176" elapsed="0.000111"/>
</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-10-16T01:27:08.258424" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:27:08.258487" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:27:08.251466" elapsed="0.007122">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:08.258657" elapsed="0.000030"/>
</return>
<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="FAIL" start="2026-10-16T01:27:08.207644" elapsed="0.051174">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:27:08.259201" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:08.258983" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:08.258936" elapsed="0.000387"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:08.259405" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:27:08.205284" elapsed="0.054284">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:08.201370" elapsed="0.058313">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:27:08.201328" elapsed="0.058452">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:08.260030" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:27:08.260372" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:08.260691" elapsed="0.000037"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:27:08.261053" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:27:08.261477" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:08.261826" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:08.262169" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:27:08.262403" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:27:08.193500" elapsed="0.069004">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:27:08.262564" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:27:08.191735" elapsed="0.070918">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:08.262928" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:08.262787" elapsed="0.000190"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:08.263180" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:08.263000" elapsed="0.000232"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:08.263398" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:08.263254" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:08.262770" elapsed="0.000697"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:27:08.191355" elapsed="0.072151">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:27:08.190987" elapsed="0.072572">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:08.263608" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:27:08.182387" elapsed="0.081345">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:08.263909" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:08.264128" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:08.263987" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:08.263972" elapsed="0.000224"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:08.264321" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:08.264486" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:08.264543" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:27:08.180363" elapsed="0.084271">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:27:08.179921" elapsed="0.084900">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:27:08.179627" elapsed="0.085247">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:27:08.178892" elapsed="0.086063">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:08.265163" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:27:08.155583" elapsed="0.109684">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:27:09.284971" elapsed="0.000407"/>
</kw>
<msg time="2026-10-16T01:27:09.285494" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:09.283681" elapsed="0.001933"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:27:09.282770" elapsed="0.003077"/>
</kw>
<msg time="2026-10-16T01:27:09.285968" 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-10-16T01:27:09.275866" elapsed="0.010193"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:27:09.274978" elapsed="0.011230"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:09.287388" 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-10-16T01:27:09.286862" elapsed="0.000622"/>
</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-10-16T01:27:09.294494" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:09.293747" elapsed="0.000807"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:09.295554" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:09.294943" elapsed="0.000666"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:09.295753" elapsed="0.000063"/>
</return>
<msg time="2026-10-16T01:27:09.296048" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:09.292530" elapsed="0.003569"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:27:09.296433" elapsed="0.000339"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:09.297874" 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-10-16T01:27:09.297147" elapsed="0.000784"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:09.298827" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:09.298263" elapsed="0.000619"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:09.299742" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:09.299195" elapsed="0.000603"/>
</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-10-16T01:27:09.308490" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:27:09.307126" elapsed="0.001473"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:27:09.308820" elapsed="0.000136"/>
</return>
<msg time="2026-10-16T01:27:09.309387" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:27:09.303825" elapsed="0.005686"/>
</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-10-16T01:27:09.335102" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:09.334639" elapsed="0.000499"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:27:09.336135" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:27:09.335839" elapsed="0.000395">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:09.336351" 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-10-16T01:27:09.335360" elapsed="0.001022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:09.337078" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:09.336615" elapsed="0.000498"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:27:09.337494" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:27:09.337724" 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-10-16T01:27:09.337337" elapsed="0.000422"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:09.338336" 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-10-16T01:27:09.338029" elapsed="0.000363"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:09.339860" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:09.339325" elapsed="0.000594"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:27:09.340570" 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-10-16T01:27:09.340159" elapsed="0.000446"/>
</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-10-16T01:27:09.341041" elapsed="0.000028"/>
</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-10-16T01:27:09.341296" elapsed="0.000032"/>
</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-10-16T01:27:09.341546" elapsed="0.000027"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:27:09.340860" elapsed="0.000759"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:27:09.340683" elapsed="0.000974"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:27:09.341752" elapsed="0.000038"/>
</return>
<msg time="2026-10-16T01:27:09.341935" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:27:09.338859" elapsed="0.003109"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:09.338477" elapsed="0.003530"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:09.342239" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:09.342042" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:09.338453" elapsed="0.003883"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:27:09.343165" 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-10-16T01:27:09.342547" elapsed="0.000643"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:27:09.343233" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:27:09.333945" elapsed="0.009384"/>
</kw>
<msg time="2026-10-16T01:27:09.343376" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:09.328294" elapsed="0.015128"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:09.347269" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:09.351048" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:09.354858" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:09.355035" elapsed="0.000020"/>
</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-10-16T01:27:09.355222" elapsed="0.000019"/>
</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-10-16T01:27:09.355557" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:09.355417" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:09.355403" elapsed="0.000227"/>
</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-10-16T01:27:09.355812" 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-10-16T01:27:09.356008" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:09.356207" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:27:09.355377" elapsed="0.000880"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:27:09.355288" elapsed="0.000993"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:09.356433" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:09.356503" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:27:09.356607" 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-10-16T01:27:09.327435" elapsed="0.029196"/>
</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-10-16T01:27:09.357806" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:09.357542" elapsed="0.000325">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:09.357950" 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-10-16T01:27:09.357221" elapsed="0.000751"/>
</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-10-16T01:27:09.358251" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:09.358035" elapsed="0.000268"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:27:09.358772" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:09.358483" elapsed="0.000313"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:09.358325" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:09.358019" elapsed="0.000829"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:09.359339" 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-10-16T01:27:09.359005" elapsed="0.000358"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:27:09.359408" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:27:09.359530" 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-manganese/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-10-16T01:27:09.356921" elapsed="0.002632"/>
</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-10-16T01:27:09.360627" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:09.360438" elapsed="0.000276">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:09.360800" 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-10-16T01:27:09.360122" elapsed="0.000701"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:27:09.360985" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:27:09.360887" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:09.360870" elapsed="0.000191"/>
</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-10-16T01:27:09.361212" elapsed="0.000020"/>
</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-10-16T01:27:09.361383" elapsed="0.000018"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:09.361442" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:27:09.361564" 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-manganese/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-10-16T01:27:09.359827" elapsed="0.001760"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:09.363009" 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-10-16T01:27:09.362780" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:09.363497" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:09.363274" elapsed="0.000264"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:27:09.367353" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:27:09.367409" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:27:09.367509" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:09.363851" elapsed="0.004055">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:09.363598" elapsed="0.004388">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:09.368166" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:09.368016" elapsed="0.000208"/>
</branch>
<status status="FAIL" start="2026-10-16T01:27:09.363581" elapsed="0.004664">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:09.368579" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:09.368728" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:09.368678" elapsed="0.000093"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:09.368649" elapsed="0.000142"/>
</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-10-16T01:27:09.368926" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:27:09.368989" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:27:09.362059" elapsed="0.007030">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:09.369156" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:27:09.317584" elapsed="0.051696">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:27:09.369671" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:09.369444" elapsed="0.000331"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:09.369397" elapsed="0.000418"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:09.369896" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:27:09.314058" elapsed="0.056000">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:09.310032" elapsed="0.060126">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:27:09.309988" elapsed="0.060242">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:09.370472" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:27:09.370886" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:09.371201" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:27:09.371547" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:27:09.372008" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:09.372317" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:09.372673" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:27:09.372943" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:27:09.302439" elapsed="0.070606">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:27:09.373107" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:27:09.300596" elapsed="0.072598">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:09.373412" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:09.373273" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:09.373624" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:09.373484" elapsed="0.000202"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:09.373877" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:09.373731" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:09.373257" elapsed="0.000689"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:27:09.300267" elapsed="0.073717">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:27:09.299895" elapsed="0.074141">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:09.374084" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:27:09.291172" elapsed="0.083001">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:09.374348" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:09.374564" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:09.374425" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:09.374410" elapsed="0.000223"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:09.374888" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:09.375059" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:09.375117" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:27:09.289533" elapsed="0.085675">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:27:09.289084" elapsed="0.086185">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:27:09.288839" elapsed="0.086522">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:27:09.288035" elapsed="0.087411">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:09.375654" elapsed="0.000036"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:27:09.266126" elapsed="0.109662">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:27:10.394470" elapsed="0.000494"/>
</kw>
<msg time="2026-10-16T01:27:10.395069" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:10.393182" elapsed="0.002451"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:27:10.392210" elapsed="0.003642"/>
</kw>
<msg time="2026-10-16T01:27:10.395945" 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-10-16T01:27:10.385531" elapsed="0.010504"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:27:10.384626" elapsed="0.011556"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:10.397207" 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-10-16T01:27:10.396642" elapsed="0.000658"/>
</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-10-16T01:27:10.403827" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:10.403049" elapsed="0.000835"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:10.404864" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:10.404213" elapsed="0.000705"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:10.405010" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:27:10.405291" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:10.402222" elapsed="0.003118"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:27:10.405687" elapsed="0.000312"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:10.407076" 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-10-16T01:27:10.406367" elapsed="0.000764"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:10.408017" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:10.407458" elapsed="0.000612"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:10.408923" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:10.408378" elapsed="0.000598"/>
</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-10-16T01:27:10.417426" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:27:10.416068" elapsed="0.001465"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:27:10.417678" elapsed="0.000176"/>
</return>
<msg time="2026-10-16T01:27:10.418277" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:27:10.412897" elapsed="0.005504"/>
</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-10-16T01:27:10.443065" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:10.442605" elapsed="0.000496"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:27:10.444050" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:27:10.443783" elapsed="0.000353">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:10.444253" 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-10-16T01:27:10.443315" elapsed="0.000970"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:10.444990" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:10.444521" elapsed="0.000505"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:27:10.445409" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:27:10.445583" 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-10-16T01:27:10.445255" elapsed="0.000361"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:10.446226" 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-10-16T01:27:10.445919" elapsed="0.000363"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:10.447743" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:10.447385" elapsed="0.000416"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:27:10.448393" 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-10-16T01:27:10.448043" elapsed="0.000384"/>
</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-10-16T01:27:10.448856" elapsed="0.000029"/>
</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-10-16T01:27:10.449110" 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-10-16T01:27:10.449358" elapsed="0.000027"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:27:10.448645" elapsed="0.000784"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:27:10.448495" elapsed="0.000972"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:27:10.449521" elapsed="0.000036"/>
</return>
<msg time="2026-10-16T01:27:10.449737" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:27:10.446915" elapsed="0.002857"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:10.446366" elapsed="0.003447"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:10.450045" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:10.449845" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:10.446342" elapsed="0.003800"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:27:10.450956" 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-10-16T01:27:10.450353" elapsed="0.000646"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:27:10.451075" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:27:10.441908" elapsed="0.009291"/>
</kw>
<msg time="2026-10-16T01:27:10.451245" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:10.436213" elapsed="0.015079"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:10.455097" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:10.458927" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:10.462708" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:10.462885" elapsed="0.000020"/>
</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-10-16T01:27:10.463063" elapsed="0.000019"/>
</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-10-16T01:27:10.463397" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:10.463256" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:10.463243" elapsed="0.000226"/>
</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-10-16T01:27:10.463618" elapsed="0.000019"/>
</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-10-16T01:27:10.463820" 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-10-16T01:27:10.463981" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:27:10.463218" elapsed="0.000811"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:27:10.463129" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:10.464201" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:10.464268" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:27:10.464371" 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-10-16T01:27:10.435357" elapsed="0.029038"/>
</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-10-16T01:27:10.465491" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:10.465300" elapsed="0.000250">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:10.465632" 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-10-16T01:27:10.464980" elapsed="0.000674"/>
</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-10-16T01:27:10.465962" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:10.465746" elapsed="0.000267"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:27:10.466454" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:10.466192" elapsed="0.000285"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:10.466036" elapsed="0.000473"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:10.465729" elapsed="0.000800"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:10.467047" 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-10-16T01:27:10.466711" elapsed="0.000391"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:27:10.467149" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:27:10.467274" 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-manganese/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-10-16T01:27:10.464652" elapsed="0.002645"/>
</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-10-16T01:27:10.468371" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:10.468184" elapsed="0.000246">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:10.468513" 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-10-16T01:27:10.467869" elapsed="0.000667"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:27:10.468888" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:27:10.468779" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:10.468583" elapsed="0.000382"/>
</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-10-16T01:27:10.469115" elapsed="0.000020"/>
</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-10-16T01:27:10.469287" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:10.469347" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:27:10.469470" 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-manganese/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-10-16T01:27:10.467538" elapsed="0.001955"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:10.470725" 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-10-16T01:27:10.470476" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:10.471177" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:10.470961" elapsed="0.000256"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:27:10.474980" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:27:10.475031" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:27:10.475124" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:10.471497" elapsed="0.003956">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:10.471277" elapsed="0.004252">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:10.475737" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:10.475559" elapsed="0.000243"/>
</branch>
<status status="FAIL" start="2026-10-16T01:27:10.471260" elapsed="0.004564">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:10.476151" elapsed="0.000023"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:10.476269" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:10.476236" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:10.476220" elapsed="0.000107"/>
</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-10-16T01:27:10.476460" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:27:10.476554" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:27:10.469786" elapsed="0.006882">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:10.476751" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:27:10.425497" elapsed="0.051380">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:27:10.477258" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:10.477042" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:10.476995" elapsed="0.000385"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:10.477464" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:27:10.423047" elapsed="0.054579">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:10.419045" elapsed="0.058720">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:27:10.419003" elapsed="0.058839">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:10.478087" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:27:10.478425" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:10.478761" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:27:10.479104" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:27:10.479519" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:10.479864" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:10.480205" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:27:10.480436" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:27:10.411547" elapsed="0.068989">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:27:10.480597" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:27:10.409818" elapsed="0.070916">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:10.480956" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:10.480817" elapsed="0.000188"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:10.481162" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:10.481027" elapsed="0.000184"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:10.481372" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:10.481233" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:10.480801" elapsed="0.000669"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:27:10.409438" elapsed="0.072073">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:27:10.409071" elapsed="0.072493">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:10.481612" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:27:10.400885" elapsed="0.080853">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:10.481916" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:10.482134" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:10.481994" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:10.481979" elapsed="0.000223"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:10.482326" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:10.482492" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:10.482550" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:27:10.399254" elapsed="0.083387">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:27:10.398817" elapsed="0.084009">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:27:10.398529" elapsed="0.084348">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:27:10.397792" elapsed="0.085167">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:10.483166" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:27:10.376375" elapsed="0.106894">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:27:11.504416" elapsed="0.000435"/>
</kw>
<msg time="2026-10-16T01:27:11.504954" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:11.503175" elapsed="0.001885"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:27:11.502136" elapsed="0.003078"/>
</kw>
<msg time="2026-10-16T01:27:11.505301" 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-10-16T01:27:11.495241" elapsed="0.010149"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:27:11.494382" elapsed="0.011155"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:11.506956" 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-10-16T01:27:11.506049" elapsed="0.001009"/>
</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-10-16T01:27:11.513542" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:11.512811" elapsed="0.000788"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:11.514582" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:11.513981" elapsed="0.000655"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:11.514774" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:27:11.515063" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:11.511995" elapsed="0.003118"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:27:11.515438" elapsed="0.000325"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:11.516841" 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-10-16T01:27:11.516131" elapsed="0.000766"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:11.517767" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:11.517220" elapsed="0.000602"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:11.518622" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:11.518129" elapsed="0.000566"/>
</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-10-16T01:27:11.579483" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:27:11.578841" elapsed="0.000698"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:27:11.579610" elapsed="0.000104"/>
</return>
<msg time="2026-10-16T01:27:11.579916" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:27:11.577359" elapsed="0.002615"/>
</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-10-16T01:27:11.596244" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:11.595852" elapsed="0.000420"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:27:11.597028" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:27:11.596780" elapsed="0.000326">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:11.597191" 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-10-16T01:27:11.596429" elapsed="0.000785"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:11.597731" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:11.597386" elapsed="0.000372"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:27:11.598042" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:27:11.598206" 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-10-16T01:27:11.597921" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:11.598652" 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-10-16T01:27:11.598424" 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-10-16T01:27:11.599607" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:11.599375" elapsed="0.000273"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:27:11.600110" 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-10-16T01:27:11.599852" 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-10-16T01:27:11.600436" elapsed="0.000020"/>
</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-10-16T01:27:11.600616" elapsed="0.000022"/>
</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-10-16T01:27:11.600895" elapsed="0.000023"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:27:11.600306" elapsed="0.000645"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:27:11.600184" elapsed="0.000796"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:27:11.601020" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:27:11.601149" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:27:11.599038" elapsed="0.002135"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:11.598787" 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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:11.601369" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:11.601226" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:11.598769" elapsed="0.002671"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:27:11.602030" 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-10-16T01:27:11.601593" elapsed="0.000463"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:27:11.602100" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:27:11.595322" elapsed="0.006878"/>
</kw>
<msg time="2026-10-16T01:27:11.602249" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:11.591147" elapsed="0.011149"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:11.606254" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:11.610292" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:11.614568" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:11.614772" 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-10-16T01:27:11.614953" 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-10-16T01:27:11.615291" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:11.615149" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:11.615136" elapsed="0.000228"/>
</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-10-16T01:27:11.615515" elapsed="0.000019"/>
</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-10-16T01:27:11.615716" 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-10-16T01:27:11.615881" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:27:11.615109" elapsed="0.000821"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:27:11.615019" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:11.616141" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:11.616211" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:27:11.616315" 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-10-16T01:27:11.590523" elapsed="0.025816"/>
</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-10-16T01:27:11.617446" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:11.617253" elapsed="0.000252">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:11.617587" 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-10-16T01:27:11.616927" elapsed="0.000683"/>
</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-10-16T01:27:11.617917" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:11.617688" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:27:11.618423" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:11.618160" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:11.617993" elapsed="0.000486"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:11.617670" elapsed="0.000829"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:11.619026" 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-10-16T01:27:11.618674" elapsed="0.000376"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:27:11.619096" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:27:11.619218" 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-manganese/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-10-16T01:27:11.616600" elapsed="0.002641"/>
</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-10-16T01:27:11.620325" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:11.620136" elapsed="0.000247">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:11.620465" 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-10-16T01:27:11.619812" elapsed="0.000676"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:27:11.620649" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-10-16T01:27:11.620551" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:11.620534" elapsed="0.000219"/>
</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-10-16T01:27:11.620905" elapsed="0.000020"/>
</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-10-16T01:27:11.621077" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:11.621137" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:27:11.621261" 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-manganese/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-10-16T01:27:11.619484" elapsed="0.001800"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:11.622503" 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-10-16T01:27:11.622278" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:11.622984" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:11.622762" elapsed="0.000262"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:27:11.627102" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:27:11.627187" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:27:11.627299" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:11.623305" elapsed="0.004364">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:11.623084" elapsed="0.004683">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:11.627951" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:11.627798" elapsed="0.000213"/>
</branch>
<status status="FAIL" start="2026-10-16T01:27:11.623067" elapsed="0.004967">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:11.628370" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:11.628491" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:11.628457" elapsed="0.000075"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:11.628441" elapsed="0.000112"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:11.628718" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:27:11.628785" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:27:11.621552" elapsed="0.007340">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:11.628961" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:27:11.583529" elapsed="0.045558">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:27:11.629473" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:11.629254" elapsed="0.000302"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:11.629207" elapsed="0.000390"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:11.629716" elapsed="0.000040"/>
</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="FAIL" start="2026-10-16T01:27:11.581968" elapsed="0.047920">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:11.580188" elapsed="0.049799">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:27:11.580166" elapsed="0.049895">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:11.630313" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:27:11.630669" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:11.631009" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:27:11.631357" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:27:11.631856" elapsed="0.000024"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:11.632174" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:11.632519" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:27:11.632802" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:27:11.576574" elapsed="0.056331">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:27:11.632969" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:27:11.519511" elapsed="0.113549">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:11.633288" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:11.633142" elapsed="0.000197"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:11.633500" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:11.633362" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:11.633749" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:11.633573" elapsed="0.000226"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:11.633126" elapsed="0.000695"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:27:11.519187" elapsed="0.114673">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:27:11.518816" elapsed="0.115099">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:11.633964" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:27:11.510532" elapsed="0.123525">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:11.634234" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:11.634453" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:11.634313" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:11.634298" elapsed="0.000224"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:11.634647" elapsed="0.000032"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:11.634944" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:11.635003" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:27:11.508991" elapsed="0.126106">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:27:11.508513" elapsed="0.126646">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:27:11.508280" elapsed="0.126928">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:27:11.507499" elapsed="0.127790">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:11.635536" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:27:11.483946" elapsed="0.151695">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:27:12.650511" elapsed="0.000446"/>
</kw>
<msg time="2026-10-16T01:27:12.651061" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:12.649263" elapsed="0.001905"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:27:12.648340" elapsed="0.002983"/>
</kw>
<msg time="2026-10-16T01:27:12.651413" 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-10-16T01:27:12.641867" elapsed="0.009634"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:27:12.641313" elapsed="0.010335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:12.652737" 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-10-16T01:27:12.652174" elapsed="0.000658"/>
</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-10-16T01:27:12.659873" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:12.659080" elapsed="0.000852"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:12.660964" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:12.660264" elapsed="0.000754"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:12.661113" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:27:12.661401" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:12.658242" elapsed="0.003211"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:27:12.662164" elapsed="0.000320"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:12.663570" 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-10-16T01:27:12.662902" elapsed="0.000723"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:12.664509" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:12.664004" elapsed="0.000556"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:12.665423" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:12.664920" elapsed="0.000556"/>
</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-10-16T01:27:12.673770" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:27:12.672350" elapsed="0.001530"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:27:12.674006" elapsed="0.000133"/>
</return>
<msg time="2026-10-16T01:27:12.674558" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:27:12.669131" elapsed="0.005834"/>
</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-10-16T01:27:12.697608" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:12.697182" elapsed="0.000463"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:27:12.698745" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:27:12.698412" elapsed="0.000427">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:12.698959" 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-10-16T01:27:12.697960" elapsed="0.001032"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:12.699682" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:12.699227" elapsed="0.000512"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:27:12.700128" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:27:12.700324" 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-10-16T01:27:12.699971" elapsed="0.000387"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:12.701014" 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-10-16T01:27:12.700627" elapsed="0.000460"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:12.702060" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:12.701826" elapsed="0.000275"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:27:12.702529" 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-10-16T01:27:12.702274" elapsed="0.000280"/>
</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-10-16T01:27:12.702865" 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-10-16T01:27:12.703051" elapsed="0.000022"/>
</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-10-16T01:27:12.703229" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:27:12.702735" elapsed="0.000544"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:27:12.702597" elapsed="0.000710"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:27:12.703347" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:27:12.703477" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:27:12.701458" elapsed="0.002042"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:12.701193" elapsed="0.002337"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:12.703723" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:12.703553" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:12.701164" elapsed="0.002633"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:27:12.704341" 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-10-16T01:27:12.703953" elapsed="0.000413"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:27:12.704409" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:27:12.696447" elapsed="0.008061"/>
</kw>
<msg time="2026-10-16T01:27:12.704556" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:12.690751" elapsed="0.013852"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:12.708744" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:12.712570" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:12.716645" elapsed="0.000036"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:12.716849" 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-10-16T01:27:12.717031" elapsed="0.000019"/>
</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-10-16T01:27:12.717372" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:12.717229" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:12.717216" elapsed="0.000229"/>
</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-10-16T01:27:12.717596" elapsed="0.000019"/>
</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-10-16T01:27:12.717800" 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-10-16T01:27:12.717962" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:27:12.717189" elapsed="0.000821"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:27:12.717098" elapsed="0.000935"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:12.718182" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:12.718250" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:27:12.718354" 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-10-16T01:27:12.689891" elapsed="0.028486"/>
</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-10-16T01:27:12.719490" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:12.719290" elapsed="0.000259">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:12.719632" 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-10-16T01:27:12.718968" elapsed="0.000701"/>
</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-10-16T01:27:12.719967" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:12.719750" elapsed="0.000270"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:27:12.720467" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:12.720202" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:12.720043" elapsed="0.000480"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:12.719733" elapsed="0.000810"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:12.721366" 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-10-16T01:27:12.720732" elapsed="0.000659"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:27:12.721437" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:27:12.721561" 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-manganese/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-10-16T01:27:12.718639" elapsed="0.002945"/>
</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-10-16T01:27:12.722752" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:12.722520" elapsed="0.000293">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:12.722897" 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-10-16T01:27:12.722202" elapsed="0.000719"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:27:12.723086" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:27:12.722986" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:12.722969" elapsed="0.000195"/>
</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-10-16T01:27:12.723315" 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-10-16T01:27:12.723489" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:12.723549" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:27:12.723688" 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-manganese/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-10-16T01:27:12.721901" elapsed="0.001825"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:12.724955" 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-10-16T01:27:12.724725" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:12.725400" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:12.725183" elapsed="0.000257"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:27:12.729574" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:27:12.729627" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:27:12.729757" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:12.725747" elapsed="0.004358">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:12.725498" elapsed="0.004685">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:12.730365" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:12.730215" elapsed="0.000208"/>
</branch>
<status status="FAIL" start="2026-10-16T01:27:12.725483" elapsed="0.004963">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:12.730817" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:12.730941" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:12.730906" elapsed="0.000075"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:12.730890" elapsed="0.000112"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:12.731140" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:27:12.731204" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:27:12.724004" elapsed="0.007302">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:12.731406" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:27:12.680107" elapsed="0.051431">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:27:12.731971" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:12.731745" elapsed="0.000310"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:12.731674" elapsed="0.000422"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:12.732181" elapsed="0.000038"/>
</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="FAIL" start="2026-10-16T01:27:12.677849" elapsed="0.054502">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:12.675285" elapsed="0.057168">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:27:12.675257" elapsed="0.057270">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:12.732807" elapsed="0.000025"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:27:12.733156" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:12.733470" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:27:12.733859" elapsed="0.000024"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:27:12.734293" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:12.734609" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:12.734992" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:27:12.735235" elapsed="0.000019"/>
</return>
<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="FAIL" start="2026-10-16T01:27:12.667844" elapsed="0.067494">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:27:12.735400" elapsed="0.000017"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:27:12.666326" elapsed="0.069165">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:12.735747" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:12.735572" elapsed="0.000228"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:12.735961" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:12.735823" elapsed="0.000188"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:12.736175" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:12.736034" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:12.735555" elapsed="0.000690"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:27:12.665997" elapsed="0.070286">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:27:12.665569" elapsed="0.070766">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:12.736383" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:27:12.656876" elapsed="0.079632">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:12.736821" elapsed="0.000022"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:12.737048" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:12.736906" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:12.736890" elapsed="0.000228"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:12.737243" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:12.737411" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:12.737470" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:27:12.655237" elapsed="0.082327">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:27:12.654780" elapsed="0.082846">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:27:12.654060" elapsed="0.083629">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:27:12.653271" elapsed="0.084516">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:12.737997" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:27:12.636217" elapsed="0.101884">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:27:13.757162" elapsed="0.000403"/>
</kw>
<msg time="2026-10-16T01:27:13.757731" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:13.755890" elapsed="0.001961"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:27:13.754944" elapsed="0.003068"/>
</kw>
<msg time="2026-10-16T01:27:13.758104" 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-10-16T01:27:13.747933" elapsed="0.010263"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:27:13.747050" elapsed="0.011299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:13.759405" 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-10-16T01:27:13.758877" elapsed="0.000619"/>
</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-10-16T01:27:13.766129" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:13.765337" elapsed="0.000850"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:13.767181" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:13.766515" elapsed="0.000720"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:13.767442" elapsed="0.000067"/>
</return>
<msg time="2026-10-16T01:27:13.767800" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:13.764468" elapsed="0.003386"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:27:13.768188" elapsed="0.000288"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:13.769583" 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-10-16T01:27:13.768903" elapsed="0.000736"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:13.770538" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:13.770024" elapsed="0.000567"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:13.771464" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:13.770955" elapsed="0.000563"/>
</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-10-16T01:27:13.780167" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:27:13.778809" elapsed="0.001466"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:27:13.780403" elapsed="0.000131"/>
</return>
<msg time="2026-10-16T01:27:13.781034" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:27:13.775506" elapsed="0.005653"/>
</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-10-16T01:27:13.803986" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:13.803511" elapsed="0.000511"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:27:13.805019" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:27:13.804721" elapsed="0.000396">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:13.805235" 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-10-16T01:27:13.804241" elapsed="0.001025"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:13.805971" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:13.805500" elapsed="0.000507"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:27:13.806394" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:27:13.806590" 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-10-16T01:27:13.806234" elapsed="0.000388"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:13.807241" 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-10-16T01:27:13.806932" elapsed="0.000366"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:13.808543" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:13.808312" elapsed="0.000272"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:27:13.809180" 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-10-16T01:27:13.808788" elapsed="0.000417"/>
</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-10-16T01:27:13.809490" elapsed="0.000020"/>
</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-10-16T01:27:13.809689" elapsed="0.000040"/>
</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-10-16T01:27:13.809890" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:27:13.809359" elapsed="0.000588"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:27:13.809248" elapsed="0.000728"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:27:13.810017" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:27:13.810199" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:27:13.807775" elapsed="0.002447"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:13.807383" elapsed="0.002869"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:13.810426" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:13.810279" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:13.807359" elapsed="0.003138"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:27:13.811082" 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-10-16T01:27:13.810666" elapsed="0.000441"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:27:13.811152" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:27:13.802811" elapsed="0.008442"/>
</kw>
<msg time="2026-10-16T01:27:13.811300" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:13.797037" elapsed="0.014310"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:13.815231" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:13.819181" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:13.823111" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:13.823290" elapsed="0.000019"/>
</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-10-16T01:27:13.823485" 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-10-16T01:27:13.823855" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:13.823710" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:13.823681" 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-10-16T01:27:13.824080" elapsed="0.000019"/>
</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-10-16T01:27:13.824256" elapsed="0.000065"/>
</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-10-16T01:27:13.824465" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:27:13.823642" elapsed="0.000871"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:27:13.823554" elapsed="0.000982"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:13.824711" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:13.824781" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:27:13.824885" 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-10-16T01:27:13.796177" elapsed="0.028732"/>
</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-10-16T01:27:13.826079" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:13.825877" elapsed="0.000263">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:13.826222" 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-10-16T01:27:13.825521" elapsed="0.000724"/>
</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-10-16T01:27:13.826525" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:13.826309" elapsed="0.000268"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:27:13.827052" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:13.826786" elapsed="0.000293"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:13.826600" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:13.826292" elapsed="0.000840"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:13.827627" 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-10-16T01:27:13.827291" elapsed="0.000375"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:27:13.827726" elapsed="0.000030"/>
</return>
<msg time="2026-10-16T01:27:13.827855" 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-manganese/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-10-16T01:27:13.825224" elapsed="0.002654"/>
</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-10-16T01:27:13.829061" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:13.828859" elapsed="0.000262">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:13.829205" 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-10-16T01:27:13.828421" elapsed="0.000807"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:27:13.829393" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:27:13.829292" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:13.829275" elapsed="0.000195"/>
</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-10-16T01:27:13.829620" elapsed="0.000020"/>
</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-10-16T01:27:13.829822" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:13.829884" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:27:13.830010" 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-manganese/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-10-16T01:27:13.828124" elapsed="0.001909"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:13.831474" 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-10-16T01:27:13.831217" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:13.831955" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:13.831731" elapsed="0.000264"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:27:13.835995" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:27:13.836085" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:27:13.836273" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:13.832278" elapsed="0.004546">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:13.832056" elapsed="0.004878">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:13.837186" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:13.836977" elapsed="0.000292"/>
</branch>
<status status="FAIL" start="2026-10-16T01:27:13.832039" elapsed="0.005262">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:13.837805" elapsed="0.000034"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:13.837976" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:13.837928" elapsed="0.000103"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:13.837906" elapsed="0.000154"/>
</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-10-16T01:27:13.838248" elapsed="0.000028"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:27:13.838337" elapsed="0.000020"/>
</return>
<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="FAIL" start="2026-10-16T01:27:13.830484" elapsed="0.007996">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:13.838576" elapsed="0.000021"/>
</return>
<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="FAIL" start="2026-10-16T01:27:13.786508" elapsed="0.052286">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:27:13.839349" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:13.839041" elapsed="0.000423"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:13.838973" elapsed="0.000549"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:13.839642" elapsed="0.000107"/>
</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="FAIL" start="2026-10-16T01:27:13.784380" elapsed="0.055559">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:13.781615" elapsed="0.058466">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:27:13.781573" elapsed="0.058610">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:13.840529" elapsed="0.000034"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:27:13.841104" elapsed="0.000036"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:13.841490" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:27:13.841879" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:27:13.842324" elapsed="0.000032"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:13.842669" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:13.843084" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:27:13.843371" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:27:13.773910" elapsed="0.069565">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:27:13.843537" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:27:13.772381" elapsed="0.071245">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:13.843885" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:13.843744" elapsed="0.000192"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:13.844094" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:13.843958" elapsed="0.000186"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:13.844306" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:13.844165" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:13.843726" elapsed="0.000648"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:27:13.772050" elapsed="0.072362">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:27:13.771613" elapsed="0.072852">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:13.844513" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:27:13.763117" elapsed="0.081487">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:13.844868" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:13.845092" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:13.844949" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:13.844934" elapsed="0.000227"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:13.845286" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:13.845453" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:13.845511" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:27:13.761486" elapsed="0.084118">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:27:13.761041" elapsed="0.084638">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:27:13.760792" elapsed="0.085012">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:27:13.759996" elapsed="0.085892">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:13.846098" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:27:13.738984" elapsed="0.107218">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:27:14.867549" elapsed="0.000456"/>
</kw>
<msg time="2026-10-16T01:27:14.868115" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:14.866310" elapsed="0.001916"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:27:14.865373" elapsed="0.003010"/>
</kw>
<msg time="2026-10-16T01:27:14.868474" 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-10-16T01:27:14.858877" elapsed="0.009685"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:27:14.858000" elapsed="0.010761"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:14.869806" 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-10-16T01:27:14.869240" elapsed="0.000659"/>
</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-10-16T01:27:14.876419" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:14.875627" elapsed="0.000849"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:14.877491" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:14.876875" elapsed="0.000671"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:14.877641" elapsed="0.000113"/>
</return>
<msg time="2026-10-16T01:27:14.877988" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:14.874844" elapsed="0.003196"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:27:14.878367" elapsed="0.000310"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:14.879807" 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-10-16T01:27:14.879077" elapsed="0.000788"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:14.880761" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:14.880194" elapsed="0.000622"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:14.881635" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:14.881127" elapsed="0.000612"/>
</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-10-16T01:27:14.890377" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:27:14.888993" elapsed="0.001491"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:27:14.890611" elapsed="0.000194"/>
</return>
<msg time="2026-10-16T01:27:14.891237" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:27:14.885773" elapsed="0.005588"/>
</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-10-16T01:27:14.914126" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:14.913674" elapsed="0.000489"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:27:14.915148" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:27:14.914857" elapsed="0.000386">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:14.915361" 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-10-16T01:27:14.914379" elapsed="0.001014"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:14.916169" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:14.915727" elapsed="0.000478"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:27:14.916592" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:27:14.916816" 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-10-16T01:27:14.916432" elapsed="0.000418"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:14.917427" 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-10-16T01:27:14.917116" elapsed="0.000369"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:14.918661" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:14.918415" elapsed="0.000303"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:27:14.919298" 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-10-16T01:27:14.918892" elapsed="0.000431"/>
</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-10-16T01:27:14.919608" 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-10-16T01:27:14.919890" 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-10-16T01:27:14.920074" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:27:14.919479" elapsed="0.000647"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:27:14.919368" elapsed="0.000787"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:27:14.920195" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:27:14.920325" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:27:14.917959" elapsed="0.002389"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:14.917570" elapsed="0.002807"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:14.920545" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:14.920401" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:14.917546" elapsed="0.003069"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:27:14.921186" 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-10-16T01:27:14.920798" elapsed="0.000414"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:27:14.921255" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:27:14.912956" elapsed="0.008398"/>
</kw>
<msg time="2026-10-16T01:27:14.921402" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:14.907221" elapsed="0.014227"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:14.925346" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:14.929269" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:14.933133" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:14.933359" elapsed="0.000020"/>
</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-10-16T01:27:14.933536" elapsed="0.000019"/>
</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-10-16T01:27:14.933910" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:14.933767" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:14.933753" 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-10-16T01:27:14.934136" elapsed="0.000019"/>
</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-10-16T01:27:14.934311" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:14.934470" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:27:14.933725" elapsed="0.000793"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:27:14.933602" elapsed="0.000940"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:14.934726" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:14.934799" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:27:14.934904" 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-10-16T01:27:14.906353" elapsed="0.028575"/>
</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-10-16T01:27:14.936275" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:14.936067" elapsed="0.000267">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:14.936417" 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-10-16T01:27:14.935486" elapsed="0.000954"/>
</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-10-16T01:27:14.936750" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:14.936502" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:27:14.937251" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:14.936986" elapsed="0.000292"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:14.936827" elapsed="0.000483"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:14.936486" elapsed="0.000844"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:14.937886" 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-10-16T01:27:14.937488" elapsed="0.000423"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:27:14.937957" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:27:14.938081" 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-manganese/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-10-16T01:27:14.935188" elapsed="0.002916"/>
</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-10-16T01:27:14.939197" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:14.938998" elapsed="0.000258">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:14.939339" 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-10-16T01:27:14.938664" elapsed="0.000698"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:27:14.939568" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:27:14.939468" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:14.939451" elapsed="0.000208"/>
</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-10-16T01:27:14.939826" 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-10-16T01:27:14.939999" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:14.940059" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:27:14.940184" 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-manganese/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-10-16T01:27:14.938354" elapsed="0.001853"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:14.941615" 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-10-16T01:27:14.941384" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:14.942291" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:14.941878" elapsed="0.000454"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:27:14.946191" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:27:14.946243" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:27:14.946352" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:14.942616" elapsed="0.004125">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:14.942394" elapsed="0.004426">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:14.947002" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:14.946851" elapsed="0.000237"/>
</branch>
<status status="FAIL" start="2026-10-16T01:27:14.942377" elapsed="0.004744">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:14.947600" elapsed="0.000033"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:14.947809" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:14.947761" elapsed="0.000101"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:14.947736" elapsed="0.000154"/>
</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-10-16T01:27:14.948082" elapsed="0.000028"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:27:14.948169" elapsed="0.000020"/>
</return>
<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="FAIL" start="2026-10-16T01:27:14.940476" elapsed="0.007836">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:14.948407" elapsed="0.000021"/>
</return>
<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="FAIL" start="2026-10-16T01:27:14.896591" elapsed="0.051991">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:27:14.949231" elapsed="0.000086"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:14.948866" elapsed="0.000522"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:14.948798" elapsed="0.000632"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:14.949515" elapsed="0.000037"/>
</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="FAIL" start="2026-10-16T01:27:14.894467" elapsed="0.055244">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:14.892032" elapsed="0.057785">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:27:14.891981" elapsed="0.057909">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:14.950138" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:27:14.950479" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:14.950827" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:27:14.951182" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:27:14.951614" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:14.951958" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:14.952318" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:27:14.952556" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:27:14.884401" elapsed="0.068272">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:27:14.952760" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:27:14.882545" elapsed="0.070306">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:14.953073" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:14.952932" elapsed="0.000190"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:14.953281" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:14.953145" elapsed="0.000185"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:14.953492" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:14.953352" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:14.952916" elapsed="0.000646"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:27:14.882215" elapsed="0.071385">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:27:14.881838" elapsed="0.071829">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:14.953846" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:27:14.873431" elapsed="0.080508">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:14.954119" elapsed="0.000051"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:14.954378" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:14.954234" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:14.954218" elapsed="0.000229"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:14.954574" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:14.954808" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:14.954870" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:27:14.871864" elapsed="0.083099">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:27:14.871368" elapsed="0.083657">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:27:14.871127" elapsed="0.083948">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:27:14.870341" elapsed="0.084815">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:14.955367" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:27:14.846906" elapsed="0.108565">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:27:15.974133" elapsed="0.000404"/>
</kw>
<msg time="2026-10-16T01:27:15.974671" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:15.972878" elapsed="0.001938"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:27:15.971885" elapsed="0.003091"/>
</kw>
<msg time="2026-10-16T01:27:15.975066" 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-10-16T01:27:15.964893" elapsed="0.010262"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:27:15.964011" elapsed="0.011289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:15.976347" 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-10-16T01:27:15.975822" elapsed="0.000617"/>
</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-10-16T01:27:15.983074" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:15.982274" elapsed="0.000858"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:15.984138" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:15.983466" elapsed="0.000727"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:15.984287" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:27:15.984574" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:15.981412" elapsed="0.003212"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:27:15.985008" elapsed="0.000287"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:15.986498" 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-10-16T01:27:15.985682" elapsed="0.000872"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:15.987461" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:15.986945" elapsed="0.000570"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:15.988385" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:15.987877" elapsed="0.000561"/>
</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-10-16T01:27:15.997199" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:27:15.995841" elapsed="0.001466"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:27:15.997435" elapsed="0.000134"/>
</return>
<msg time="2026-10-16T01:27:15.998108" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:27:15.992219" elapsed="0.006014"/>
</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-10-16T01:27:16.021765" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:16.021301" elapsed="0.000501"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:27:16.022775" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:27:16.022458" elapsed="0.000413">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:16.022989" 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-10-16T01:27:16.022018" elapsed="0.001004"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:16.023723" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:16.023258" elapsed="0.000502"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:27:16.024146" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:27:16.024330" 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-10-16T01:27:16.023989" elapsed="0.000374"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:16.024987" 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-10-16T01:27:16.024632" elapsed="0.000412"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:16.026310" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:16.025989" elapsed="0.000378"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:27:16.027076" 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-10-16T01:27:16.026628" elapsed="0.000473"/>
</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-10-16T01:27:16.027382" elapsed="0.000020"/>
</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-10-16T01:27:16.027563" elapsed="0.000022"/>
</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-10-16T01:27:16.027770" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:27:16.027252" elapsed="0.000572"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:27:16.027143" elapsed="0.000710"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:27:16.027893" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:27:16.028022" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:27:16.025473" elapsed="0.002572"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:16.025129" elapsed="0.002944"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:16.028242" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:16.028098" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:16.025105" elapsed="0.003205"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:27:16.029082" 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-10-16T01:27:16.028464" elapsed="0.000686"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:27:16.029197" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:27:16.020573" elapsed="0.008729"/>
</kw>
<msg time="2026-10-16T01:27:16.029351" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:16.014904" elapsed="0.014493"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:16.033206" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:16.037149" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:16.041054" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:16.041234" elapsed="0.000020"/>
</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-10-16T01:27:16.041416" elapsed="0.000019"/>
</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-10-16T01:27:16.041777" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:16.041611" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:16.041597" elapsed="0.000255"/>
</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-10-16T01:27:16.042002" elapsed="0.000019"/>
</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-10-16T01:27:16.042179" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:16.042338" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:27:16.041571" elapsed="0.000814"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:27:16.041482" elapsed="0.000926"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:16.042555" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:16.042623" elapsed="0.000013"/>
</return>
<msg time="2026-10-16T01:27:16.042754" 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-10-16T01:27:16.014048" elapsed="0.028731"/>
</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-10-16T01:27:16.044098" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:16.043736" elapsed="0.000423">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:16.044242" 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-10-16T01:27:16.043384" elapsed="0.000881"/>
</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-10-16T01:27:16.044547" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:16.044329" elapsed="0.000270"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:27:16.045085" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:16.044817" elapsed="0.000294"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:16.044622" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:16.044312" elapsed="0.000851"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:16.045672" 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-10-16T01:27:16.045320" elapsed="0.000399"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:27:16.045768" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:27:16.045894" 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-manganese/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-10-16T01:27:16.043041" elapsed="0.002876"/>
</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-10-16T01:27:16.047009" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:16.046808" elapsed="0.000260">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:16.047152" 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-10-16T01:27:16.046460" elapsed="0.000715"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:27:16.047338" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:27:16.047238" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:16.047222" elapsed="0.000192"/>
</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-10-16T01:27:16.047564" elapsed="0.000019"/>
</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-10-16T01:27:16.047765" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:16.047827" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:27:16.047955" 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-manganese/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-10-16T01:27:16.046161" elapsed="0.001817"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:16.049224" 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-10-16T01:27:16.048982" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:16.050058" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:16.049450" 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-10-16T01:27:16.054331" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:27:16.054411" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:27:16.054556" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:16.050387" elapsed="0.004724">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:16.050163" elapsed="0.005110">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:16.055549" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:16.055322" elapsed="0.000314"/>
</branch>
<status status="FAIL" start="2026-10-16T01:27:16.050146" elapsed="0.005543">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:16.056219" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:16.056398" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:16.056349" elapsed="0.000106"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:16.056325" elapsed="0.000160"/>
</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-10-16T01:27:16.056719" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:27:16.056815" elapsed="0.000020"/>
</return>
<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="FAIL" start="2026-10-16T01:27:16.048256" elapsed="0.008710">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:16.057065" elapsed="0.000021"/>
</return>
<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="FAIL" start="2026-10-16T01:27:16.004293" elapsed="0.052954">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:27:16.057848" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:16.057488" elapsed="0.000483"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:16.057419" elapsed="0.000611"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:16.058151" elapsed="0.000051"/>
</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="FAIL" start="2026-10-16T01:27:16.002179" elapsed="0.056214">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:15.998775" elapsed="0.059763">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:27:15.998638" elapsed="0.060023">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:16.059051" elapsed="0.000036"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:27:16.059558" elapsed="0.000030"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:16.060033" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:27:16.060381" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:27:16.060841" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:16.061152" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:16.061496" elapsed="0.000019"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:27:16.061770" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:27:15.990923" elapsed="0.070949">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:27:16.061964" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:27:15.989402" elapsed="0.072654">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:16.062286" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:16.062146" elapsed="0.000190"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:16.062494" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:16.062358" elapsed="0.000185"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:16.062745" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:16.062565" elapsed="0.000230"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:16.062130" elapsed="0.000687"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:27:15.989070" elapsed="0.073785">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:27:15.988532" elapsed="0.074376">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:16.062956" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:27:15.980045" elapsed="0.083002">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:16.063221" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:16.063440" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:16.063299" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:16.063284" elapsed="0.000224"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:16.063632" elapsed="0.000035"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:16.063936" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:16.063995" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:27:15.978417" elapsed="0.085670">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:27:15.977978" elapsed="0.086171">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:27:15.977724" elapsed="0.086474">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:27:15.976936" elapsed="0.087344">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:16.064496" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:27:15.956142" elapsed="0.108458">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:27:17.083542" elapsed="0.000444"/>
</kw>
<msg time="2026-10-16T01:27:17.084100" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:17.082295" elapsed="0.002023"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:27:17.081355" elapsed="0.003128"/>
</kw>
<msg time="2026-10-16T01:27:17.084577" 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-10-16T01:27:17.074238" elapsed="0.010456"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:27:17.073319" elapsed="0.011562"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:17.085935" 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-10-16T01:27:17.085353" elapsed="0.000677"/>
</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-10-16T01:27:17.092542" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:17.091802" elapsed="0.000797"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:17.093594" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:17.092989" elapsed="0.000682"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:17.093797" elapsed="0.000065"/>
</return>
<msg time="2026-10-16T01:27:17.094088" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:17.090975" elapsed="0.003164"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:27:17.094471" elapsed="0.000330"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:17.095889" 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-10-16T01:27:17.095175" elapsed="0.000770"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:17.096827" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:17.096272" elapsed="0.000608"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:17.097736" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:17.097190" elapsed="0.000602"/>
</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-10-16T01:27:17.106308" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:27:17.104942" elapsed="0.001473"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:27:17.106541" elapsed="0.000153"/>
</return>
<msg time="2026-10-16T01:27:17.107165" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:27:17.101735" elapsed="0.005554"/>
</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-10-16T01:27:17.131322" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:17.130898" elapsed="0.000460"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:27:17.132361" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:27:17.132063" elapsed="0.000397">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:17.132579" 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-10-16T01:27:17.131573" elapsed="0.001038"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:17.133319" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:17.132888" elapsed="0.000466"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:27:17.133776" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:27:17.134022" 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-10-16T01:27:17.133582" elapsed="0.000475"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:17.134638" 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-10-16T01:27:17.134326" elapsed="0.000404"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:17.136013" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:17.135669" elapsed="0.000410"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:27:17.136800" 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-10-16T01:27:17.136380" elapsed="0.000446"/>
</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-10-16T01:27:17.137113" 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-10-16T01:27:17.137297" elapsed="0.000022"/>
</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-10-16T01:27:17.137478" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:27:17.136983" elapsed="0.000546"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:27:17.136871" elapsed="0.000686"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:27:17.137597" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:27:17.137761" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:27:17.135177" elapsed="0.002608"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:17.134819" elapsed="0.002995"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:17.137985" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:17.137840" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:17.134794" elapsed="0.003261"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:27:17.138603" 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-10-16T01:27:17.138210" elapsed="0.000418"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:27:17.138687" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:27:17.130163" elapsed="0.008643"/>
</kw>
<msg time="2026-10-16T01:27:17.138854" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:17.124476" elapsed="0.014425"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:17.142864" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:17.146677" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:17.150537" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:17.150782" 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-10-16T01:27:17.150964" elapsed="0.000019"/>
</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-10-16T01:27:17.151303" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:17.151163" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:17.151149" elapsed="0.000228"/>
</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-10-16T01:27:17.151528" elapsed="0.000019"/>
</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-10-16T01:27:17.151731" 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-10-16T01:27:17.151902" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:27:17.151122" elapsed="0.000829"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:27:17.151030" elapsed="0.000944"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:17.152129" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:17.152203" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:27:17.152567" 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-10-16T01:27:17.123625" elapsed="0.028966"/>
</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-10-16T01:27:17.153776" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:17.153549" elapsed="0.000288">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:17.153919" 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-10-16T01:27:17.153229" elapsed="0.000713"/>
</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-10-16T01:27:17.154268" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:17.154005" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:27:17.154794" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:17.154499" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:17.154343" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:17.153988" elapsed="0.000883"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:17.155362" 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-10-16T01:27:17.155027" elapsed="0.000359"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:27:17.155430" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:27:17.155553" 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-manganese/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-10-16T01:27:17.152891" elapsed="0.002685"/>
</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-10-16T01:27:17.156675" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:17.156463" elapsed="0.000288">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:17.156835" 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-10-16T01:27:17.156148" elapsed="0.000710"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:27:17.157021" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:27:17.156922" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:17.156905" elapsed="0.000197"/>
</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-10-16T01:27:17.157253" elapsed="0.000020"/>
</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-10-16T01:27:17.157467" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:17.157529" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:27:17.157670" 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-manganese/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-10-16T01:27:17.155852" elapsed="0.001842"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:17.159102" 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-10-16T01:27:17.158875" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:17.159546" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:17.159329" elapsed="0.000258"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:27:17.163741" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:27:17.163795" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:27:17.163893" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:17.159973" elapsed="0.004376">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:17.159662" elapsed="0.004793">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:17.164744" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:17.164498" elapsed="0.000332"/>
</branch>
<status status="FAIL" start="2026-10-16T01:27:17.159630" elapsed="0.005231">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:17.165339" elapsed="0.000034"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:17.165510" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:17.165462" elapsed="0.000101"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:17.165439" elapsed="0.000152"/>
</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-10-16T01:27:17.165816" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:27:17.165906" elapsed="0.000020"/>
</return>
<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="FAIL" start="2026-10-16T01:27:17.158156" elapsed="0.007894">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:17.166145" elapsed="0.000021"/>
</return>
<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="FAIL" start="2026-10-16T01:27:17.113924" elapsed="0.052399">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:27:17.166909" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:17.166561" elapsed="0.000465"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:17.166494" elapsed="0.000589"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:17.167203" elapsed="0.000051"/>
</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="FAIL" start="2026-10-16T01:27:17.111572" elapsed="0.055910">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:17.108000" elapsed="0.059624">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:27:17.107956" elapsed="0.059813">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:17.168124" elapsed="0.000032"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:27:17.168609" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:17.169126" elapsed="0.000035"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:27:17.169584" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:27:17.170043" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:17.170353" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:17.170730" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:27:17.170970" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:27:17.100088" elapsed="0.070984">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:27:17.171133" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:27:17.098582" elapsed="0.072640">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:17.171443" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:17.171302" elapsed="0.000191"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:17.171661" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:17.171515" elapsed="0.000254"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:17.171938" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:17.171792" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:17.171286" elapsed="0.000719"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:27:17.098255" elapsed="0.073789">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:27:17.097887" elapsed="0.074210">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:17.172145" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:27:17.089572" elapsed="0.082663">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:17.172408" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:17.172626" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:17.172486" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:17.172471" elapsed="0.000329"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:17.172974" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:17.173150" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:17.173208" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:27:17.088009" elapsed="0.085294">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:27:17.087517" elapsed="0.085848">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:27:17.087278" elapsed="0.086137">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:27:17.086476" elapsed="0.087021">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:17.173735" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:27:17.065328" elapsed="0.108512">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:27:18.195476" elapsed="0.000443"/>
</kw>
<msg time="2026-10-16T01:27:18.196029" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:18.194238" elapsed="0.001903"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:27:18.193309" elapsed="0.002983"/>
</kw>
<msg time="2026-10-16T01:27:18.196381" 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-10-16T01:27:18.186696" elapsed="0.009773"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:27:18.185844" elapsed="0.010769"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:18.197658" 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-10-16T01:27:18.197130" elapsed="0.000650"/>
</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-10-16T01:27:18.204414" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:18.203636" elapsed="0.000834"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:18.205452" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:18.204851" elapsed="0.000655"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:18.205598" elapsed="0.000083"/>
</return>
<msg time="2026-10-16T01:27:18.205943" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:18.202825" elapsed="0.003169"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:27:18.206367" elapsed="0.000326"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:18.207807" 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-10-16T01:27:18.207088" elapsed="0.000774"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:18.208839" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:18.208264" elapsed="0.000629"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:18.209863" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:18.209202" elapsed="0.000717"/>
</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-10-16T01:27:18.218479" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:27:18.217076" elapsed="0.001510"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:27:18.218765" elapsed="0.000133"/>
</return>
<msg time="2026-10-16T01:27:18.219306" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:27:18.213894" elapsed="0.005489"/>
</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-10-16T01:27:18.242021" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:18.241551" elapsed="0.000507"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:27:18.243043" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:27:18.242752" elapsed="0.000407">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:18.243305" 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-10-16T01:27:18.242279" elapsed="0.001065"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:18.244120" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:18.243615" elapsed="0.000552"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:27:18.244582" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:27:18.244904" 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-10-16T01:27:18.244425" elapsed="0.000514"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:18.245555" 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-10-16T01:27:18.245248" elapsed="0.000348"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:18.246510" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:18.246277" elapsed="0.000275"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:27:18.247166" 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-10-16T01:27:18.246757" elapsed="0.000435"/>
</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-10-16T01:27:18.247480" elapsed="0.000020"/>
</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-10-16T01:27:18.247673" elapsed="0.000046"/>
</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-10-16T01:27:18.247880" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:27:18.247350" elapsed="0.000581"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:27:18.247236" elapsed="0.000724"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:27:18.248001" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:27:18.248130" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:27:18.245941" elapsed="0.002213"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:18.245671" elapsed="0.002516"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:18.248355" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:18.248212" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:18.245653" elapsed="0.002772"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:27:18.249003" 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-10-16T01:27:18.248578" elapsed="0.000451"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:27:18.249073" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:27:18.240852" elapsed="0.008342"/>
</kw>
<msg time="2026-10-16T01:27:18.249279" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:18.235019" elapsed="0.014308"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:18.253175" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:18.257107" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:18.261209" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:18.261391" elapsed="0.000020"/>
</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-10-16T01:27:18.261571" elapsed="0.000019"/>
</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-10-16T01:27:18.261940" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:18.261798" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:18.261784" 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-10-16T01:27:18.262168" elapsed="0.000019"/>
</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-10-16T01:27:18.262345" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:18.262505" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:27:18.261757" elapsed="0.000797"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:27:18.261638" elapsed="0.000939"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:18.262754" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:18.262824" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:27:18.262929" 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-10-16T01:27:18.234155" elapsed="0.028798"/>
</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-10-16T01:27:18.264084" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:18.263881" elapsed="0.000263">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:18.264276" 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-10-16T01:27:18.263518" elapsed="0.000782"/>
</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-10-16T01:27:18.264589" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:18.264365" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:27:18.265131" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:18.264858" elapsed="0.000300"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:18.264679" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:18.264348" elapsed="0.000864"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:18.265763" 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-10-16T01:27:18.265376" elapsed="0.000412"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:27:18.265836" elapsed="0.000029"/>
</return>
<msg time="2026-10-16T01:27:18.265963" 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-manganese/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-10-16T01:27:18.263216" elapsed="0.002770"/>
</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-10-16T01:27:18.267096" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:18.266898" elapsed="0.000257">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:18.267239" 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-10-16T01:27:18.266537" elapsed="0.000725"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:27:18.267426" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:27:18.267326" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:18.267310" elapsed="0.000192"/>
</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-10-16T01:27:18.267667" 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-10-16T01:27:18.267858" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:18.267918" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:27:18.268042" 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-manganese/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-10-16T01:27:18.266237" elapsed="0.001828"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:18.269482" 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-10-16T01:27:18.269253" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:18.269964" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:18.269740" elapsed="0.000265"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:27:18.274188" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:27:18.274241" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:27:18.274349" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:18.270294" elapsed="0.004452">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:18.270065" elapsed="0.004760">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:18.275005" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:18.274856" elapsed="0.000242"/>
</branch>
<status status="FAIL" start="2026-10-16T01:27:18.270048" elapsed="0.005076">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:18.275465" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:18.275587" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:18.275553" elapsed="0.000073"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:18.275537" 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-10-16T01:27:18.275812" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:27:18.275877" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:27:18.268346" elapsed="0.007634">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:18.276047" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:27:18.224372" elapsed="0.051803">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:27:18.276565" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:18.276343" elapsed="0.000316"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:18.276295" elapsed="0.000432"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:18.276816" elapsed="0.000037"/>
</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="FAIL" start="2026-10-16T01:27:18.222210" elapsed="0.054775">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:18.219684" elapsed="0.057402">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:27:18.219656" elapsed="0.057509">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:18.277413" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:27:18.277790" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:18.278106" elapsed="0.000019"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:27:18.278453" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:27:18.278923" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:18.279237" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:18.279582" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:27:18.279940" elapsed="0.000020"/>
</return>
<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="FAIL" start="2026-10-16T01:27:18.212531" elapsed="0.067515">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:27:18.280113" elapsed="0.000017"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:27:18.210764" elapsed="0.069440">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:18.280465" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:18.280318" elapsed="0.000198"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:18.280688" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:18.280538" elapsed="0.000224"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:18.280929" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:18.280785" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:18.280301" elapsed="0.000697"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:27:18.210384" elapsed="0.070653">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:27:18.210015" elapsed="0.071075">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:18.281143" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:27:18.201440" elapsed="0.079796">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:18.281411" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:18.281629" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:18.281490" elapsed="0.000339"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:18.281475" elapsed="0.000378"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:18.281982" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:18.282156" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:18.282215" elapsed="0.000015"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:27:18.199888" elapsed="0.082421">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:27:18.199381" elapsed="0.082990">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:27:18.199099" elapsed="0.083321">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:27:18.198220" elapsed="0.084281">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:18.282735" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:27:18.174478" elapsed="0.108364">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:27:19.302129" elapsed="0.000402"/>
</kw>
<msg time="2026-10-16T01:27:19.302684" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:19.300860" elapsed="0.001977"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:27:19.299903" elapsed="0.003094"/>
</kw>
<msg time="2026-10-16T01:27:19.303200" 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-10-16T01:27:19.293226" elapsed="0.010070"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:27:19.292341" elapsed="0.011108"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:19.304517" 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-10-16T01:27:19.303988" elapsed="0.000624"/>
</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-10-16T01:27:19.311275" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:19.310470" elapsed="0.000866"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:19.312339" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:19.311697" elapsed="0.000698"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:19.312493" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:27:19.312875" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:19.309625" elapsed="0.003303"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:27:19.313258" elapsed="0.000288"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:19.314745" 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-10-16T01:27:19.314010" elapsed="0.000794"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:19.315662" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:19.315133" elapsed="0.000611"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:19.316562" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:19.316058" elapsed="0.000558"/>
</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-10-16T01:27:19.325359" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:27:19.323938" elapsed="0.001528"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:27:19.325594" elapsed="0.000207"/>
</return>
<msg time="2026-10-16T01:27:19.326255" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:27:19.320729" elapsed="0.005625"/>
</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-10-16T01:27:19.348918" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:19.348452" elapsed="0.000503"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:27:19.349965" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:27:19.349617" elapsed="0.000453">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:19.350190" 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-10-16T01:27:19.349171" elapsed="0.001051"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:19.350938" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:19.350460" elapsed="0.000513"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:27:19.351363" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:27:19.351655" 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-10-16T01:27:19.351202" elapsed="0.000490"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:19.352414" 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-10-16T01:27:19.351989" elapsed="0.000490"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:19.353549" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:19.353178" elapsed="0.000413"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:27:19.354079" 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-10-16T01:27:19.353813" 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-10-16T01:27:19.354388" elapsed="0.000020"/>
</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-10-16T01:27:19.354572" elapsed="0.000022"/>
</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-10-16T01:27:19.354781" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:27:19.354257" elapsed="0.000578"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:27:19.354147" elapsed="0.000717"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:27:19.354904" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:27:19.355035" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:27:19.352840" elapsed="0.002218"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:19.352549" elapsed="0.002537"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:19.355258" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:19.355113" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:19.352531" elapsed="0.002796"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:27:19.355904" 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-10-16T01:27:19.355481" elapsed="0.000449"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:27:19.355973" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:27:19.347753" elapsed="0.008320"/>
</kw>
<msg time="2026-10-16T01:27:19.356121" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:19.342035" elapsed="0.014132"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:19.360058" elapsed="0.000031"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:19.364198" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:19.368058" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:19.368236" elapsed="0.000019"/>
</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-10-16T01:27:19.368411" elapsed="0.000019"/>
</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-10-16T01:27:19.368827" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:19.368604" elapsed="0.000277"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:19.368591" elapsed="0.000313"/>
</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-10-16T01:27:19.369056" elapsed="0.000019"/>
</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-10-16T01:27:19.369231" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:19.369391" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:27:19.368565" elapsed="0.000874"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:27:19.368476" elapsed="0.000986"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:19.369623" elapsed="0.000035"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:19.369723" elapsed="0.000016"/>
</return>
<msg time="2026-10-16T01:27:19.369831" 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-10-16T01:27:19.341172" elapsed="0.028683"/>
</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-10-16T01:27:19.370963" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:19.370769" elapsed="0.000255">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:19.371107" 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-10-16T01:27:19.370420" elapsed="0.000709"/>
</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-10-16T01:27:19.371409" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:19.371192" elapsed="0.000269"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:27:19.371933" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:19.371654" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:19.371483" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:19.371175" elapsed="0.000834"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:19.372503" 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-10-16T01:27:19.372167" elapsed="0.000361"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:27:19.372573" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:27:19.372734" 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-manganese/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-10-16T01:27:19.370117" elapsed="0.002642"/>
</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-10-16T01:27:19.373833" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:19.373614" elapsed="0.000278">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:19.373975" 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-10-16T01:27:19.373300" elapsed="0.000698"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:27:19.374159" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:27:19.374061" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:19.374044" elapsed="0.000192"/>
</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-10-16T01:27:19.374385" elapsed="0.000019"/>
</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-10-16T01:27:19.374555" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:19.374615" elapsed="0.000013"/>
</return>
<msg time="2026-10-16T01:27:19.374770" 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-manganese/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-10-16T01:27:19.373005" elapsed="0.001829"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:19.376252" 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-10-16T01:27:19.376025" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:19.376731" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:19.376483" 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-10-16T01:27:19.380663" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:27:19.380735" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:27:19.380835" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:19.377059" elapsed="0.004137">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:19.376835" elapsed="0.004439">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:19.381453" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:19.381304" elapsed="0.000207"/>
</branch>
<status status="FAIL" start="2026-10-16T01:27:19.376818" elapsed="0.004715">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:19.381902" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:19.382021" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:19.381988" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:19.381972" elapsed="0.000107"/>
</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-10-16T01:27:19.382215" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:27:19.382278" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:27:19.375294" elapsed="0.007085">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:19.382447" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:27:19.331309" elapsed="0.051264">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:27:19.383002" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:19.382781" elapsed="0.000303"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:19.382731" elapsed="0.000393"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:19.383207" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:27:19.329188" elapsed="0.054185">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:19.326653" elapsed="0.056854">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:27:19.326610" elapsed="0.056973">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:19.383867" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:27:19.384214" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:19.384521" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:27:19.384906" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:27:19.385330" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:19.385656" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:19.386029" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:27:19.386263" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:27:19.319345" elapsed="0.067020">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:27:19.386427" elapsed="0.000014"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:27:19.317474" elapsed="0.069042">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:19.386775" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:19.386596" elapsed="0.000232"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:19.386990" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:19.386850" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:19.387203" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:19.387061" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:19.386580" elapsed="0.000691"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:27:19.317144" elapsed="0.070165">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:27:19.316764" elapsed="0.070597">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:19.387409" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:27:19.308264" elapsed="0.079237">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:19.387690" elapsed="0.000145"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:19.388042" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:19.387898" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:19.387882" elapsed="0.000228"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:19.388235" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:19.388404" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:19.388462" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:27:19.306611" elapsed="0.081981">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:27:19.306162" elapsed="0.082568">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:27:19.305920" elapsed="0.082863">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:27:19.305112" elapsed="0.083754">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:19.389080" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:27:19.283673" elapsed="0.105513">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:27:20.407959" elapsed="0.000393"/>
</kw>
<msg time="2026-10-16T01:27:20.408461" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:20.406685" elapsed="0.001888"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:27:20.405781" elapsed="0.003001"/>
</kw>
<msg time="2026-10-16T01:27:20.408876" 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-10-16T01:27:20.399205" elapsed="0.009763"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:27:20.398323" elapsed="0.010793"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:20.410155" 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-10-16T01:27:20.409589" elapsed="0.000658"/>
</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-10-16T01:27:20.416859" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:20.416073" elapsed="0.000844"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:20.417898" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:20.417247" elapsed="0.000706"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:20.418045" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:27:20.418329" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:20.415247" elapsed="0.003132"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:27:20.418758" elapsed="0.000291"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:20.420130" 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-10-16T01:27:20.419414" elapsed="0.000771"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:20.421089" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:20.420510" elapsed="0.000632"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:20.422004" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:20.421453" elapsed="0.000604"/>
</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-10-16T01:27:20.430660" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:27:20.429305" elapsed="0.001614"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:27:20.431051" elapsed="0.000133"/>
</return>
<msg time="2026-10-16T01:27:20.431603" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:27:20.426034" elapsed="0.005756"/>
</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-10-16T01:27:20.455084" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:20.454621" elapsed="0.000499"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:27:20.456109" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:27:20.455814" elapsed="0.000388">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:20.456319" 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-10-16T01:27:20.455334" elapsed="0.001017"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:20.457078" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:20.456584" elapsed="0.000530"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:27:20.457495" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:27:20.457731" 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-10-16T01:27:20.457340" elapsed="0.000425"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:20.458338" 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-10-16T01:27:20.458031" elapsed="0.000364"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:20.459832" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:20.459571" elapsed="0.000302"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:27:20.460303" 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-10-16T01:27:20.460048" elapsed="0.000279"/>
</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-10-16T01:27:20.460607" 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-10-16T01:27:20.460820" 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-10-16T01:27:20.461000" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:27:20.460480" elapsed="0.000571"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:27:20.460370" elapsed="0.000710"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:27:20.461120" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:27:20.461253" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:27:20.459040" elapsed="0.002236"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:20.458479" elapsed="0.002826"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:20.461472" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:20.461329" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:20.458455" elapsed="0.003086"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:27:20.462114" 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-10-16T01:27:20.461724" elapsed="0.000415"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:27:20.462182" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:27:20.453927" elapsed="0.008353"/>
</kw>
<msg time="2026-10-16T01:27:20.462371" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:20.448239" elapsed="0.014181"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:20.466247" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:20.470538" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:20.474342" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:20.474518" elapsed="0.000020"/>
</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-10-16T01:27:20.474722" 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-10-16T01:27:20.475063" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:20.474922" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:20.474907" 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-10-16T01:27:20.475289" elapsed="0.000019"/>
</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-10-16T01:27:20.475465" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:20.475623" elapsed="0.000031"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:27:20.474881" elapsed="0.000804"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:27:20.474791" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:20.475875" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:20.475944" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:27:20.476050" 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-10-16T01:27:20.447388" elapsed="0.028685"/>
</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-10-16T01:27:20.477191" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:20.476998" elapsed="0.000257">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:20.477337" 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-10-16T01:27:20.476657" elapsed="0.000703"/>
</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-10-16T01:27:20.477661" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:20.477423" elapsed="0.000341"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:27:20.478217" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:20.477952" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:20.477789" elapsed="0.000485"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:20.477407" elapsed="0.000887"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:20.478820" 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-10-16T01:27:20.478452" elapsed="0.000392"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:27:20.478890" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:27:20.479013" 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-manganese/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-10-16T01:27:20.476339" elapsed="0.002696"/>
</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-10-16T01:27:20.480116" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:20.479928" elapsed="0.000248">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:20.480260" 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-10-16T01:27:20.479578" elapsed="0.000706"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:27:20.480609" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:27:20.480505" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:20.480330" elapsed="0.000386"/>
</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-10-16T01:27:20.480869" 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-10-16T01:27:20.481042" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:20.481102" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:27:20.481227" 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-manganese/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-10-16T01:27:20.479280" elapsed="0.001970"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:20.482474" 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-10-16T01:27:20.482250" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:20.482950" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:20.482731" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:27:20.487055" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:27:20.487109" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:27:20.487222" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:20.483276" elapsed="0.004502">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:20.483051" elapsed="0.004836">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:20.488137" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:20.487929" elapsed="0.000289"/>
</branch>
<status status="FAIL" start="2026-10-16T01:27:20.483034" elapsed="0.005214">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:20.488749" elapsed="0.000034"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:20.488966" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:20.488918" elapsed="0.000101"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:20.488894" elapsed="0.000153"/>
</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-10-16T01:27:20.489238" elapsed="0.000028"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:27:20.489327" elapsed="0.000019"/>
</return>
<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="FAIL" start="2026-10-16T01:27:20.481524" elapsed="0.007945">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:20.489564" elapsed="0.000021"/>
</return>
<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="FAIL" start="2026-10-16T01:27:20.437769" elapsed="0.052013">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:27:20.490325" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:20.490020" elapsed="0.000419"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:20.489953" elapsed="0.000543"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:20.490613" elapsed="0.000071"/>
</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="FAIL" start="2026-10-16T01:27:20.435602" elapsed="0.055293">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:20.432244" elapsed="0.058790">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:27:20.432200" elapsed="0.058939">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:20.491485" elapsed="0.000034"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:27:20.492011" elapsed="0.000029"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:20.492444" elapsed="0.000028"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:27:20.492980" elapsed="0.000031"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:27:20.493620" elapsed="0.000036"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:20.493980" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:20.494325" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:27:20.494563" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:27:20.424698" elapsed="0.069981">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:27:20.494763" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:27:20.422895" elapsed="0.071958">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:20.495074" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:20.494933" elapsed="0.000191"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:20.495316" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:20.495146" elapsed="0.000221"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:20.495530" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:20.495389" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:20.494917" elapsed="0.000681"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:27:20.422515" elapsed="0.073134">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:27:20.422150" elapsed="0.073618">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:20.495821" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:27:20.413895" elapsed="0.082019">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:20.496089" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:20.496315" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:20.496167" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:20.496152" elapsed="0.000231"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:20.496508" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:20.496693" elapsed="0.000090"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:20.496825" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:27:20.412222" elapsed="0.084696">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:27:20.411778" elapsed="0.085201">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:27:20.411483" elapsed="0.085545">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:27:20.410740" elapsed="0.086368">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:20.497316" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:27:20.389921" elapsed="0.107500">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:27:21.518900" elapsed="0.000394"/>
</kw>
<msg time="2026-10-16T01:27:21.519405" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:21.517610" elapsed="0.001908"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:27:21.516727" elapsed="0.002964"/>
</kw>
<msg time="2026-10-16T01:27:21.519814" 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-10-16T01:27:21.510258" elapsed="0.009647"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:27:21.509377" elapsed="0.010675"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:21.521181" 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-10-16T01:27:21.520614" elapsed="0.000659"/>
</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-10-16T01:27:21.527776" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:21.526990" elapsed="0.000846"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:21.528823" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:21.528167" elapsed="0.000711"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:21.528973" elapsed="0.000060"/>
</return>
<msg time="2026-10-16T01:27:21.529257" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:21.526174" elapsed="0.003134"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:27:21.529654" elapsed="0.000317"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:21.531046" 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-10-16T01:27:21.530336" elapsed="0.000765"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:21.531978" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:21.531423" elapsed="0.000608"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:21.532884" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:21.532343" elapsed="0.000594"/>
</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-10-16T01:27:21.541503" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:27:21.540167" elapsed="0.001444"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:27:21.541832" elapsed="0.000135"/>
</return>
<msg time="2026-10-16T01:27:21.542398" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:27:21.536956" elapsed="0.005521"/>
</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-10-16T01:27:21.565211" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:21.564782" elapsed="0.000466"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:27:21.566237" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:27:21.565948" elapsed="0.000383">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:21.566449" 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-10-16T01:27:21.565465" elapsed="0.001015"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:21.567191" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:21.566751" elapsed="0.000476"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:27:21.567607" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:27:21.567841" 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-10-16T01:27:21.567453" elapsed="0.000421"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:21.568450" 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-10-16T01:27:21.568141" elapsed="0.000366"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:21.569803" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:21.569513" elapsed="0.000331"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:27:21.570719" 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-10-16T01:27:21.570039" elapsed="0.000707"/>
</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-10-16T01:27:21.571037" elapsed="0.000020"/>
</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-10-16T01:27:21.571221" 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-10-16T01:27:21.571400" elapsed="0.000019"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:27:21.570905" elapsed="0.000547"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:27:21.570792" elapsed="0.000687"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:27:21.571520" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:27:21.571666" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:27:21.568982" elapsed="0.002708"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:21.568593" elapsed="0.003142"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:21.571906" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:21.571761" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:21.568569" elapsed="0.003407"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:27:21.572519" 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-10-16T01:27:21.572129" elapsed="0.000415"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:27:21.572589" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:27:21.564034" elapsed="0.008685"/>
</kw>
<msg time="2026-10-16T01:27:21.572768" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:21.558275" elapsed="0.014541"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:21.576690" elapsed="0.000051"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:21.580785" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:21.584600" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:21.584806" 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-10-16T01:27:21.584985" 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-10-16T01:27:21.585326" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:21.585183" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:21.585169" 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-10-16T01:27:21.585553" elapsed="0.000019"/>
</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-10-16T01:27:21.585757" 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-10-16T01:27:21.585964" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:27:21.585143" elapsed="0.000871"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:27:21.585052" elapsed="0.000986"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:21.586188" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:21.586256" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:27:21.586360" 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-10-16T01:27:21.557408" elapsed="0.028976"/>
</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-10-16T01:27:21.587502" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:21.587302" elapsed="0.000260">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:21.587660" 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-10-16T01:27:21.586977" elapsed="0.000707"/>
</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-10-16T01:27:21.587982" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:21.587764" elapsed="0.000271"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:27:21.588483" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:21.588217" elapsed="0.000291"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:21.588058" elapsed="0.000483"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:21.587747" elapsed="0.000814"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:21.589086" 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-10-16T01:27:21.588747" elapsed="0.000363"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:27:21.589155" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:27:21.589280" 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-manganese/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-10-16T01:27:21.586661" elapsed="0.002642"/>
</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-10-16T01:27:21.590389" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:21.590192" elapsed="0.000255">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:21.590530" 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-10-16T01:27:21.589874" elapsed="0.000678"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:27:21.590746" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:27:21.590616" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:21.590600" elapsed="0.000224"/>
</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-10-16T01:27:21.590973" elapsed="0.000020"/>
</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-10-16T01:27:21.591143" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:21.591203" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:27:21.591327" 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-manganese/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-10-16T01:27:21.589547" elapsed="0.001803"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:21.592786" 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-10-16T01:27:21.592528" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:21.593283" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:21.593057" elapsed="0.000270"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:27:21.597080" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:27:21.597134" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:27:21.597239" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:21.593612" elapsed="0.003975">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:21.593388" elapsed="0.004289">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:21.597879" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:21.597727" elapsed="0.000212"/>
</branch>
<status status="FAIL" start="2026-10-16T01:27:21.593371" elapsed="0.004591">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:21.598295" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:21.598417" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:21.598383" elapsed="0.000073"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:21.598366" elapsed="0.000111"/>
</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-10-16T01:27:21.598614" elapsed="0.000033"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:27:21.598692" elapsed="0.000030"/>
</return>
<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="FAIL" start="2026-10-16T01:27:21.591621" elapsed="0.007191">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:21.598881" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:27:21.547435" elapsed="0.051576">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:27:21.599402" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:21.599180" elapsed="0.000307"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:21.599132" elapsed="0.000398"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:21.599616" elapsed="0.000051"/>
</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="FAIL" start="2026-10-16T01:27:21.545279" elapsed="0.054542">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:21.542804" elapsed="0.057119">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:27:21.542776" elapsed="0.057221">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:21.600248" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:27:21.600627" elapsed="0.000034"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:21.600972" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:27:21.601326" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:27:21.601797" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:21.602118" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:21.602465" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:27:21.602757" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:27:21.535531" elapsed="0.067330">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:27:21.602923" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:27:21.533780" elapsed="0.069232">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:21.603234" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:21.603092" elapsed="0.000193"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:21.603445" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:21.603308" elapsed="0.000187"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:21.603670" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:21.603517" elapsed="0.000223"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:21.603076" elapsed="0.000687"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:27:21.533399" elapsed="0.070403">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:27:21.533030" elapsed="0.070825">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:21.603904" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:27:21.524841" elapsed="0.079154">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:21.604166" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:21.604386" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:21.604244" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:21.604229" elapsed="0.000225"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:21.604580" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:21.604875" elapsed="0.000020"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:21.604936" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:27:21.523244" elapsed="0.081785">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:27:21.522801" elapsed="0.082290">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:27:21.522507" elapsed="0.082668">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:27:21.521765" elapsed="0.083493">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:21.605473" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:27:21.498074" elapsed="0.107504">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:27:22.624162" elapsed="0.000396"/>
</kw>
<msg time="2026-10-16T01:27:22.624690" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:22.622921" elapsed="0.001911"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:27:22.621981" elapsed="0.003011"/>
</kw>
<msg time="2026-10-16T01:27:22.625083" 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-10-16T01:27:22.615405" elapsed="0.009767"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:27:22.614530" elapsed="0.010790"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:22.626360" 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-10-16T01:27:22.625841" elapsed="0.000613"/>
</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-10-16T01:27:22.633039" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:22.632247" elapsed="0.000851"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:22.634110" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:22.633435" elapsed="0.000729"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:22.634259" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:27:22.634544" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:22.631404" elapsed="0.003191"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:27:22.634982" elapsed="0.000292"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:22.636376" 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-10-16T01:27:22.635668" elapsed="0.000765"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:22.637332" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:22.636818" elapsed="0.000568"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:22.638270" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:22.637760" elapsed="0.000563"/>
</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-10-16T01:27:22.647055" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:27:22.645599" elapsed="0.001563"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:27:22.647290" elapsed="0.000131"/>
</return>
<msg time="2026-10-16T01:27:22.647917" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:27:22.642389" elapsed="0.005654"/>
</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-10-16T01:27:22.671954" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:22.671478" elapsed="0.000512"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:27:22.673041" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:27:22.672717" elapsed="0.000418">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:22.673255" 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-10-16T01:27:22.672230" elapsed="0.001056"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:22.674029" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:22.673525" elapsed="0.000539"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:27:22.674454" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:27:22.674983" 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-10-16T01:27:22.674295" elapsed="0.000724"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:22.675601" 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-10-16T01:27:22.675290" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:22.677181" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:22.676602" elapsed="0.000638"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:27:22.677991" 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-10-16T01:27:22.677491" elapsed="0.000535"/>
</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-10-16T01:27:22.678420" elapsed="0.000028"/>
</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-10-16T01:27:22.678694" elapsed="0.000050"/>
</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-10-16T01:27:22.678969" elapsed="0.000028"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:27:22.678240" elapsed="0.000801"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:27:22.678088" elapsed="0.000991"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:27:22.679136" elapsed="0.000036"/>
</return>
<msg time="2026-10-16T01:27:22.679316" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:27:22.676132" elapsed="0.003216"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:22.675786" elapsed="0.003601"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:22.679623" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:22.679421" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:22.675761" elapsed="0.004016"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:27:22.680540" 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-10-16T01:27:22.679995" elapsed="0.000581"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:27:22.680660" elapsed="0.000057"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:27:22.670780" elapsed="0.010044"/>
</kw>
<msg time="2026-10-16T01:27:22.681000" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:22.665061" elapsed="0.016009"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:22.686756" elapsed="0.000037"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:22.692150" elapsed="0.000035"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:22.697463" elapsed="0.000035"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:22.697744" elapsed="0.000029"/>
</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-10-16T01:27:22.697997" elapsed="0.000027"/>
</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-10-16T01:27:22.698469" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:22.698272" elapsed="0.000268"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:22.698254" elapsed="0.000318"/>
</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-10-16T01:27:22.698824" 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-10-16T01:27:22.699075" elapsed="0.000027"/>
</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-10-16T01:27:22.699299" elapsed="0.000027"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:27:22.698217" elapsed="0.001150"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:27:22.698092" elapsed="0.001308"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:22.699611" elapsed="0.000044"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:22.699744" elapsed="0.000022"/>
</return>
<msg time="2026-10-16T01:27:22.699892" 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-10-16T01:27:22.664135" elapsed="0.035790"/>
</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-10-16T01:27:22.701463" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:22.701186" elapsed="0.000360">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:22.701682" 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-10-16T01:27:22.700734" elapsed="0.001001"/>
</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-10-16T01:27:22.702127" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:22.701826" elapsed="0.000374"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:27:22.702858" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:22.702451" elapsed="0.000441"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:22.702232" elapsed="0.000706"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:22.701803" elapsed="0.001163"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:22.703673" 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-10-16T01:27:22.703186" elapsed="0.000592"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:27:22.703847" elapsed="0.000037"/>
</return>
<msg time="2026-10-16T01:27:22.704023" 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-manganese/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-10-16T01:27:22.700287" elapsed="0.003769"/>
</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-10-16T01:27:22.705571" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:22.705294" elapsed="0.000377">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:22.705812" 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-10-16T01:27:22.704849" elapsed="0.000995"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:27:22.706068" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-10-16T01:27:22.705932" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:22.705909" elapsed="0.000266"/>
</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-10-16T01:27:22.706382" elapsed="0.000029"/>
</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-10-16T01:27:22.706622" elapsed="0.000046"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:22.706747" elapsed="0.000021"/>
</return>
<msg time="2026-10-16T01:27:22.706922" 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-manganese/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-10-16T01:27:22.704394" elapsed="0.002561"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:22.708592" 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-10-16T01:27:22.708367" elapsed="0.000281"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:22.709073" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:22.708852" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:27:22.713339" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:27:22.713392" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:27:22.713490" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:22.709400" elapsed="0.004474">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:22.709173" elapsed="0.004779">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:22.714135" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:22.713983" elapsed="0.000212"/>
</branch>
<status status="FAIL" start="2026-10-16T01:27:22.709157" elapsed="0.005060">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:22.714553" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:22.714689" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:22.714655" elapsed="0.000089"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:22.714624" elapsed="0.000141"/>
</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-10-16T01:27:22.714901" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:27:22.714994" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:27:22.707654" elapsed="0.007444">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:22.715166" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:27:22.654408" elapsed="0.060884">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:27:22.715694" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:22.715460" elapsed="0.000341"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:22.715412" elapsed="0.000430"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:22.715925" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:27:22.652292" elapsed="0.063798">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:22.648492" elapsed="0.067697">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:27:22.648450" elapsed="0.067812">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:22.716506" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:27:22.716886" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:22.717197" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:27:22.717545" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:27:22.718002" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:22.718317" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:22.718681" elapsed="0.000042"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:27:22.718944" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:27:22.641072" elapsed="0.077974">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:27:22.719108" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:27:22.639181" elapsed="0.080015">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:22.719415" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:22.719275" elapsed="0.000191"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:22.719626" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:22.719489" elapsed="0.000200"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:22.719882" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:22.719739" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:22.719259" elapsed="0.000722"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:27:22.638850" elapsed="0.081172">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:27:22.638419" elapsed="0.081657">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:22.720123" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:27:22.630052" elapsed="0.090164">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:22.720393" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:22.720612" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:22.720472" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:22.720456" elapsed="0.000238"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:22.720845" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:22.721015" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:22.721074" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:27:22.628428" elapsed="0.092739">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:27:22.627989" elapsed="0.093240">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:27:22.627741" elapsed="0.093539">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:27:22.626951" elapsed="0.094414">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:22.721573" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:27:22.606195" elapsed="0.115499">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:27:23.746355" elapsed="0.000485"/>
</kw>
<msg time="2026-10-16T01:27:23.746963" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:23.744992" elapsed="0.002108"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:27:23.743966" elapsed="0.003338"/>
</kw>
<msg time="2026-10-16T01:27:23.747402" 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-10-16T01:27:23.736481" elapsed="0.011020"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:27:23.735057" elapsed="0.012626"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:23.748841" 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-10-16T01:27:23.748239" elapsed="0.000702"/>
</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-10-16T01:27:23.756286" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:23.755405" elapsed="0.000939"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:23.757323" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:23.756724" elapsed="0.000652"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:23.757472" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:27:23.757811" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:23.754442" elapsed="0.003421"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:27:23.758192" elapsed="0.000282"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:23.759545" 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-10-16T01:27:23.758884" elapsed="0.000715"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:23.760519" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:23.759971" elapsed="0.000601"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:23.761431" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:23.760933" elapsed="0.000550"/>
</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-10-16T01:27:23.770311" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:27:23.769151" elapsed="0.001267"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:27:23.770544" elapsed="0.000148"/>
</return>
<msg time="2026-10-16T01:27:23.771115" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:27:23.765511" elapsed="0.005723"/>
</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-10-16T01:27:23.797409" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:23.796951" elapsed="0.000499"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:27:23.798657" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:27:23.798312" elapsed="0.000470">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:23.798947" 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-10-16T01:27:23.797829" elapsed="0.001153"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:23.799738" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:23.799236" elapsed="0.000541"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:27:23.800186" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:27:23.800655" 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-10-16T01:27:23.800015" elapsed="0.000678"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:23.801332" 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-10-16T01:27:23.801002" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:23.802978" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:23.802598" elapsed="0.000442"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:27:23.803690" 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-10-16T01:27:23.803297" elapsed="0.000449"/>
</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-10-16T01:27:23.804185" elapsed="0.000030"/>
</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-10-16T01:27:23.804452" elapsed="0.000032"/>
</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-10-16T01:27:23.804843" elapsed="0.000031"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:27:23.803992" elapsed="0.000931"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:27:23.803817" elapsed="0.001149"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:27:23.805028" elapsed="0.000042"/>
</return>
<msg time="2026-10-16T01:27:23.805226" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:27:23.802097" elapsed="0.003163"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:23.801488" elapsed="0.003816"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:23.805555" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:23.805341" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:23.801461" elapsed="0.004216"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:27:23.806495" 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-10-16T01:27:23.805929" elapsed="0.000604"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:27:23.806597" elapsed="0.000053"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:27:23.796172" elapsed="0.010609"/>
</kw>
<msg time="2026-10-16T01:27:23.806853" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:23.789947" elapsed="0.016974"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:23.812755" elapsed="0.000037"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:23.818359" elapsed="0.000037"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:23.823917" elapsed="0.000035"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:23.824165" 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-10-16T01:27:23.824447" elapsed="0.000032"/>
</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-10-16T01:27:23.824902" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:23.824759" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:23.824746" elapsed="0.000229"/>
</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-10-16T01:27:23.825127" elapsed="0.000019"/>
</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-10-16T01:27:23.825301" elapsed="0.000018"/>
</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-10-16T01:27:23.825460" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:27:23.824718" elapsed="0.000789"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:27:23.824562" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:23.825744" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:23.825814" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:27:23.825918" 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-10-16T01:27:23.789011" elapsed="0.036930"/>
</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-10-16T01:27:23.827055" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:23.826864" elapsed="0.000251">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:23.827196" 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-10-16T01:27:23.826507" elapsed="0.000712"/>
</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-10-16T01:27:23.827501" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:23.827281" elapsed="0.000272"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:27:23.828045" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:23.827781" elapsed="0.000288"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:23.827576" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:23.827264" elapsed="0.000857"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:23.828615" 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-10-16T01:27:23.828277" elapsed="0.000373"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:27:23.828710" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:27:23.828836" 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-manganese/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-10-16T01:27:23.826206" elapsed="0.002653"/>
</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-10-16T01:27:23.829942" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:23.829752" elapsed="0.000248">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:23.830083" 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-10-16T01:27:23.829398" elapsed="0.000708"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:27:23.830427" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:27:23.830324" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:23.830152" elapsed="0.000352"/>
</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-10-16T01:27:23.830670" 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-10-16T01:27:23.830862" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:23.830922" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:27:23.831047" 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-manganese/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-10-16T01:27:23.829104" elapsed="0.001966"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:23.832298" 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-10-16T01:27:23.832074" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:23.832799" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:23.832526" 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-10-16T01:27:23.836811" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:27:23.836894" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:27:23.836993" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:23.833122" elapsed="0.004221">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:23.832899" elapsed="0.004521">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:23.837603" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:23.837451" elapsed="0.000227"/>
</branch>
<status status="FAIL" start="2026-10-16T01:27:23.832882" elapsed="0.004833">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:23.838056" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:23.838176" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:23.838142" elapsed="0.000072"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:23.838127" elapsed="0.000107"/>
</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-10-16T01:27:23.838376" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:27:23.838439" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:27:23.831347" elapsed="0.007194">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:23.838609" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:27:23.778171" elapsed="0.060601">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:27:23.839159" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:23.838941" elapsed="0.000299"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:23.838893" elapsed="0.000387"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:23.839364" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:27:23.775372" elapsed="0.064156">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:23.771661" elapsed="0.067965">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:27:23.771605" elapsed="0.068128">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:23.839983" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:27:23.840332" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:23.840653" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:27:23.841022" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:27:23.841482" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:23.841835" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:23.842182" elapsed="0.000019"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:27:23.842427" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:27:23.764192" elapsed="0.078335">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:27:23.842590" elapsed="0.000016"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:27:23.762324" elapsed="0.080429">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:23.842979" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:23.842840" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:23.843187" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:23.843050" elapsed="0.000203"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:23.843424" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:23.843277" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:23.842824" elapsed="0.000671"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:27:23.761999" elapsed="0.081535">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:27:23.761578" elapsed="0.082009">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:23.843673" elapsed="0.000016"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:27:23.752842" elapsed="0.091049">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:23.844114" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:23.844414" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:23.844215" elapsed="0.000261"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:23.844194" elapsed="0.000305"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:23.844644" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:23.844834" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:23.844893" elapsed="0.000013"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:27:23.751064" elapsed="0.093922">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:27:23.750533" elapsed="0.094515">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:27:23.750274" elapsed="0.094823">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:27:23.749420" elapsed="0.095760">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:23.845433" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:27:23.722564" elapsed="0.122976">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:27:24.867590" elapsed="0.000503"/>
</kw>
<msg time="2026-10-16T01:27:24.868209" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:24.866330" elapsed="0.001994"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:27:24.865342" elapsed="0.003140"/>
</kw>
<msg time="2026-10-16T01:27:24.868571" 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-10-16T01:27:24.858744" elapsed="0.009941"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:27:24.857788" elapsed="0.011079"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:24.869911" 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-10-16T01:27:24.869344" elapsed="0.000659"/>
</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-10-16T01:27:24.876494" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:24.875755" elapsed="0.000795"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:24.877573" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:24.876972" elapsed="0.000676"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:24.877771" elapsed="0.000063"/>
</return>
<msg time="2026-10-16T01:27:24.878061" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:24.874918" elapsed="0.003195"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:27:24.878437" elapsed="0.000374"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:24.879911" 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-10-16T01:27:24.879179" elapsed="0.000787"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:24.880844" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:24.880291" elapsed="0.000607"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:24.881748" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:24.881203" elapsed="0.000601"/>
</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-10-16T01:27:24.890558" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:27:24.889357" elapsed="0.001292"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:27:24.890763" elapsed="0.000119"/>
</return>
<msg time="2026-10-16T01:27:24.891156" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:27:24.885901" elapsed="0.005334"/>
</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-10-16T01:27:24.914651" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:24.914207" elapsed="0.000482"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:27:24.915855" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:27:24.915493" elapsed="0.000463">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:24.916075" 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-10-16T01:27:24.915013" elapsed="0.001094"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:24.916824" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:24.916345" elapsed="0.000516"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:27:24.917250" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:27:24.917506" 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-10-16T01:27:24.917089" elapsed="0.000452"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:24.918165" 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-10-16T01:27:24.917853" elapsed="0.000369"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:24.919483" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:24.919164" elapsed="0.000377"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:27:24.920371" 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-10-16T01:27:24.919816" elapsed="0.000590"/>
</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-10-16T01:27:24.920859" elapsed="0.000030"/>
</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-10-16T01:27:24.921116" elapsed="0.000032"/>
</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-10-16T01:27:24.921368" elapsed="0.000027"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:27:24.920619" elapsed="0.000822"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:27:24.920467" elapsed="0.001014"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:27:24.921538" elapsed="0.000036"/>
</return>
<msg time="2026-10-16T01:27:24.921758" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:27:24.918673" elapsed="0.003118"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:24.918307" elapsed="0.003525"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:24.922066" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:24.921866" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:24.918283" elapsed="0.003880"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:27:24.922981" 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-10-16T01:27:24.922374" elapsed="0.000643"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:27:24.923079" elapsed="0.000037"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:27:24.913470" elapsed="0.009749"/>
</kw>
<msg time="2026-10-16T01:27:24.923284" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:24.907466" elapsed="0.015883"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:24.928935" elapsed="0.000036"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:24.933683" 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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:24.937562" elapsed="0.000026"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:24.937769" elapsed="0.000020"/>
</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-10-16T01:27:24.937950" elapsed="0.000019"/>
</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-10-16T01:27:24.938290" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:24.938149" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:24.938135" elapsed="0.000228"/>
</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-10-16T01:27:24.938515" elapsed="0.000019"/>
</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-10-16T01:27:24.938718" 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-10-16T01:27:24.938885" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:27:24.938109" elapsed="0.000825"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:27:24.938019" 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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:24.939107" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:24.939174" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:27:24.939279" 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-10-16T01:27:24.906606" elapsed="0.032697"/>
</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-10-16T01:27:24.940412" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:24.940219" elapsed="0.000253">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:24.940554" 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-10-16T01:27:24.939895" elapsed="0.000682"/>
</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-10-16T01:27:24.940888" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:24.940654" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:27:24.941386" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:24.941123" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:24.940964" elapsed="0.000480"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:24.940624" elapsed="0.000840"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:24.941994" 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-10-16T01:27:24.941621" elapsed="0.000398"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:27:24.942065" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:27:24.942188" 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-manganese/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-10-16T01:27:24.939564" elapsed="0.002647"/>
</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-10-16T01:27:24.943343" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:24.943154" elapsed="0.000247">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:24.943485" 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-10-16T01:27:24.942834" elapsed="0.000674"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:27:24.943685" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-10-16T01:27:24.943572" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:24.943555" elapsed="0.000223"/>
</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-10-16T01:27:24.943930" elapsed="0.000020"/>
</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-10-16T01:27:24.944101" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:24.944161" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:27:24.944286" 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-manganese/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-10-16T01:27:24.942490" elapsed="0.001820"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:24.945756" 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-10-16T01:27:24.945499" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:24.946220" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:24.946000" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:27:24.950365" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:27:24.950423" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:27:24.950529" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:24.946543" elapsed="0.004376">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:24.946320" elapsed="0.004679">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:24.951186" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:24.951031" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-10-16T01:27:24.946303" elapsed="0.004966">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:24.951611" elapsed="0.000042"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:24.951769" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:24.951734" elapsed="0.000074"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:24.951717" elapsed="0.000111"/>
</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-10-16T01:27:24.951966" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:27:24.952029" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:27:24.944581" elapsed="0.007551">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:24.952233" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:27:24.896425" elapsed="0.055955">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:27:24.952810" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:24.952551" elapsed="0.000344"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:24.952501" elapsed="0.000436"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:24.953022" elapsed="0.000037"/>
</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="FAIL" start="2026-10-16T01:27:24.894099" elapsed="0.059089">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:24.891525" elapsed="0.061763">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:27:24.891497" elapsed="0.061864">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:24.953610" elapsed="0.000057"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:27:24.954022" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:24.954334" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:27:24.954718" elapsed="0.000024"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:27:24.955147" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:24.955456" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:24.955868" elapsed="0.000021"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:27:24.956103" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:27:24.884458" elapsed="0.071747">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:27:24.956266" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:27:24.882594" elapsed="0.073761">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:24.956578" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:24.956436" elapsed="0.000206"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:24.956827" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:24.956666" elapsed="0.000211"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:24.957040" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:24.956898" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:24.956420" elapsed="0.000689"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:27:24.882269" elapsed="0.074878">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:27:24.881900" elapsed="0.075300">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:24.957247" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:27:24.873525" elapsed="0.083854">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:24.957558" elapsed="0.000020"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:24.957874" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:24.957654" elapsed="0.000270"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:24.957622" elapsed="0.000325"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:24.958074" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:24.958242" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:24.958301" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:27:24.871978" elapsed="0.086417">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:27:24.871479" elapsed="0.086979">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:27:24.871239" elapsed="0.087267">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:27:24.870445" elapsed="0.088143">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:24.958886" elapsed="0.000024"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:27:24.846297" elapsed="0.112698">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:27:25.977861" elapsed="0.000403"/>
</kw>
<msg time="2026-10-16T01:27:25.978376" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:25.976509" elapsed="0.001979"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:27:25.975526" elapsed="0.003150"/>
</kw>
<msg time="2026-10-16T01:27:25.978803" 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-10-16T01:27:25.968962" elapsed="0.009937"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:27:25.968054" elapsed="0.011002"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:25.980144" 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-10-16T01:27:25.979522" elapsed="0.000718"/>
</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-10-16T01:27:25.986961" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:25.986151" elapsed="0.000869"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:25.988028" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:25.987356" elapsed="0.000729"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:25.988267" elapsed="0.000066"/>
</return>
<msg time="2026-10-16T01:27:25.988565" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:25.985291" elapsed="0.003326"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:27:25.989004" elapsed="0.000290"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:25.990407" 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-10-16T01:27:25.989726" elapsed="0.000737"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:25.991390" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:25.990883" elapsed="0.000560"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:25.992356" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:25.991804" elapsed="0.000608"/>
</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-10-16T01:27:26.001330" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:27:25.999921" elapsed="0.001522"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:27:26.001569" elapsed="0.000231"/>
</return>
<msg time="2026-10-16T01:27:26.002235" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:27:25.996462" elapsed="0.005899"/>
</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-10-16T01:27:26.025856" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:26.025341" elapsed="0.000552"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:27:26.026874" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:27:26.026549" elapsed="0.000418">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:26.027084" 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-10-16T01:27:26.026110" elapsed="0.001006"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:26.027828" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:26.027359" elapsed="0.000504"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:27:26.028244" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:27:26.028492" 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-10-16T01:27:26.028088" elapsed="0.000438"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:26.029188" 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-10-16T01:27:26.028877" elapsed="0.000368"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:26.030730" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:26.030185" elapsed="0.000607"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:27:26.031388" 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-10-16T01:27:26.031034" elapsed="0.000388"/>
</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-10-16T01:27:26.031850" elapsed="0.000029"/>
</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-10-16T01:27:26.032106" 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-10-16T01:27:26.032358" elapsed="0.000027"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:27:26.031650" elapsed="0.000779"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:27:26.031482" elapsed="0.000984"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:27:26.032523" elapsed="0.000036"/>
</return>
<msg time="2026-10-16T01:27:26.032795" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:27:26.029714" elapsed="0.003115"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:26.029329" elapsed="0.003540"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:26.033104" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:26.032903" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:26.029305" elapsed="0.003898"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:27:26.033990" 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-10-16T01:27:26.033414" elapsed="0.000611"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:27:26.034087" elapsed="0.000038"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:27:26.024535" elapsed="0.009693"/>
</kw>
<msg time="2026-10-16T01:27:26.034293" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:26.018884" elapsed="0.015473"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:26.040024" elapsed="0.000035"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:26.045368" elapsed="0.000034"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:26.050730" elapsed="0.000035"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:26.050977" elapsed="0.000028"/>
</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-10-16T01:27:26.051223" elapsed="0.000026"/>
</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-10-16T01:27:26.051610" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:26.051470" elapsed="0.000205"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:26.051456" elapsed="0.000255"/>
</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-10-16T01:27:26.051865" elapsed="0.000019"/>
</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-10-16T01:27:26.052040" elapsed="0.000018"/>
</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-10-16T01:27:26.052197" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:27:26.051431" elapsed="0.000815"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:27:26.051315" elapsed="0.000954"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:26.052417" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:26.052484" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:27:26.052588" 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-10-16T01:27:26.018019" elapsed="0.034592"/>
</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-10-16T01:27:26.053781" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:26.053559" elapsed="0.000282">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:26.053924" 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-10-16T01:27:26.053234" elapsed="0.000712"/>
</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-10-16T01:27:26.054224" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:26.054010" elapsed="0.000266"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:27:26.054748" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:26.054456" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:26.054299" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:26.053993" elapsed="0.000831"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:26.055314" 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-10-16T01:27:26.054980" elapsed="0.000358"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:27:26.055384" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:27:26.055507" 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-manganese/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-10-16T01:27:26.052935" elapsed="0.002595"/>
</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-10-16T01:27:26.056604" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:26.056414" elapsed="0.000297">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:26.056798" 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-10-16T01:27:26.056099" elapsed="0.000721"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:27:26.056982" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:27:26.056884" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:26.056868" elapsed="0.000190"/>
</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-10-16T01:27:26.057206" elapsed="0.000019"/>
</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-10-16T01:27:26.057375" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:26.057433" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:27:26.057556" 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-manganese/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-10-16T01:27:26.055804" elapsed="0.001774"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:26.059009" 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-10-16T01:27:26.058781" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:26.059458" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:26.059238" elapsed="0.000260"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:27:26.063300" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:27:26.063353" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:27:26.063483" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:26.059813" elapsed="0.004041">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:26.059558" elapsed="0.004373">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:26.064112" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:26.063962" elapsed="0.000208"/>
</branch>
<status status="FAIL" start="2026-10-16T01:27:26.059541" elapsed="0.004651">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:26.064533" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:26.064666" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:26.064620" elapsed="0.000101"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:26.064604" elapsed="0.000139"/>
</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-10-16T01:27:26.064879" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:27:26.064943" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:27:26.058048" elapsed="0.006998">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:26.065114" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:27:26.007940" elapsed="0.057300">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:27:26.065648" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:26.065414" elapsed="0.000339"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:26.065362" elapsed="0.000432"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:26.065876" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:27:26.005796" elapsed="0.060247">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:26.002995" elapsed="0.063149">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:27:26.002840" elapsed="0.063376">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:26.066465" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:27:26.066840" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:26.067149" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:27:26.067499" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:27:26.067963" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:26.068273" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:26.068614" elapsed="0.000051"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:27:26.068940" elapsed="0.000019"/>
</return>
<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="FAIL" start="2026-10-16T01:27:25.995130" elapsed="0.073914">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:27:26.069107" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:27:25.993273" elapsed="0.075925">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:26.069433" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:26.069281" elapsed="0.000204"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:26.069660" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:26.069508" elapsed="0.000224"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:26.069900" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:26.069756" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:26.069264" elapsed="0.000706"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:27:25.992942" elapsed="0.077066">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:27:25.992509" elapsed="0.077553">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:26.070111" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:27:25.983908" elapsed="0.086294">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:26.070377" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:26.070594" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:26.070455" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:26.070440" elapsed="0.000235"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:26.070919" elapsed="0.000020"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:26.071089" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:26.071147" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:27:25.982252" elapsed="0.088988">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:27:25.981804" elapsed="0.089497">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:27:25.981500" elapsed="0.089850">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:27:25.980744" elapsed="0.090687">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:26.071650" elapsed="0.000023"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:27:25.959604" elapsed="0.112175">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:27:27.091170" elapsed="0.000396"/>
</kw>
<msg time="2026-10-16T01:27:27.091735" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:27.089870" elapsed="0.001987"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:27:27.088890" elapsed="0.003124"/>
</kw>
<msg time="2026-10-16T01:27:27.092105" 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-10-16T01:27:27.082283" elapsed="0.009910"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:27:27.081416" elapsed="0.010926"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:27.093458" 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-10-16T01:27:27.092944" elapsed="0.000616"/>
</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-10-16T01:27:27.100486" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:27.099755" elapsed="0.000788"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:27.101525" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:27.100923" elapsed="0.000655"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:27.101734" elapsed="0.000066"/>
</return>
<msg time="2026-10-16T01:27:27.102030" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:27.098922" elapsed="0.003158"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:27:27.102409" elapsed="0.000403"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:27.103928" 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-10-16T01:27:27.103178" elapsed="0.000806"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:27.104891" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:27.104306" elapsed="0.000638"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:27.106003" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:27.105246" elapsed="0.000811"/>
</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-10-16T01:27:27.114982" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:27:27.113502" elapsed="0.001592"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:27:27.115223" elapsed="0.000133"/>
</return>
<msg time="2026-10-16T01:27:27.116051" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:27:27.110142" elapsed="0.006036"/>
</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-10-16T01:27:27.147878" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:27.147414" elapsed="0.000500"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:27:27.148975" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:27:27.148602" elapsed="0.000473">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:27.149192" 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-10-16T01:27:27.148127" elapsed="0.001097"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:27.150028" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:27.149535" elapsed="0.000528"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:27:27.150446" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:27:27.150656" 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-10-16T01:27:27.150288" elapsed="0.000402"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:27.151283" 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-10-16T01:27:27.150978" elapsed="0.000362"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:27.152895" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:27.152461" elapsed="0.000491"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:27:27.153539" 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-10-16T01:27:27.153191" elapsed="0.000382"/>
</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-10-16T01:27:27.153998" elapsed="0.000028"/>
</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-10-16T01:27:27.154249" elapsed="0.000032"/>
</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-10-16T01:27:27.154499" elapsed="0.000027"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:27:27.153820" elapsed="0.000750"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:27:27.153649" elapsed="0.000963"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:27:27.154681" elapsed="0.000054"/>
</return>
<msg time="2026-10-16T01:27:27.154880" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:27:27.151979" elapsed="0.002933"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:27.151425" elapsed="0.003527"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:27.155185" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:27.154987" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:27.151401" elapsed="0.003882"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:27:27.156125" 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-10-16T01:27:27.155512" elapsed="0.000649"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:27:27.156222" elapsed="0.000036"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:27:27.146726" elapsed="0.009632"/>
</kw>
<msg time="2026-10-16T01:27:27.156425" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:27.140779" elapsed="0.015719"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:27.162055" elapsed="0.000035"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:27.166363" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:27.170213" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:27.170423" 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-10-16T01:27:27.170607" elapsed="0.000033"/>
</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-10-16T01:27:27.170975" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:27.170835" elapsed="0.000190"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:27.170821" elapsed="0.000227"/>
</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-10-16T01:27:27.171197" elapsed="0.000018"/>
</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-10-16T01:27:27.171370" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:27.171529" elapsed="0.000018"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:27:27.170794" elapsed="0.000782"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:27:27.170690" elapsed="0.000909"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:27.171775" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:27.171844" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:27:27.171947" 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-10-16T01:27:27.139859" elapsed="0.032112"/>
</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-10-16T01:27:27.173089" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:27.172899" elapsed="0.000250">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:27.173231" 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-10-16T01:27:27.172542" elapsed="0.000712"/>
</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-10-16T01:27:27.173536" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:27.173315" elapsed="0.000272"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:27:27.174065" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:27.173801" elapsed="0.000289"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:27.173610" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:27.173299" elapsed="0.000842"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:27.174651" 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-10-16T01:27:27.174298" elapsed="0.000379"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:27:27.174737" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:27:27.174862" 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-manganese/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-10-16T01:27:27.172241" elapsed="0.002643"/>
</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-10-16T01:27:27.175964" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:27.175775" elapsed="0.000248">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:27.176106" 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-10-16T01:27:27.175426" elapsed="0.000702"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:27:27.176494" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-10-16T01:27:27.176388" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:27.176219" elapsed="0.000370"/>
</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-10-16T01:27:27.176776" 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-10-16T01:27:27.176950" elapsed="0.000019"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:27.177010" elapsed="0.000014"/>
</return>
<msg time="2026-10-16T01:27:27.177135" 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-manganese/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-10-16T01:27:27.175130" elapsed="0.002028"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:27.178374" 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-10-16T01:27:27.178151" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:27.178847" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:27.178599" 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-10-16T01:27:27.182883" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:27:27.182936" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:27:27.183032" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:27.179166" elapsed="0.004216">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:27.178946" elapsed="0.004513">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:27.183656" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:27.183492" elapsed="0.000241"/>
</branch>
<status status="FAIL" start="2026-10-16T01:27:27.178930" elapsed="0.004825">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:27.184087" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:27.184207" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:27.184174" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:27.184157" elapsed="0.000108"/>
</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-10-16T01:27:27.184402" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:27:27.184465" elapsed="0.000013"/>
</return>
<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="FAIL" start="2026-10-16T01:27:27.177432" elapsed="0.007134">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:27.184644" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:27:27.124991" elapsed="0.059795">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:27:27.185174" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:27.184952" elapsed="0.000336"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:27.184905" elapsed="0.000423"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:27.185411" elapsed="0.000036"/>
</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="FAIL" start="2026-10-16T01:27:27.120877" elapsed="0.064700">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:27.116660" elapsed="0.069062">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:27:27.116594" elapsed="0.069204">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:27.186045" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:27:27.186394" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:27.186733" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:27:27.187081" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:27:27.187504" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:27.187852" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:27.188199" elapsed="0.000019"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:27:27.188437" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-10-16T01:27:27.108829" elapsed="0.079708">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:27:27.188599" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:27:27.106899" elapsed="0.081840">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:27.188962" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:27.188822" elapsed="0.000190"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:27.189171" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:27.189034" elapsed="0.000186"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:27.189382" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:27.189241" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:27.188806" elapsed="0.000645"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:27:27.106517" elapsed="0.082972">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:27:27.106152" elapsed="0.083390">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:27.189590" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:27:27.097462" elapsed="0.092270">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:27.189908" elapsed="0.000049"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:27.190161" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:27.190020" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:27.190004" elapsed="0.000228"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:27.190355" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:27.190524" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:27.190584" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:27:27.095848" elapsed="0.094950">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:27:27.095218" elapsed="0.095649">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:27:27.094975" elapsed="0.095941">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:27:27.094085" elapsed="0.096912">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:27.191204" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:27:27.072593" elapsed="0.118715">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:27:28.212458" elapsed="0.000898"/>
</kw>
<msg time="2026-10-16T01:27:28.213654" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:28.211208" elapsed="0.002594"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:27:28.210270" elapsed="0.003694"/>
</kw>
<msg time="2026-10-16T01:27:28.214054" 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-10-16T01:27:28.203769" elapsed="0.010375"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:27:28.202895" elapsed="0.011395"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:28.215359" 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-10-16T01:27:28.214842" elapsed="0.000610"/>
</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-10-16T01:27:28.222109" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:28.221324" elapsed="0.000842"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:28.223155" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:28.222493" elapsed="0.000716"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:28.223302" elapsed="0.000060"/>
</return>
<msg time="2026-10-16T01:27:28.223585" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:28.220481" elapsed="0.003176"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:27:28.224022" elapsed="0.000315"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:28.225689" 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-10-16T01:27:28.224841" elapsed="0.000939"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:28.226615" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:28.226111" elapsed="0.000582"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:28.227595" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:28.227091" elapsed="0.000651"/>
</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-10-16T01:27:28.236681" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:27:28.235238" elapsed="0.001595"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:27:28.236962" elapsed="0.000133"/>
</return>
<msg time="2026-10-16T01:27:28.237523" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:27:28.232011" elapsed="0.005664"/>
</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-10-16T01:27:28.261383" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:28.260956" elapsed="0.000463"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:27:28.262439" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:27:28.262149" elapsed="0.000386">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:28.262672" 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-10-16T01:27:28.261676" elapsed="0.001047"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:28.263392" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:28.262960" elapsed="0.000468"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:27:28.263852" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:27:28.264044" 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-10-16T01:27:28.263670" elapsed="0.000408"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:28.264672" 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-10-16T01:27:28.264346" elapsed="0.000410"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:28.266020" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:28.265676" elapsed="0.000399"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:27:28.266913" 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-10-16T01:27:28.266314" elapsed="0.000635"/>
</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-10-16T01:27:28.267341" elapsed="0.000028"/>
</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-10-16T01:27:28.267593" elapsed="0.000048"/>
</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-10-16T01:27:28.267887" elapsed="0.000028"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:27:28.267162" elapsed="0.000798"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:27:28.267010" elapsed="0.000990"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:27:28.268058" elapsed="0.000037"/>
</return>
<msg time="2026-10-16T01:27:28.268239" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:27:28.265190" elapsed="0.003081"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:28.264844" elapsed="0.003467"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:28.268545" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:28.268345" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:28.264819" elapsed="0.003842"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:27:28.269429" 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-10-16T01:27:28.268895" elapsed="0.000616"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:27:28.269575" elapsed="0.000039"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:27:28.260213" elapsed="0.009544"/>
</kw>
<msg time="2026-10-16T01:27:28.269825" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:28.254487" elapsed="0.015404"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:28.274592" elapsed="0.000026"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:28.278417" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:28.282286" elapsed="0.000025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:28.282464" 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-10-16T01:27:28.282660" 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-10-16T01:27:28.283018" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:28.282876" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:28.282862" 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-10-16T01:27:28.283244" elapsed="0.000019"/>
</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-10-16T01:27:28.283421" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:28.283581" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:27:28.282835" elapsed="0.000826"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:27:28.282743" elapsed="0.000944"/>
</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>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:28.283855" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:28.283924" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:27:28.284029" 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-10-16T01:27:28.253645" elapsed="0.030408"/>
</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-10-16T01:27:28.285195" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:28.285004" elapsed="0.000251">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:28.285338" 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-10-16T01:27:28.284662" elapsed="0.000698"/>
</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-10-16T01:27:28.285654" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:28.285424" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:27:28.286182" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:28.285917" elapsed="0.000290"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:28.285754" elapsed="0.000486"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:28.285407" elapsed="0.000853"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:28.286788" 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-10-16T01:27:28.286417" elapsed="0.000397"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:27:28.286860" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:27:28.286985" 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-manganese/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-10-16T01:27:28.284312" elapsed="0.002695"/>
</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-10-16T01:27:28.288087" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:28.287894" elapsed="0.000251">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:28.288227" 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-10-16T01:27:28.287546" elapsed="0.000703"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:27:28.288410" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:27:28.288313" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:28.288296" elapsed="0.000190"/>
</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-10-16T01:27:28.288652" 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-10-16T01:27:28.288842" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:28.288903" elapsed="0.000013"/>
</return>
<msg time="2026-10-16T01:27:28.289026" 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-manganese/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-10-16T01:27:28.287250" elapsed="0.001798"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:28.290444" 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-10-16T01:27:28.290215" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:28.290928" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:28.290691" elapsed="0.000278"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:27:28.294894" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:27:28.294948" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:27:28.295052" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:28.291254" elapsed="0.004146">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:28.291030" elapsed="0.004478">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:28.295728" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:28.295542" elapsed="0.000249"/>
</branch>
<status status="FAIL" start="2026-10-16T01:27:28.291013" elapsed="0.004800">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:28.296158" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:28.296282" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:28.296248" elapsed="0.000074"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:28.296231" elapsed="0.000111"/>
</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-10-16T01:27:28.296480" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:27:28.296550" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:27:28.289316" elapsed="0.007351">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:28.296753" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:27:28.243943" elapsed="0.052972">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:27:28.297306" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:28.297084" elapsed="0.000304"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:28.297036" elapsed="0.000394"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:28.297514" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:27:28.241740" elapsed="0.055952">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:28.238373" elapsed="0.059444">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:27:28.238328" elapsed="0.059564">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:28.298143" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:27:28.298487" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:28.298830" elapsed="0.000020"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:27:28.299175" elapsed="0.000022"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:27:28.299598" elapsed="0.000037"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:28.299952" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:28.300298" elapsed="0.000020"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:27:28.300535" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-10-16T01:27:28.230616" elapsed="0.070033">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:27:28.300779" elapsed="0.000017"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:27:28.228545" elapsed="0.072330">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:28.301101" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:28.300957" elapsed="0.000209"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:28.301329" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:28.301189" elapsed="0.000189"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:28.301541" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:28.301400" elapsed="0.000189"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:28.300941" elapsed="0.000670"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:27:28.228219" elapsed="0.073443">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:27:28.227844" elapsed="0.073893">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:28.301788" elapsed="0.000015"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:27:28.219091" elapsed="0.082789">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:28.302055" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:28.302275" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:28.302134" elapsed="0.000188"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:28.302118" elapsed="0.000226"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:28.302470" elapsed="0.000018"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:28.302652" elapsed="0.000019"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:28.302820" elapsed="0.000016"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:27:28.217480" elapsed="0.085436">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:27:28.217034" elapsed="0.085944">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:27:28.216789" elapsed="0.086237">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:27:28.215942" elapsed="0.087165">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:28.303315" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:27:28.191997" elapsed="0.111421">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:27:29.322676" elapsed="0.000433"/>
</kw>
<msg time="2026-10-16T01:27:29.323225" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:29.321382" elapsed="0.002082"/>
</kw>
<arg>phosphorus</arg>
<arg>${kw_name}</arg>
<arg>@{varargs}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Compare ${lower_bound} to manganese and in case manganese 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-10-16T01:27:29.320355" elapsed="0.003297"/>
</kw>
<msg time="2026-10-16T01:27:29.323779" 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-10-16T01:27:29.313791" elapsed="0.010083"/>
</kw>
<arg>Collections.Remove Values From List</arg>
<arg>${SHARD_OPER_LIST}</arg>
<arg>entity-ownership</arg>
<doc>Compare phosphorus to manganese and in case manganese is at least phosphorus,
run ${kw_name} @{varargs} &amp;{kwargs} and return its value.</doc>
<status status="PASS" start="2026-10-16T01:27:29.312907" elapsed="0.011121"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:29.325080" 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-10-16T01:27:29.324506" elapsed="0.000669"/>
</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-10-16T01:27:29.332179" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:29.331150" elapsed="0.001088"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:29.333288" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:29.332638" elapsed="0.000705"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:29.333441" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:27:29.333832" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:29.330314" elapsed="0.003574"/>
</kw>
<kw name="Sort List" owner="Collections">
<arg>${index_list}</arg>
<doc>Sorts the given list.</doc>
<status status="PASS" start="2026-10-16T01:27:29.334226" elapsed="0.000292"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:29.335614" 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-10-16T01:27:29.334938" elapsed="0.000758"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:29.336602" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:29.336085" elapsed="0.000591"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:29.337524" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:29.337019" elapsed="0.000558"/>
</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-10-16T01:27:29.346560" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:27:29.345199" elapsed="0.001802"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:27:29.347141" elapsed="0.000135"/>
</return>
<msg time="2026-10-16T01:27:29.347762" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:27:29.341952" elapsed="0.005939"/>
</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-10-16T01:27:29.373068" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:29.372602" elapsed="0.000502"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-10-16T01:27:29.374086" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/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-10-16T01:27:29.373791" elapsed="0.000395">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules.manganese/location.uri' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:29.374304" 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-10-16T01:27:29.373318" elapsed="0.001017"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:29.375040" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:29.374568" elapsed="0.000508"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-10-16T01:27:29.375458" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-10-16T01:27:29.375731" 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-10-16T01:27:29.375301" elapsed="0.000466"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:29.376350" 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-10-16T01:27:29.376034" elapsed="0.000374"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:29.377892" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:29.377349" elapsed="0.000602"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:27:29.378570" 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-10-16T01:27:29.378217" elapsed="0.000387"/>
</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-10-16T01:27:29.379038" elapsed="0.000028"/>
</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-10-16T01:27:29.379293" 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-10-16T01:27:29.379545" elapsed="0.000028"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-10-16T01:27:29.378857" elapsed="0.000760"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-10-16T01:27:29.378679" elapsed="0.000995"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-10-16T01:27:29.379749" elapsed="0.000038"/>
</return>
<msg time="2026-10-16T01:27:29.379931" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-10-16T01:27:29.376880" elapsed="0.003083"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:29.376494" elapsed="0.003508"/>
</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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:29.380239" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:29.380037" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:29.376470" elapsed="0.003865"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-10-16T01:27:29.381135" 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-10-16T01:27:29.380551" elapsed="0.000620"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-10-16T01:27:29.381231" elapsed="0.000037"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-10-16T01:27:29.371909" elapsed="0.009459"/>
</kw>
<msg time="2026-10-16T01:27:29.381433" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:29.366247" elapsed="0.015252"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:29.385440" elapsed="0.000025"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:29.389211" elapsed="0.000024"/>
</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-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules.manganese/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:29.392991" elapsed="0.000024"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Creates and returns a list containing the given items.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:29.393203" 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-10-16T01:27:29.393382" 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-10-16T01:27:29.393751" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:29.393583" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:29.393568" 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-10-16T01:27:29.393981" elapsed="0.000019"/>
</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-10-16T01:27:29.394158" elapsed="0.000019"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:29.394320" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-10-16T01:27:29.393542" elapsed="0.000826"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-10-16T01:27:29.393451" elapsed="0.000941"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Concatenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:29.394541" elapsed="0.000019"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:29.394608" elapsed="0.000027"/>
</return>
<msg time="2026-10-16T01:27:29.394740" 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-10-16T01:27:29.365397" elapsed="0.029367"/>
</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-10-16T01:27:29.395871" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:29.395663" elapsed="0.000268">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:29.396013" 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-10-16T01:27:29.395324" elapsed="0.000712"/>
</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-10-16T01:27:29.396313" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:29.396098" elapsed="0.000267"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-10-16T01:27:29.396840" 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 variable.</doc>
<status status="PASS" start="2026-10-16T01:27:29.396545" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-10-16T01:27:29.396388" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:29.396081" elapsed="0.000835"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:29.397409" 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-10-16T01:27:29.397073" elapsed="0.000360"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-10-16T01:27:29.397478" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:27:29.397600" 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-manganese/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-10-16T01:27:29.395027" elapsed="0.002609"/>
</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-10-16T01:27:29.398725" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/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-10-16T01:27:29.398508" elapsed="0.000278">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-manganese/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-10-16T01:27:29.398873" 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-10-16T01:27:29.398192" elapsed="0.000703"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-10-16T01:27:29.399057" elapsed="0.000022"/>
</return>
<status status="PASS" start="2026-10-16T01:27:29.398958" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:29.398941" elapsed="0.000192"/>
</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-10-16T01:27:29.399283" elapsed="0.000020"/>
</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-10-16T01:27:29.399501" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:29.399563" elapsed="0.000015"/>
</return>
<msg time="2026-10-16T01:27:29.399717" 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-manganese/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-10-16T01:27:29.397897" elapsed="0.001845"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:29.401140" 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-10-16T01:27:29.400913" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:29.401584" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:29.401367" elapsed="0.000269"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:27:29.405643" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:27:29.405715" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '405'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/ietf-yang-library:modules-state&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:27:29.405814" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:29.401939" elapsed="0.004221">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:29.401710" elapsed="0.004526">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:29.406416" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:29.406266" elapsed="0.000209"/>
</branch>
<status status="FAIL" start="2026-10-16T01:27:29.401680" elapsed="0.004817">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?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-10-16T01:27:29.406864" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:29.406985" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:29.406952" elapsed="0.000071"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:29.406936" elapsed="0.000108"/>
</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-10-16T01:27:29.407178" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:27:29.407241" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-10-16T01:27:29.400193" elapsed="0.007150">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:29.407412" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-10-16T01:27:29.355821" elapsed="0.051717">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=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-10-16T01:27:29.407968" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:29.407745" elapsed="0.000305"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:29.407675" elapsed="0.000417"/>
</if>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:29.408174" elapsed="0.000035"/>
</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="FAIL" start="2026-10-16T01:27:29.352313" elapsed="0.056058">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:29.348349" elapsed="0.060123">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</branch>
<status status="FAIL" start="2026-10-16T01:27:29.348306" elapsed="0.060242">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:29.408827" elapsed="0.000024"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-10-16T01:27:29.409170" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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 variable.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:29.409476" elapsed="0.000021"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<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="NOT RUN" start="2026-10-16T01:27:29.409859" elapsed="0.000023"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="NOT RUN" start="2026-10-16T01:27:29.410282" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:29.410594" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-10-16T01:27:29.410973" elapsed="0.000019"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="NOT RUN" start="2026-10-16T01:27:29.411207" elapsed="0.000017"/>
</return>
<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="FAIL" start="2026-10-16T01:27:29.340560" elapsed="0.070747">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<return>
<value>${raft_state}</value>
<status status="NOT RUN" start="2026-10-16T01:27:29.411368" elapsed="0.000015"/>
</return>
<var>${raft_state}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${ds_type}</arg>
<arg>member_index=${index}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Send request to Jolokia on indexed member, return extracted Raft status.
Optionally, check restconf works.</doc>
<status status="FAIL" start="2026-10-16T01:27:29.338730" elapsed="0.072726">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<if>
<branch type="IF" condition="'Follower' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${follower_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:29.411687" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:29.411534" elapsed="0.000226"/>
</branch>
<branch type="ELSE IF" condition="'Leader' == '${raft_state}'">
<kw name="Append To List" owner="Collections">
<arg>${leader_list}</arg>
<arg>${index}</arg>
<doc>Adds `values` to the end of `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:29.411918" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:29.411782" elapsed="0.000185"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:29.412130" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:29.411989" elapsed="0.000187"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:29.411518" elapsed="0.000680"/>
</if>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:27:29.338343" elapsed="0.073892">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:27:29.337724" elapsed="0.074563">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:29.412334" elapsed="0.000014"/>
</return>
<var>${leader_list}</var>
<var>${follower_list}</var>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Return lists of Leader and Follower member indices from a given member index list
(or from the full list if empty). If ${shard_type} is not 'config', 'operational' is assumed.
If ${validate}, Fail if raft state is not Leader or Follower (for example on Candidate).
The biggest difference from Get_Leader_And_Followers_For_Shard
is that no check on number of Leaders is performed.</doc>
<status status="FAIL" start="2026-10-16T01:27:29.328951" elapsed="0.083473">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${leader_count}</var>
<arg>${leader_list}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:29.412597" elapsed="0.000019"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:29.412954" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:29.412689" elapsed="0.000313"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:29.412673" elapsed="0.000351"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<arg>${leader_list}</arg>
<arg>${1}</arg>
<arg>Too many Leaders.</arg>
<doc>Verifies that the length of the given item is correct.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:29.413183" elapsed="0.000019"/>
</kw>
<kw name="Get From List" owner="Collections">
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an `index` from `list`.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:29.413354" elapsed="0.000018"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="NOT RUN" start="2026-10-16T01:27:29.413413" elapsed="0.000014"/>
</return>
<arg>shard_name=${shard_name}</arg>
<arg>shard_type=${shard_type}</arg>
<arg>validate=True</arg>
<arg>member_index_list=${member_index_list}</arg>
<arg>verify_restconf=${verify_restconf}</arg>
<doc>Get role lists, validate there is one leader, return the leader and list of followers.
Optionally, issue GET to a simple restconf URL to make sure subsequent operations will not encounter 503.</doc>
<status status="FAIL" start="2026-10-16T01:27:29.327311" elapsed="0.086195">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<var name="${shard_name}">topology</var>
<status status="FAIL" start="2026-10-16T01:27:29.326865" elapsed="0.086704">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="FAIL" start="2026-10-16T01:27:29.326551" elapsed="0.087079">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</for>
<arg>shard_name_list=${SHARD_OPER_LIST}</arg>
<arg>shard_type=operational</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="FAIL" start="2026-10-16T01:27:29.325636" elapsed="0.088094">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<kw name="Verify_Leader_Exists_For_Each_Shard" owner="ClusterManagement">
<arg>shard_name_list=${SHARD_CONF_LIST}</arg>
<arg>shard_type=config</arg>
<arg>member_index_list=${controller_index_list}</arg>
<doc>For each shard name, call Get_Leader_And_Followers_For_Shard.
Not much logic there, but single Keyword is useful when using BuiltIn.Wait_Until_Keyword_Succeeds.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:29.413940" elapsed="0.000022"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:27:29.304245" elapsed="0.109799">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<msg time="2026-10-16T01:27:29.414125" level="FAIL">Keyword 'Check Ovsdb Shards Status' failed after retrying for 1 minute 30 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<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="FAIL" start="2026-10-16T01:25:59.282083" elapsed="90.132128">Keyword 'Check Ovsdb Shards Status' failed after retrying for 1 minute 30 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<doc>Check Shard Status after some cluster event.</doc>
<status status="FAIL" start="2026-10-16T01:25:59.281603" elapsed="90.132701">Keyword 'Check Ovsdb Shards Status' failed after retrying for 1 minute 30 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</kw>
<doc>Create original cluster list and check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-10-16T01:25:58.927771" elapsed="90.486668">Keyword 'Check Ovsdb Shards Status' failed after retrying for 1 minute 30 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig</status>
</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-10-16T01:27:29.415915" elapsed="0.000220"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:27:29.415481" elapsed="0.000707"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:29.417268" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:29.417177" elapsed="0.000134"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:29.416992" elapsed="0.000340"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:29.419309" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:29.419224" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:29.419207" elapsed="0.000165"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:29.420278" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:29.419953" elapsed="0.000351"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:29.420751" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:29.420452" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:29.420817" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:27:29.420943" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:29.419571" elapsed="0.001396"/>
</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-10-16T01:27:29.423346" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:29.423261" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:29.423244" 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-10-16T01:27:29.424594" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:29.424509" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:29.424492" elapsed="0.000180"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:27:29.425071" level="INFO">${karaf_connection_index} = 598</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:27:29.424839" elapsed="0.000257"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:27:29.425442" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:27:29.425256" elapsed="0.000211"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:27:29.457716" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:27:29.426067" elapsed="0.031836"/>
</kw>
<msg time="2026-10-16T01:27:29.458071" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:27:29.458113" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:29.425633" elapsed="0.032515"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:27:29.528213" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:29.458765" elapsed="0.069651"/>
</kw>
<msg time="2026-10-16T01:27:29.528573" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:27:29.528614" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:29.458312" elapsed="0.070354"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:29.528970" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:29.528763" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:29.528743" elapsed="0.000321"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:29.529574" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:29.529240" elapsed="0.000439"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:29.529956" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:29.529759" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:29.529742" elapsed="0.000306"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:27:29.530079" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:29.532681" elapsed="0.000496"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:27:29.534443" elapsed="0.000528"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:27:29.536141" elapsed="0.000307"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:27:29.531010" elapsed="0.005504"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:27:29.530359" elapsed="0.006284"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:27:29.424249" elapsed="0.112485"/>
</kw>
<msg time="2026-10-16T01:27:29.536818" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:29.536858" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:29.423607" elapsed="0.113287"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:27:29.537048" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:27:29.536963" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:29.536946" 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-10-16T01:27:29.537501" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:29.537841" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:27:29.537907" 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-10-16T01:27:29.422973" elapsed="0.115021"/>
</kw>
<msg time="2026-10-16T01:27:29.538076" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:29.538115" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:29.421289" elapsed="0.116862"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:29.538431" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:29.538217" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:29.538201" elapsed="0.000301"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:27:29.421150" elapsed="0.117417"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:29.541474" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:29.541389" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:29.541372" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:29.542617" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:29.542534" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:29.542517" elapsed="0.000203"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:27:29.543089" level="INFO">${karaf_connection_index} = 600</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:27:29.542865" elapsed="0.000248"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:27:29.543451" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:27:29.543270" elapsed="0.000205"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:27:29.583045" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:27:29.544066" elapsed="0.039155"/>
</kw>
<msg time="2026-10-16T01:27:29.583376" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:27:29.583417" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:29.543639" elapsed="0.039814"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:27:29.669738" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:29.584075" elapsed="0.085844"/>
</kw>
<msg time="2026-10-16T01:27:29.670110" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:27:29.670160" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:29.583613" elapsed="0.086595"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:29.670563" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:29.670296" elapsed="0.000370"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:29.670269" elapsed="0.000456"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:29.671273" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:29.670936" elapsed="0.000416"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:29.671606" elapsed="0.000071"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:29.671412" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:29.671395" elapsed="0.000375"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:27:29.671801" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:29.674362" 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-10-16T01:27:29.676087" elapsed="0.000636"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:27:29.677899" 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-10-16T01:27:29.672657" elapsed="0.005624"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:27:29.672084" elapsed="0.006316"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:27:29.542279" elapsed="0.136197"/>
</kw>
<msg time="2026-10-16T01:27:29.678558" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:29.678597" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:29.541710" elapsed="0.136956"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:27:29.678837" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:27:29.678753" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:29.678736" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:27:29.679228" 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-10-16T01:27:29.679548" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:27:29.679614" 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-10-16T01:27:29.541100" elapsed="0.138644"/>
</kw>
<msg time="2026-10-16T01:27:29.679828" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:29.679867" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:29.538857" elapsed="0.141045"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:29.680180" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:29.679968" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:29.679952" elapsed="0.000298"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:27:29.538693" elapsed="0.141578"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:29.682601" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:29.682518" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:29.682502" elapsed="0.000177"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:29.684134" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:29.684041" elapsed="0.000135"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:29.683683" elapsed="0.000514"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:27:29.684560" 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-10-16T01:27:29.684338" elapsed="0.000246"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:27:29.684958" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:27:29.684777" elapsed="0.000205"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:27:29.719204" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:27:29.685537" elapsed="0.033854"/>
</kw>
<msg time="2026-10-16T01:27:29.719544" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:27:29.719585" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:29.685132" elapsed="0.034534"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:27:29.792773" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:29.720270" elapsed="0.072679"/>
</kw>
<msg time="2026-10-16T01:27:29.793102" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:27:29.793143" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:29.719853" elapsed="0.073326"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:29.793444" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:29.793247" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:29.793230" elapsed="0.000307"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:29.794089" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:29.793758" elapsed="0.000412"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:29.794423" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:29.794230" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:29.794214" elapsed="0.000300"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:27:29.794544" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:29.797009" elapsed="0.000465"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:27:29.798684" elapsed="0.000602"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:27:29.800442" elapsed="0.000546"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:27:29.795324" elapsed="0.005731"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:27:29.794838" elapsed="0.006329"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:27:29.683412" elapsed="0.117830"/>
</kw>
<msg time="2026-10-16T01:27:29.801321" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:29.801360" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:29.682850" elapsed="0.118545"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:27:29.801547" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:27:29.801463" elapsed="0.000137"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:29.801446" elapsed="0.000191"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:27:29.801962" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:29.802254" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:27:29.802317" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:27:29.682232" elapsed="0.120168"/>
</kw>
<msg time="2026-10-16T01:27:29.802481" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:29.802519" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:29.680510" elapsed="0.122044"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:29.802939" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:29.802634" elapsed="0.000389"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:29.802604" elapsed="0.000443"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:27:29.680376" elapsed="0.122692"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:27:29.421012" elapsed="0.382083"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:27:29.418926" elapsed="0.384220"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:27:29.416754" elapsed="0.386442"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:29.416335" elapsed="0.386903"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:27:29.415144" elapsed="0.388145"/>
</kw>
<kw name="Get Ovsdb Entity Owner Status For One Device" owner="ClusterOvsdb">
<msg time="2026-10-16T01:27:29.807020" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:27:29.805821" elapsed="0.001235">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${new_owner}</arg>
<doc>Makes the variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:29.807256" elapsed="0.000020"/>
</kw>
<doc>Check Entity Owner Status and identify owner and candidate.</doc>
<status status="FAIL" start="2026-10-16T01:27:29.414660" elapsed="0.392746">Variable '${ovsdb_uuid}' not found.</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-10-16T01:27:29.809555" elapsed="0.000302"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:27:29.808990" elapsed="0.000919"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:29.810811" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:29.810722" elapsed="0.000131"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:29.810690" elapsed="0.000184"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:29.812778" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:29.812679" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:29.812662" elapsed="0.000179"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:29.813748" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:29.813392" elapsed="0.000382"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:29.814189" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:29.813923" elapsed="0.000289"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:29.814253" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:27:29.814375" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:29.813038" elapsed="0.001360"/>
</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-10-16T01:27:29.818451" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:29.818367" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:29.818349" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:29.819599" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:29.819515" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:29.819498" elapsed="0.000177"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:27:29.820063" level="INFO">${karaf_connection_index} = 598</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:27:29.819839" elapsed="0.000249"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:27:29.820426" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:27:29.820245" elapsed="0.000205"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:27:29.857470" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:27:29.821045" elapsed="0.036615"/>
</kw>
<msg time="2026-10-16T01:27:29.857852" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:27:29.857893" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:29.820601" elapsed="0.037370"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:27:29.937682" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:29.858566" elapsed="0.079316"/>
</kw>
<msg time="2026-10-16T01:27:29.938036" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:27:29.938077" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:29.858138" elapsed="0.079974"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:29.938388" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:29.938183" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:29.938164" elapsed="0.000317"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:29.939019" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:29.938669" elapsed="0.000435"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:29.939358" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:29.939163" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:29.939147" elapsed="0.000337"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:27:29.939515" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:29.942001" elapsed="0.000467"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:27:29.943678" elapsed="0.000475"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:27:29.945595" elapsed="0.000580"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:27:29.940325" elapsed="0.005919"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:27:29.939833" elapsed="0.006530"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:27:29.819259" elapsed="0.127181"/>
</kw>
<msg time="2026-10-16T01:27:29.946525" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:29.946565" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:29.818675" elapsed="0.127925"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:27:29.946811" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-16T01:27:29.946693" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:29.946667" 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-10-16T01:27:29.947208" 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-10-16T01:27:29.947502" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:27:29.947565" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:27:29.818073" elapsed="0.129595"/>
</kw>
<msg time="2026-10-16T01:27:29.947845" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:29.947886" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:29.814749" elapsed="0.133172"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:29.948208" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:29.947990" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:29.947973" elapsed="0.000350"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:27:29.814585" elapsed="0.133760"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:29.950886" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:29.950801" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:29.950784" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:29.952049" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:29.951966" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:29.951950" elapsed="0.000161"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:27:29.952473" level="INFO">${karaf_connection_index} = 600</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:27:29.952251" elapsed="0.000247"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:27:29.952873" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:27:29.952671" elapsed="0.000227"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:27:29.995123" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:27:29.953511" elapsed="0.041786"/>
</kw>
<msg time="2026-10-16T01:27:29.995469" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:27:29.995510" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:29.953051" elapsed="0.042495"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:27:30.074141" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:29.996164" elapsed="0.078162"/>
</kw>
<msg time="2026-10-16T01:27:30.074489" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:27:30.074532" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:29.995743" elapsed="0.078825"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:30.074905" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:30.074672" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:30.074652" elapsed="0.000350"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:30.075523" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:30.075179" elapsed="0.000429"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:30.075901" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:30.075685" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:30.075669" elapsed="0.000325"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:27:30.076025" elapsed="0.000024"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:30.078488" 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-10-16T01:27:30.080223" elapsed="0.000466"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:27:30.082089" elapsed="0.000309"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:27:30.076829" elapsed="0.005635"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:27:30.076292" elapsed="0.006289"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:27:29.951689" elapsed="0.130985"/>
</kw>
<msg time="2026-10-16T01:27:30.082811" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:30.082852" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:29.951095" elapsed="0.131793"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:27:30.083043" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:27:30.082957" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:30.082940" elapsed="0.000181"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:27:30.083433" 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-10-16T01:27:30.083835" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:27:30.083901" 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-10-16T01:27:29.950468" elapsed="0.133520"/>
</kw>
<msg time="2026-10-16T01:27:30.084071" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:30.084111" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:29.948596" elapsed="0.135549"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:30.084426" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:30.084212" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:30.084196" elapsed="0.000301"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:27:29.948460" elapsed="0.136058"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:30.087103" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:30.087018" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:30.087000" elapsed="0.000167"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:30.088268" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:30.088184" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:30.088167" elapsed="0.000165"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:27:30.088727" 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-10-16T01:27:30.088473" elapsed="0.000280"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:27:30.089093" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:27:30.088912" elapsed="0.000206"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:27:30.123960" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:27:30.089722" elapsed="0.034407"/>
</kw>
<msg time="2026-10-16T01:27:30.124304" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:27:30.124345" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:30.089270" elapsed="0.035110"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:27:30.201207" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:30.125017" elapsed="0.076373"/>
</kw>
<msg time="2026-10-16T01:27:30.201545" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:27:30.201586" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:30.124542" elapsed="0.077095"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:30.201939" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:30.201730" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:30.201690" elapsed="0.000374"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:30.202583" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:30.202245" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:30.202961" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:30.202763" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:30.202746" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:27:30.203085" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:30.205529" 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-10-16T01:27:30.207287" elapsed="0.000489"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:27:30.208971" elapsed="0.000305"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:27:30.203880" elapsed="0.005461"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:27:30.203351" elapsed="0.006106"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:27:30.087928" elapsed="0.121605"/>
</kw>
<msg time="2026-10-16T01:27:30.209614" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:30.209672" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:30.087313" elapsed="0.122587"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:27:30.210057" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:27:30.209972" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:30.209955" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:27:30.210450" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:30.210785" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:27:30.210851" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:27:30.086664" elapsed="0.124271"/>
</kw>
<msg time="2026-10-16T01:27:30.211018" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:30.211058" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:30.084795" elapsed="0.126298"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:30.211374" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:30.211160" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:30.211144" elapsed="0.000301"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:27:30.084643" elapsed="0.126823"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:27:29.814447" elapsed="0.397046"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:27:29.812376" elapsed="0.399168"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:27:29.810436" elapsed="0.401157"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:29.810053" elapsed="0.401595"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:27:29.808602" elapsed="0.403209"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:30.215434" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:30.215170" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:30.215153" elapsed="0.000358"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:27:30.215863" 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-10-16T01:27:30.215956" 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-10-16T01:27:30.215731" elapsed="0.000250"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:30.216451" level="INFO">Attempting to execute command "sudo ovs-vsctl add-br br-s1" on remote system "10.30.171.104" 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-10-16T01:27:30.216165" elapsed="0.000328"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:27:30.217001" level="INFO">${conn_id} = 701</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-10-16T01:27:30.216683" elapsed="0.000342"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:27:30.217880" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:27:30.217950" 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-10-16T01:27:30.217566" elapsed="0.000406"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:30.218119" elapsed="0.000281"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:27:30.219190" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:27:30.828387" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:27:30 UTC 2026

  System load:  0.0                Processes:             105
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%

 * Canonical Workshop gives developers fast, composable, reproducible, and
   secure developer environments that are perfect for agentic workflows.

   https://ubuntu.com/workshop

Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:25:41 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:27:30.218960" elapsed="0.609525"/>
</kw>
<msg time="2026-10-16T01:27:30.828552" 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-10-16T01:27:30.218560" elapsed="0.610051"/>
</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-10-16T01:27:30.217218" elapsed="0.611509"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:27:30.829132" level="INFO">Executing command 'sudo ovs-vsctl add-br br-s1'.</msg>
<msg time="2026-10-16T01:27:30.872318" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:27:30.872465" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:27:30.872521" 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-10-16T01:27:30.828954" elapsed="0.043596"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:27:30.872813" elapsed="0.000279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:30.873795" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:30.873401" elapsed="0.000449"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:27:30.874101" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:30.873948" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:30.873920" elapsed="0.000276"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:27:30.874375" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-10-16T01:27:30.874262" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:30.874244" elapsed="0.000236"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:27:30.874523" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:30.875533" 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-10-16T01:27:30.876240" elapsed="0.000196"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:27:30.876663" 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-10-16T01:27:30.874969" elapsed="0.001988"/>
</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-10-16T01:27:30.214751" elapsed="0.662306"/>
</kw>
<msg time="2026-10-16T01:27:30.877123" 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-10-16T01:27:30.214203" elapsed="0.662982"/>
</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-10-16T01:27:30.213770" elapsed="0.663513"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:27:30.878013" 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-10-16T01:27:30.877553" elapsed="0.000494"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:27:30.878730" 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-10-16T01:27:30.878312" elapsed="0.000454"/>
</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-10-16T01:27:30.884999" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:30.884499" elapsed="0.000535"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:30.885636" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:30.885243" elapsed="0.000427"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:30.885755" elapsed="0.000038"/>
</return>
<msg time="2026-10-16T01:27:30.885934" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:30.884008" elapsed="0.001958"/>
</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-10-16T01:27:30.889669" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:27:30.889275" elapsed="0.000449"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:27:30.889784" elapsed="0.000036"/>
</return>
<msg time="2026-10-16T01:27:30.889956" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:27:30.888827" elapsed="0.001161"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:30.891591" 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-10-16T01:27:30.891280" elapsed="0.000387"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:30.892250" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:30.891945" elapsed="0.000360"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:27:30.897182" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:27:30.897254" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:27:30.897394" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:27:30.892736" elapsed="0.005276">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:30.892388" elapsed="0.005732">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:27:30.898373" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:30.898163" elapsed="0.000343"/>
</branch>
<status status="FAIL" start="2026-10-16T01:27:30.892365" elapsed="0.006174">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:27:30.899055" elapsed="0.000034"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:30.899225" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:30.899178" elapsed="0.000100"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:30.899156" elapsed="0.000151"/>
</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-10-16T01:27:30.899497" elapsed="0.000026"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:27:30.899584" 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-10-16T01:27:30.890408" elapsed="0.009354">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:30.899841" 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-10-16T01:27:30.888186" elapsed="0.011772">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:27:30.900248" elapsed="0.000031"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:27:30.886202" elapsed="0.014142">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:27:30.886038" elapsed="0.014377">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:27:30.883296" elapsed="0.017233">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:27:31.910208" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:31.909320" elapsed="0.000952"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:31.911297" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:31.910645" elapsed="0.000708"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:31.911450" elapsed="0.000072"/>
</return>
<msg time="2026-10-16T01:27:31.911808" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:31.908391" elapsed="0.003471"/>
</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-10-16T01:27:31.917739" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:27:31.917086" elapsed="0.000713"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:27:31.917894" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:27:31.918168" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:27:31.916326" elapsed="0.001894"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:31.920887" 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-10-16T01:27:31.920333" elapsed="0.000648"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:31.921934" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:31.921394" 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-10-16T01:27:31.928493" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:27:31.928608" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:27:31.928976" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:27:31.922686" elapsed="0.007101">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:31.922163" elapsed="0.007789">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:27:31.930365" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:31.930024" elapsed="0.000473"/>
</branch>
<status status="FAIL" start="2026-10-16T01:27:31.922125" elapsed="0.008422">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:27:31.931339" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:31.931612" elapsed="0.000051"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:31.931535" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:31.931499" elapsed="0.000302"/>
</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-10-16T01:27:31.932110" elapsed="0.000044"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:27:31.932251" 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-10-16T01:27:31.918931" elapsed="0.013534">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:31.932588" elapsed="0.000052"/>
</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-10-16T01:27:31.915359" elapsed="0.017473">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:27:31.933291" elapsed="0.000050"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:27:31.912224" elapsed="0.021221">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:27:31.911972" elapsed="0.021588">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:27:31.907126" elapsed="0.026673">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:27:32.943154" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:32.942289" elapsed="0.000926"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:32.944234" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:32.943561" elapsed="0.000726"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:32.944378" elapsed="0.000068"/>
</return>
<msg time="2026-10-16T01:27:32.944725" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:32.941436" elapsed="0.003344"/>
</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-10-16T01:27:32.950765" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:27:32.950110" elapsed="0.000713"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:27:32.950918" elapsed="0.000057"/>
</return>
<msg time="2026-10-16T01:27:32.951187" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:27:32.949340" elapsed="0.001897"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:32.953898" 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-10-16T01:27:32.953336" elapsed="0.000658"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:32.955069" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:32.954408" elapsed="0.000752"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:27:32.961826" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:27:32.961939" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:27:32.962150" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:27:32.955859" elapsed="0.007096">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:32.955304" elapsed="0.007814">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:27:32.963520" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:32.963189" elapsed="0.000490"/>
</branch>
<status status="FAIL" start="2026-10-16T01:27:32.955265" elapsed="0.008498">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:27:32.964496" elapsed="0.000052"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:32.964818" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:32.964742" elapsed="0.000162"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:32.964679" elapsed="0.000270"/>
</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-10-16T01:27:32.965250" elapsed="0.000043"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:27:32.965388" elapsed="0.000030"/>
</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-10-16T01:27:32.951945" elapsed="0.013652">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:32.965771" 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-10-16T01:27:32.948256" elapsed="0.017708">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:27:32.966422" elapsed="0.000049"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:27:32.945147" elapsed="0.021427">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:27:32.944893" elapsed="0.021853">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:27:32.940237" elapsed="0.026696">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:27:33.977107" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:33.976232" elapsed="0.000938"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:33.978254" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:33.977510" elapsed="0.000798"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:33.978405" elapsed="0.000067"/>
</return>
<msg time="2026-10-16T01:27:33.978815" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:33.975334" elapsed="0.003535"/>
</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-10-16T01:27:33.985099" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:27:33.984427" elapsed="0.000730"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:27:33.985252" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:27:33.985526" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:27:33.983586" elapsed="0.001993"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:33.988380" 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-10-16T01:27:33.987727" elapsed="0.000749"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:33.989518" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:33.989028" elapsed="0.000580"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:27:33.996492" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:27:33.996633" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:27:33.996893" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:27:33.990310" elapsed="0.007363">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:33.989797" elapsed="0.008076">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:27:33.998295" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:33.997947" elapsed="0.000477"/>
</branch>
<status status="FAIL" start="2026-10-16T01:27:33.989756" elapsed="0.008717">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:27:33.999287" elapsed="0.000054"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:33.999558" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:33.999482" elapsed="0.000185"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:33.999447" 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-10-16T01:27:34.000043" elapsed="0.000042"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:27:34.000179" elapsed="0.000030"/>
</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-10-16T01:27:33.986285" elapsed="0.014105">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:34.000507" elapsed="0.000031"/>
</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-10-16T01:27:33.982496" elapsed="0.018243">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:27:34.001198" elapsed="0.000047"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:27:33.979351" elapsed="0.021997">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:27:33.979096" elapsed="0.022364">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:27:33.974042" elapsed="0.027750">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:27:35.011457" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:35.010559" elapsed="0.000964"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:35.012550" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:35.011931" elapsed="0.000674"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:35.012760" elapsed="0.000078"/>
</return>
<msg time="2026-10-16T01:27:35.013075" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:35.009747" elapsed="0.003381"/>
</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-10-16T01:27:35.019023" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:27:35.018362" elapsed="0.000718"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:27:35.019173" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:27:35.019445" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:27:35.017594" elapsed="0.001902"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:35.022205" 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-10-16T01:27:35.021606" elapsed="0.000692"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:35.023251" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:35.022758" elapsed="0.000584"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:27:35.030039" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:27:35.030153" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:27:35.030367" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:27:35.024053" elapsed="0.007130">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:35.023487" elapsed="0.007860">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:27:35.031816" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:35.031418" elapsed="0.000530"/>
</branch>
<status status="FAIL" start="2026-10-16T01:27:35.023447" elapsed="0.008551">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:27:35.032799" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:35.033067" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:35.032994" elapsed="0.000159"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:35.032959" 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-10-16T01:27:35.033503" elapsed="0.000043"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:27:35.033666" 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-10-16T01:27:35.020214" elapsed="0.013727">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:35.034168" 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-10-16T01:27:35.016664" elapsed="0.017699">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:27:35.034874" elapsed="0.000050"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:27:35.013491" elapsed="0.021539">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:27:35.013241" elapsed="0.021906">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:27:35.008425" elapsed="0.026905">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:27:36.044889" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:36.043960" elapsed="0.000991"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:36.045955" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:36.045289" elapsed="0.000720"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:36.046103" elapsed="0.000067"/>
</return>
<msg time="2026-10-16T01:27:36.046397" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:36.043111" elapsed="0.003339"/>
</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-10-16T01:27:36.052327" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:27:36.051698" elapsed="0.000685"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:27:36.052477" elapsed="0.000056"/>
</return>
<msg time="2026-10-16T01:27:36.052797" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:27:36.050959" elapsed="0.001890"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:36.055428" 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-10-16T01:27:36.054921" elapsed="0.000601"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:36.056485" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:36.055998" elapsed="0.000576"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:27:36.063432" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:27:36.063545" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:27:36.063820" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:27:36.057276" elapsed="0.007302">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:36.056771" elapsed="0.008021">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:27:36.065197" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:36.064864" elapsed="0.000556"/>
</branch>
<status status="FAIL" start="2026-10-16T01:27:36.056697" elapsed="0.008776">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:27:36.066258" elapsed="0.000051"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:36.066522" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:36.066449" elapsed="0.000157"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:36.066414" elapsed="0.000259"/>
</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-10-16T01:27:36.067005" elapsed="0.000044"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:27:36.067147" elapsed="0.000030"/>
</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-10-16T01:27:36.053495" elapsed="0.013860">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:36.067474" elapsed="0.000031"/>
</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-10-16T01:27:36.050001" elapsed="0.017683">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:27:36.068170" elapsed="0.000049"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:27:36.046865" elapsed="0.021458">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:27:36.046558" elapsed="0.021877">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:27:36.041896" elapsed="0.026740">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<msg time="2026-10-16T01:27:36.068860" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<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="FAIL" start="2026-10-16T01:27:30.879036" elapsed="5.190019">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${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="NOT RUN" start="2026-10-16T01:27:36.069555" elapsed="0.000045"/>
</kw>
<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-10-16T01:27:30.213366" elapsed="5.856491">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<doc>Create bridge with OVS command and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-10-16T01:27:29.807953" elapsed="6.262192">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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-10-16T01:27:36.074606" elapsed="0.000835"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:27:36.074063" elapsed="0.001584"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:36.078162" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:36.077926" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:36.077875" elapsed="0.000443"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:36.082796" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:36.082508" elapsed="0.000384"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:36.082471" elapsed="0.000467"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:36.085071" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:36.084272" elapsed="0.000858"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:36.086263" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:36.085596" elapsed="0.000721"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:36.086410" elapsed="0.000072"/>
</return>
<msg time="2026-10-16T01:27:36.086760" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:36.083427" elapsed="0.003386"/>
</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-10-16T01:27:36.092871" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:36.092646" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:36.092583" elapsed="0.000430"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:36.095651" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:36.095438" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:36.095401" elapsed="0.000426"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:27:36.096692" level="INFO">${karaf_connection_index} = 598</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:27:36.096153" elapsed="0.000648"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:27:36.097579" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:27:36.097166" elapsed="0.000491"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:27:36.144633" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:27:36.099328" elapsed="0.045582"/>
</kw>
<msg time="2026-10-16T01:27:36.145140" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:27:36.145200" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:36.098300" elapsed="0.046949"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:27:36.218448" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:36.146141" elapsed="0.072633"/>
</kw>
<msg time="2026-10-16T01:27:36.218996" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:27:36.219039" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:36.145483" elapsed="0.073592"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:36.219491" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:36.219183" elapsed="0.000383"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:36.219151" elapsed="0.000443"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:36.220275" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:36.219818" elapsed="0.000544"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:36.220634" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:36.220422" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:36.220406" elapsed="0.000338"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:27:36.220782" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:36.223470" 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-10-16T01:27:36.225287" elapsed="0.000547"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:27:36.227111" 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-10-16T01:27:36.221729" elapsed="0.005773"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:27:36.221148" elapsed="0.006488"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:27:36.094864" elapsed="0.132866"/>
</kw>
<msg time="2026-10-16T01:27:36.227820" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:36.227862" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:36.093340" elapsed="0.134558"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:27:36.228054" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:27:36.227969" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:36.227953" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:27:36.228475" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:36.228828" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:27:36.228894" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:27:36.091888" elapsed="0.137094"/>
</kw>
<msg time="2026-10-16T01:27:36.229070" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:36.229111" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:36.087566" elapsed="0.141581"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:36.229435" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:36.229216" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:36.229201" elapsed="0.000306"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:27:36.087253" elapsed="0.142276"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:36.234783" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:36.234680" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:36.234662" elapsed="0.000184"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:36.235953" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:36.235869" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:36.235852" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:27:36.236389" level="INFO">${karaf_connection_index} = 600</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:27:36.236158" elapsed="0.000256"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:27:36.236814" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:27:36.236573" elapsed="0.000265"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:27:36.270254" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:27:36.237403" elapsed="0.033048"/>
</kw>
<msg time="2026-10-16T01:27:36.270628" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:27:36.270671" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:36.236991" elapsed="0.033735"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:27:36.344977" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:36.271334" elapsed="0.073832"/>
</kw>
<msg time="2026-10-16T01:27:36.345323" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:27:36.345364" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:36.270897" elapsed="0.074553"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:36.345779" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:36.345527" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:36.345507" elapsed="0.000371"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:36.346399" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:36.346057" elapsed="0.000426"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:36.346773" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:36.346543" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:36.346527" elapsed="0.000346"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:27:36.346904" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:36.349381" 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-10-16T01:27:36.351091" elapsed="0.000452"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:27:36.352741" elapsed="0.000307"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:27:36.347738" elapsed="0.005376"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:27:36.347197" elapsed="0.006032"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:27:36.235576" elapsed="0.117729"/>
</kw>
<msg time="2026-10-16T01:27:36.353389" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:36.353428" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:36.234994" elapsed="0.118469"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:27:36.353629" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-16T01:27:36.353532" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:36.353515" elapsed="0.000485"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:27:36.354328" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:36.354638" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:27:36.354718" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:27:36.234358" elapsed="0.120448"/>
</kw>
<msg time="2026-10-16T01:27:36.354893" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:36.354933" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:36.229836" elapsed="0.125134"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:36.355257" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:36.355038" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:36.355023" elapsed="0.000305"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:27:36.229672" elapsed="0.125677"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:36.357946" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:36.357860" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:36.357843" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:36.359110" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:36.359027" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:36.359010" elapsed="0.000202"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:27:36.359582" 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-10-16T01:27:36.359355" elapsed="0.000251"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:27:36.359987" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:27:36.359795" elapsed="0.000216"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:27:36.392097" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:27:36.360570" elapsed="0.031728"/>
</kw>
<msg time="2026-10-16T01:27:36.392479" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:27:36.392521" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:36.360162" elapsed="0.032396"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:27:36.479213" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:36.393302" elapsed="0.086096"/>
</kw>
<msg time="2026-10-16T01:27:36.479557" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:27:36.479598" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:36.392813" elapsed="0.086835"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:36.480006" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:36.479761" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:36.479734" elapsed="0.000371"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:36.480651" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:36.480290" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:36.481017" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:36.480819" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:36.480803" elapsed="0.000306"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:27:36.481145" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:36.483794" 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-10-16T01:27:36.485490" elapsed="0.000513"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:27:36.487181" 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-10-16T01:27:36.482080" elapsed="0.005485"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:27:36.481512" elapsed="0.006451"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:27:36.358768" elapsed="0.129280"/>
</kw>
<msg time="2026-10-16T01:27:36.488135" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:36.488176" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:36.358157" elapsed="0.130055"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:27:36.488370" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:27:36.488284" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:36.488268" elapsed="0.000181"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:27:36.488855" 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-10-16T01:27:36.489243" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:27:36.489308" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:27:36.357535" elapsed="0.131860"/>
</kw>
<msg time="2026-10-16T01:27:36.489483" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:36.489522" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:36.355602" elapsed="0.133955"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:36.489924" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:36.489657" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:36.489639" elapsed="0.000357"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:27:36.355466" elapsed="0.134553"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:27:36.086928" elapsed="0.403126"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:27:36.081858" elapsed="0.408253"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:27:36.077181" elapsed="0.412984"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:36.076116" elapsed="0.414093"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:27:36.073225" elapsed="0.417034"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:36.493950" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:36.493717" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:36.493686" elapsed="0.000340"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:27:36.494349" 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-10-16T01:27:36.494440" 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-10-16T01:27:36.494217" elapsed="0.000247"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:36.494963" 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.104" 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-10-16T01:27:36.494662" elapsed="0.000343"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:27:36.495480" level="INFO">${conn_id} = 706</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-10-16T01:27:36.495177" elapsed="0.000326"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:27:36.496360" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:27:36.496429" 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-10-16T01:27:36.496091" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:36.496598" elapsed="0.000310"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:27:36.497680" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:27:36.876368" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:27:30 UTC 2026

  System load:  0.0                Processes:             105
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%

 * Canonical Workshop gives developers fast, composable, reproducible, and
   secure developer environments that are perfect for agentic workflows.

   https://ubuntu.com/workshop

Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:27:30 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:27:36.497435" elapsed="0.379189"/>
</kw>
<msg time="2026-10-16T01:27:36.876723" 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-10-16T01:27:36.497068" elapsed="0.379739"/>
</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-10-16T01:27:36.495722" elapsed="0.381196"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:27:36.877470" level="INFO">Executing command 'sudo ovs-vsctl add-port br-s1 vx1 -- set Interface vx1 type=vxlan'.</msg>
<msg time="2026-10-16T01:27:36.911294" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:27:36.911451" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:27:36.911507" 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-10-16T01:27:36.877213" elapsed="0.034326"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:27:36.911797" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:36.912858" 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-10-16T01:27:36.912431" elapsed="0.000486"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:27:36.913189" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:36.913026" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:36.912993" elapsed="0.000299"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:27:36.913472" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-10-16T01:27:36.913360" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:36.913341" elapsed="0.000239"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:27:36.913637" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:36.914687" elapsed="0.000425"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:27:36.915366" elapsed="0.000202"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:27:36.915799" elapsed="0.000125"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:27:36.914087" elapsed="0.001902"/>
</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-10-16T01:27:36.493276" elapsed="0.422807"/>
</kw>
<msg time="2026-10-16T01:27:36.916147" 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-10-16T01:27:36.492769" elapsed="0.423439"/>
</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-10-16T01:27:36.492319" elapsed="0.423986"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:27:36.917030" 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-10-16T01:27:36.916571" elapsed="0.000492"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:27:36.917822" 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-10-16T01:27:36.917325" elapsed="0.000531"/>
</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-10-16T01:27:36.924063" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:36.923563" elapsed="0.000535"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:36.924725" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:36.924305" elapsed="0.000454"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:36.924815" elapsed="0.000037"/>
</return>
<msg time="2026-10-16T01:27:36.924990" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:36.923078" elapsed="0.001944"/>
</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-10-16T01:27:36.928727" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:27:36.928319" elapsed="0.000443"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:27:36.928820" elapsed="0.000038"/>
</return>
<msg time="2026-10-16T01:27:36.928996" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:27:36.927877" elapsed="0.001150"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:36.930650" 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-10-16T01:27:36.930326" elapsed="0.000401"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:36.931288" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:36.930988" elapsed="0.000355"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:27:36.936264" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:27:36.936338" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:27:36.936495" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:27:36.931768" elapsed="0.005323">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:36.931425" elapsed="0.005775">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:27:36.937452" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:36.937243" elapsed="0.000291"/>
</branch>
<status status="FAIL" start="2026-10-16T01:27:36.931402" elapsed="0.006164">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:27:36.938078" elapsed="0.000033"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:36.938245" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:36.938199" elapsed="0.000099"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:36.938177" elapsed="0.000149"/>
</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-10-16T01:27:36.938513" elapsed="0.000026"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:27:36.938598" elapsed="0.000037"/>
</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-10-16T01:27:36.929449" elapsed="0.009326">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:36.938852" 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-10-16T01:27:36.927276" elapsed="0.011694">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:27:36.939257" elapsed="0.000030"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:27:36.925318" elapsed="0.014035">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:27:36.925099" elapsed="0.014326">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:27:36.922382" elapsed="0.017158">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:27:37.949078" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:37.948212" elapsed="0.000930"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:37.950216" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:37.949488" elapsed="0.000784"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:37.950411" elapsed="0.000069"/>
</return>
<msg time="2026-10-16T01:27:37.950772" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:37.947346" elapsed="0.003480"/>
</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-10-16T01:27:37.957147" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:27:37.956466" elapsed="0.000738"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:27:37.957299" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:27:37.957574" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:27:37.955381" elapsed="0.002264"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:37.960347" 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-10-16T01:27:37.959838" elapsed="0.000602"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:37.961417" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:37.960928" elapsed="0.000577"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:27:37.968092" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:27:37.968206" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:27:37.968419" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:27:37.962208" elapsed="0.007021">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:37.961672" elapsed="0.007722">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:27:37.969860" elapsed="0.000443"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:37.969469" elapsed="0.000931"/>
</branch>
<status status="FAIL" start="2026-10-16T01:27:37.961631" elapsed="0.008820">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:27:37.971250" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:37.971518" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:37.971444" elapsed="0.000160"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:37.971408" 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-10-16T01:27:37.972019" elapsed="0.000044"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:27:37.972158" elapsed="0.000030"/>
</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-10-16T01:27:37.958360" elapsed="0.014011">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:37.972583" elapsed="0.000061"/>
</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-10-16T01:27:37.954408" elapsed="0.018432">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:27:37.973304" elapsed="0.000049"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:27:37.951189" elapsed="0.022272">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:27:37.950937" elapsed="0.022636">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:27:37.946096" elapsed="0.027713">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:27:38.983441" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:38.982552" elapsed="0.000954"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:38.984524" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:38.983904" elapsed="0.000674"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:38.984725" elapsed="0.000075"/>
</return>
<msg time="2026-10-16T01:27:38.985038" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:38.981743" elapsed="0.003346"/>
</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-10-16T01:27:38.991088" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:27:38.990421" elapsed="0.000723"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:27:38.991237" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:27:38.991510" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:27:38.989657" elapsed="0.001904"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:38.994290" 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-10-16T01:27:38.993723" elapsed="0.000673"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:38.995351" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:38.994860" elapsed="0.000581"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:27:39.002005" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:27:39.002119" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:27:39.002335" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:27:38.996140" elapsed="0.007007">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:38.995580" elapsed="0.007729">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:27:39.003836" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:39.003380" elapsed="0.000590"/>
</branch>
<status status="FAIL" start="2026-10-16T01:27:38.995541" elapsed="0.008478">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:27:39.005227" elapsed="0.000146"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:39.005626" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:39.005527" elapsed="0.000217"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:39.005490" 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-10-16T01:27:39.006106" elapsed="0.000044"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:27:39.006246" 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-10-16T01:27:38.992279" elapsed="0.014178">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:39.006578" elapsed="0.000055"/>
</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-10-16T01:27:38.988691" elapsed="0.018134">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:27:39.007289" elapsed="0.000048"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:27:38.985453" elapsed="0.021989">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:27:38.985200" elapsed="0.022355">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:27:38.980437" elapsed="0.027358">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:27:40.017480" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:40.016590" elapsed="0.000955"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:40.018570" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:40.017947" elapsed="0.000702"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:40.018776" elapsed="0.000076"/>
</return>
<msg time="2026-10-16T01:27:40.019089" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:40.015776" elapsed="0.003365"/>
</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-10-16T01:27:40.025077" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:27:40.024401" elapsed="0.000734"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:27:40.025229" elapsed="0.000057"/>
</return>
<msg time="2026-10-16T01:27:40.025499" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:27:40.023661" elapsed="0.001889"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:40.028292" 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-10-16T01:27:40.027776" elapsed="0.000611"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:40.029353" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:40.028858" elapsed="0.000584"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:27:40.036143" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:27:40.036256" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:27:40.036582" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:27:40.030151" elapsed="0.007294">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:40.029587" elapsed="0.008044">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:27:40.038084" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:40.037738" elapsed="0.000477"/>
</branch>
<status status="FAIL" start="2026-10-16T01:27:40.029548" elapsed="0.008717">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:27:40.039065" elapsed="0.000052"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:40.039331" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:40.039258" elapsed="0.000157"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:40.039223" 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-10-16T01:27:40.039816" elapsed="0.000045"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:27:40.039959" elapsed="0.000030"/>
</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-10-16T01:27:40.026303" elapsed="0.013867">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:40.040289" 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-10-16T01:27:40.022721" elapsed="0.017757">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:27:40.040991" elapsed="0.000051"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:27:40.019506" elapsed="0.021642">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:27:40.019252" elapsed="0.022009">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:27:40.014456" elapsed="0.026987">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:27:41.051293" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:41.050459" elapsed="0.000895"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:41.052370" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:41.051749" elapsed="0.000676"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:41.052518" elapsed="0.000060"/>
</return>
<msg time="2026-10-16T01:27:41.052891" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:41.049567" elapsed="0.003377"/>
</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-10-16T01:27:41.058965" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:27:41.058305" elapsed="0.000717"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:27:41.059114" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:27:41.059386" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:27:41.057542" elapsed="0.001895"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:41.062075" 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-10-16T01:27:41.061520" elapsed="0.000648"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:41.063275" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:41.062656" elapsed="0.000710"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:27:41.069967" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:27:41.070080" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:27:41.070303" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:27:41.064138" elapsed="0.006944">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:41.063505" elapsed="0.007739">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:27:41.071696" elapsed="0.000082"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:41.071312" elapsed="0.000555"/>
</branch>
<status status="FAIL" start="2026-10-16T01:27:41.063467" elapsed="0.008450">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:27:41.072667" elapsed="0.000082"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:41.072992" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:41.072894" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:41.072857" elapsed="0.000268"/>
</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-10-16T01:27:41.073426" elapsed="0.000042"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:27:41.073564" elapsed="0.000031"/>
</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-10-16T01:27:41.060131" elapsed="0.013693">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:41.073946" 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-10-16T01:27:41.056579" elapsed="0.017556">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:27:41.074590" elapsed="0.000074"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:27:41.053346" elapsed="0.021455">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:27:41.053063" elapsed="0.021853">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:27:41.048415" elapsed="0.026682">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:27:42.085044" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:42.084181" elapsed="0.000926"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:42.086133" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:42.085450" elapsed="0.000737"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:42.086280" elapsed="0.000068"/>
</return>
<msg time="2026-10-16T01:27:42.086577" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:42.083326" elapsed="0.003324"/>
</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-10-16T01:27:42.092664" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:27:42.092025" elapsed="0.000726"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:27:42.092852" elapsed="0.000060"/>
</return>
<msg time="2026-10-16T01:27:42.093127" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:27:42.091265" elapsed="0.001914"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:42.095875" 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-10-16T01:27:42.095317" elapsed="0.000652"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:42.096919" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:42.096383" elapsed="0.000624"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:27:42.103494" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:27:42.103605" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:27:42.103907" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<var>${response}</var>
<arg>${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-10-16T01:27:42.097680" elapsed="0.007000">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:42.097148" elapsed="0.007726">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:27:42.105282" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:42.104946" elapsed="0.000467"/>
</branch>
<status status="FAIL" start="2026-10-16T01:27:42.097108" elapsed="0.008354">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:27:42.106255" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:42.106520" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:42.106447" elapsed="0.000158"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:42.106413" elapsed="0.000261"/>
</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-10-16T01:27:42.107007" elapsed="0.000043"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:27:42.107145" elapsed="0.000031"/>
</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-10-16T01:27:42.093892" elapsed="0.013463">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:42.107473" 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-10-16T01:27:42.090303" elapsed="0.017383">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</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-10-16T01:27:42.108174" elapsed="0.000048"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:27:42.087145" elapsed="0.021181">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:27:42.086884" elapsed="0.021554">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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="FAIL" start="2026-10-16T01:27:42.082020" elapsed="0.026735">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<msg time="2026-10-16T01:27:42.108957" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</msg>
<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="FAIL" start="2026-10-16T01:27:36.918125" elapsed="5.191025">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${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="NOT RUN" start="2026-10-16T01:27:42.109671" elapsed="0.000073"/>
</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="FAIL" start="2026-10-16T01:27:36.491950" elapsed="5.617998">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</kw>
<doc>Add port with OVS command and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-10-16T01:27:36.071523" elapsed="6.038708">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=config</status>
</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-10-16T01:27:42.113838" elapsed="0.000459"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:27:42.112669" elapsed="0.001743"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:42.116489" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:42.116295" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:42.116256" elapsed="0.000405"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:42.120923" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:42.120732" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:42.120668" elapsed="0.000395"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:42.123131" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:42.122349" elapsed="0.000839"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:42.124187" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:42.123522" elapsed="0.000719"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:42.124332" elapsed="0.000059"/>
</return>
<msg time="2026-10-16T01:27:42.124660" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:42.121504" elapsed="0.003238"/>
</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-10-16T01:27:42.129437" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:42.129319" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:42.129296" elapsed="0.000229"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:42.131125" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:42.131008" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:42.130984" elapsed="0.000229"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:27:42.131773" level="INFO">${karaf_connection_index} = 598</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:27:42.131414" elapsed="0.000395"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:27:42.132300" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:27:42.132034" elapsed="0.000300"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:27:42.165004" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:27:42.133174" elapsed="0.032146"/>
</kw>
<msg time="2026-10-16T01:27:42.165557" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:27:42.165599" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:42.132546" elapsed="0.033103"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:27:42.243468" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:42.166259" elapsed="0.077409"/>
</kw>
<msg time="2026-10-16T01:27:42.243851" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:27:42.243892" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:42.165829" elapsed="0.078098"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:42.244200" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:42.243996" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:42.243979" elapsed="0.000315"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:42.244970" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:42.244473" elapsed="0.000585"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:42.245318" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:42.245120" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:42.245103" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:27:42.245441" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:42.247946" elapsed="0.000477"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:27:42.249682" elapsed="0.000495"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:27:42.251381" elapsed="0.000581"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:27:42.246248" elapsed="0.005783"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:27:42.245750" elapsed="0.006397"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:27:42.130598" elapsed="0.121626"/>
</kw>
<msg time="2026-10-16T01:27:42.252305" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:42.252349" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:42.129764" elapsed="0.122621"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:27:42.252536" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:27:42.252453" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:42.252436" elapsed="0.000192"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:27:42.252962" 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-10-16T01:27:42.253257" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:27:42.253321" 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-10-16T01:27:42.128922" elapsed="0.124483"/>
</kw>
<msg time="2026-10-16T01:27:42.253488" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:42.253527" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:42.125466" elapsed="0.128097"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:42.253994" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:42.253684" elapsed="0.000361"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:42.253667" elapsed="0.000400"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:27:42.125158" elapsed="0.128931"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:42.256934" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:42.256811" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:42.256787" 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-10-16T01:27:42.258204" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:42.258115" elapsed="0.000131"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:42.258098" elapsed="0.000169"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:27:42.258645" level="INFO">${karaf_connection_index} = 600</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:27:42.258408" elapsed="0.000262"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:27:42.259029" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:27:42.258848" elapsed="0.000206"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:27:42.286809" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:27:42.259749" elapsed="0.027241"/>
</kw>
<msg time="2026-10-16T01:27:42.287152" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:27:42.287195" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:42.259206" elapsed="0.028026"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:27:42.375364" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:42.287882" elapsed="0.087668"/>
</kw>
<msg time="2026-10-16T01:27:42.375748" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:27:42.375792" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:42.287398" elapsed="0.088429"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:42.376102" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:42.375897" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:42.375879" elapsed="0.000318"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:42.376754" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:42.376378" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:42.377097" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:42.376899" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:42.376883" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:27:42.377220" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:42.379838" elapsed="0.000469"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:27:42.381496" elapsed="0.000484"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:27:42.383344" 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-10-16T01:27:42.378175" elapsed="0.005570"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:27:42.377486" elapsed="0.006375"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:27:42.257857" elapsed="0.126126"/>
</kw>
<msg time="2026-10-16T01:27:42.384066" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:42.384110" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:42.257155" elapsed="0.126990"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:27:42.384299" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:27:42.384214" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:42.384198" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:27:42.384780" 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-10-16T01:27:42.385078" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:27:42.385142" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:27:42.256378" elapsed="0.128847"/>
</kw>
<msg time="2026-10-16T01:27:42.385306" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:42.385345" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:42.254334" elapsed="0.131046"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:42.385675" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:42.385446" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:42.385431" elapsed="0.000332"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:27:42.254199" elapsed="0.131585"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:42.388185" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:42.388100" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:42.388083" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:42.389396" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:42.389311" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:42.389294" elapsed="0.000164"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:27:42.389864" 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-10-16T01:27:42.389600" elapsed="0.000289"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:27:42.390234" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:27:42.390048" elapsed="0.000210"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:27:42.425123" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:27:42.390863" elapsed="0.034463"/>
</kw>
<msg time="2026-10-16T01:27:42.425488" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:27:42.425530" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:42.390411" elapsed="0.035154"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:27:42.509506" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:42.426205" elapsed="0.083527"/>
</kw>
<msg time="2026-10-16T01:27:42.509892" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:27:42.509933" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:42.425771" elapsed="0.084197"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:42.510286" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:42.510073" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:42.510054" elapsed="0.000329"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:42.510937" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:42.510561" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:42.511280" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:42.511084" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:42.511067" elapsed="0.000305"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:27:42.511402" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:42.513894" 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-10-16T01:27:42.515591" elapsed="0.000514"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:27:42.517486" elapsed="0.002236"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:27:42.512197" elapsed="0.007597"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:27:42.511682" elapsed="0.008231"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:27:42.389003" elapsed="0.130994"/>
</kw>
<msg time="2026-10-16T01:27:42.520081" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:42.520121" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:42.388393" elapsed="0.131764"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:27:42.520313" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:27:42.520227" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:42.520209" elapsed="0.000181"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:27:42.520789" 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-10-16T01:27:42.521093" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:27:42.521157" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:27:42.387811" elapsed="0.133431"/>
</kw>
<msg time="2026-10-16T01:27:42.521323" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:42.521363" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:42.386027" elapsed="0.135371"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:42.521694" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:42.521464" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:42.521448" elapsed="0.000334"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:27:42.385892" elapsed="0.135912"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:27:42.124849" elapsed="0.396982"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:27:42.120035" elapsed="0.401845"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:27:42.115724" elapsed="0.406203"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:42.114797" elapsed="0.407171"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:27:42.111890" elapsed="0.410122"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:42.525417" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:42.525188" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:42.525171" elapsed="0.000320"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:27:42.525838" 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-10-16T01:27:42.525930" 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-10-16T01:27:42.525694" elapsed="0.000260"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:42.526430" level="INFO">Attempting to execute command "sudo ovs-vsctl del-br br-s1" on remote system "10.30.171.104" 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-10-16T01:27:42.526141" elapsed="0.000331"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:27:42.526999" level="INFO">${conn_id} = 711</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-10-16T01:27:42.526681" elapsed="0.000342"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:27:42.527859" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:27:42.527929" 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-10-16T01:27:42.527568" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:42.528099" elapsed="0.000282"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:27:42.529188" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:27:42.943694" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:27:30 UTC 2026

  System load:  0.0                Processes:             105
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%

 * Canonical Workshop gives developers fast, composable, reproducible, and
   secure developer environments that are perfect for agentic workflows.

   https://ubuntu.com/workshop

Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:27:36 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:27:42.528957" elapsed="0.414838"/>
</kw>
<msg time="2026-10-16T01:27:42.943855" 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-10-16T01:27:42.528560" elapsed="0.415352"/>
</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-10-16T01:27:42.527212" elapsed="0.416782"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:27:42.944359" level="INFO">Executing command 'sudo ovs-vsctl del-br br-s1'.</msg>
<msg time="2026-10-16T01:27:43.028116" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:27:43.028336" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:27:43.028423" 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-10-16T01:27:42.944201" elapsed="0.084270"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:27:43.028881" elapsed="0.000430"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:43.030342" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:43.029823" elapsed="0.000604"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:27:43.030827" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:43.030566" elapsed="0.000358"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:43.030527" elapsed="0.000477"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:27:43.031295" elapsed="0.000052"/>
</return>
<status status="PASS" start="2026-10-16T01:27:43.031112" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:43.031080" elapsed="0.000383"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:27:43.031532" elapsed="0.000028"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:43.033147" elapsed="0.000678"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:27:43.034329" elapsed="0.000330"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:27:43.035011" elapsed="0.000199"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:27:43.032237" elapsed="0.003077"/>
</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-10-16T01:27:42.524772" elapsed="0.510695"/>
</kw>
<msg time="2026-10-16T01:27:43.035570" 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-10-16T01:27:42.524238" elapsed="0.511945"/>
</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-10-16T01:27:42.523827" elapsed="0.512539"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:27:43.037503" 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-10-16T01:27:43.036853" elapsed="0.000704"/>
</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-10-16T01:27:43.044855" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:43.044074" elapsed="0.000837"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:43.045907" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:43.045243" elapsed="0.000717"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:43.046051" elapsed="0.000060"/>
</return>
<msg time="2026-10-16T01:27:43.046335" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:43.043232" elapsed="0.003153"/>
</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-10-16T01:27:43.052355" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:27:43.051748" elapsed="0.000661"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:27:43.052500" elapsed="0.000057"/>
</return>
<msg time="2026-10-16T01:27:43.052829" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:27:43.050988" elapsed="0.001893"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:43.055474" 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-10-16T01:27:43.054975" elapsed="0.000591"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:43.056521" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:43.056033" elapsed="0.000576"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:27:43.063344" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:27:43.063459" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:27:43.063752" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:27:43.057297" elapsed="0.007225">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:43.056795" elapsed="0.007951">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:27:43.065161" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:43.064820" elapsed="0.000540"/>
</branch>
<status status="FAIL" start="2026-10-16T01:27:43.056757" elapsed="0.008656">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:27:43.066224" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:43.066489" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:43.066417" elapsed="0.000156"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:43.066381" elapsed="0.000261"/>
</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-10-16T01:27:43.066980" elapsed="0.000046"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:27:43.067123" elapsed="0.000031"/>
</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-10-16T01:27:43.053531" elapsed="0.013807">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:43.067456" 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-10-16T01:27:43.050021" elapsed="0.017649">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:27:43.068167" elapsed="0.000050"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:27:43.046835" elapsed="0.021487">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:27:43.046489" elapsed="0.021944">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:27:43.042133" elapsed="0.026542">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:27:44.075172" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:44.074351" elapsed="0.000879"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:44.076233" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:44.075567" elapsed="0.000720"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:44.076379" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:27:44.076689" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:44.073506" elapsed="0.003264"/>
</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-10-16T01:27:44.082561" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:27:44.081959" elapsed="0.000677"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:27:44.082760" elapsed="0.000060"/>
</return>
<msg time="2026-10-16T01:27:44.083036" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:27:44.081205" elapsed="0.001881"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:44.085739" 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-10-16T01:27:44.085181" elapsed="0.000656"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:44.086786" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:44.086253" elapsed="0.000623"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:27:44.093091" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:27:44.093202" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:27:44.093490" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:27:44.087506" elapsed="0.007175">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:44.087008" elapsed="0.007873">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:27:44.095295" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:44.094953" elapsed="0.000472"/>
</branch>
<status status="FAIL" start="2026-10-16T01:27:44.086972" elapsed="0.008503">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:27:44.096255" elapsed="0.000056"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:44.096525" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:44.096452" elapsed="0.000158"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:44.096416" elapsed="0.000263"/>
</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-10-16T01:27:44.097016" elapsed="0.000044"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:27:44.097156" 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-10-16T01:27:44.083782" elapsed="0.013586">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:44.097485" 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-10-16T01:27:44.080246" elapsed="0.017448">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:27:44.098179" elapsed="0.000049"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:27:44.077120" elapsed="0.021211">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:27:44.076877" elapsed="0.021565">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:27:44.072376" elapsed="0.026270">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:27:45.105056" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:45.104251" elapsed="0.000864"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:45.106127" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:45.105451" elapsed="0.000732"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:45.106274" elapsed="0.000062"/>
</return>
<msg time="2026-10-16T01:27:45.106563" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:45.103412" elapsed="0.003202"/>
</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-10-16T01:27:45.112461" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:27:45.111859" elapsed="0.000657"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:27:45.112745" elapsed="0.000064"/>
</return>
<msg time="2026-10-16T01:27:45.113032" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:27:45.111110" elapsed="0.001974"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:45.115734" 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-10-16T01:27:45.115185" elapsed="0.000646"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:45.116786" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:45.116249" 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-10-16T01:27:45.122905" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:27:45.123014" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:27:45.123215" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:27:45.117506" elapsed="0.006471">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:45.117008" elapsed="0.007127">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:27:45.124541" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:45.124205" elapsed="0.000522"/>
</branch>
<status status="FAIL" start="2026-10-16T01:27:45.116973" elapsed="0.007808">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:27:45.125920" elapsed="0.000055"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:45.126187" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:45.126115" elapsed="0.000154"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:45.126080" 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-10-16T01:27:45.126618" elapsed="0.000067"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:27:45.126809" 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-10-16T01:27:45.113782" elapsed="0.013240">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:45.127140" 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-10-16T01:27:45.110153" elapsed="0.017176">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:27:45.127833" elapsed="0.000051"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:27:45.107016" elapsed="0.020974">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:27:45.106769" elapsed="0.021332">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:27:45.102296" elapsed="0.025985">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:27:46.135356" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:46.134449" elapsed="0.001882"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:46.137392" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:46.136751" elapsed="0.000698"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:46.137547" elapsed="0.000065"/>
</return>
<msg time="2026-10-16T01:27:46.137900" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:46.133135" elapsed="0.004818"/>
</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-10-16T01:27:46.144063" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:27:46.143273" elapsed="0.000848"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:27:46.144218" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:27:46.144490" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:27:46.142493" elapsed="0.002048"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:46.147209" 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-10-16T01:27:46.146677" elapsed="0.000627"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:46.148529" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:46.147766" elapsed="0.000889"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:27:46.155270" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:27:46.155381" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:27:46.155588" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:27:46.149539" elapsed="0.006862">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:46.148833" elapsed="0.007730">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:27:46.157022" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:46.156653" elapsed="0.000501"/>
</branch>
<status status="FAIL" start="2026-10-16T01:27:46.148793" elapsed="0.008410">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:27:46.157983" elapsed="0.000052"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:46.158248" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:46.158176" elapsed="0.000153"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:46.158140" 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-10-16T01:27:46.158697" elapsed="0.000072"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:27:46.158867" elapsed="0.000030"/>
</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-10-16T01:27:46.145255" elapsed="0.013820">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:46.159194" 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-10-16T01:27:46.141477" elapsed="0.017905">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:27:46.159965" elapsed="0.000051"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:27:46.138307" elapsed="0.021818">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:27:46.138062" elapsed="0.022175">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:27:46.132003" elapsed="0.028859">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:27:47.167901" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:47.167005" elapsed="0.000964"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:47.168993" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:47.168315" elapsed="0.000733"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:47.169147" elapsed="0.000073"/>
</return>
<msg time="2026-10-16T01:27:47.169450" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:47.166157" elapsed="0.003345"/>
</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-10-16T01:27:47.175484" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:27:47.174872" elapsed="0.000667"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:27:47.175657" elapsed="0.000086"/>
</return>
<msg time="2026-10-16T01:27:47.175961" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:27:47.174106" elapsed="0.001907"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:47.178666" 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-10-16T01:27:47.178132" elapsed="0.000660"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:47.179751" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:47.179215" elapsed="0.000629"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:27:47.186292" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:27:47.186406" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:27:47.186619" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:27:47.180501" elapsed="0.006935">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:47.179990" elapsed="0.007608">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:27:47.188058" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:47.187690" elapsed="0.000498"/>
</branch>
<status status="FAIL" start="2026-10-16T01:27:47.179951" elapsed="0.008287">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:27:47.189061" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:47.189436" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:47.189359" elapsed="0.000162"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:47.189320" elapsed="0.000247"/>
</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-10-16T01:27:47.189932" elapsed="0.000045"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:27:47.190076" 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-10-16T01:27:47.176697" elapsed="0.013594">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:47.190414" 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-10-16T01:27:47.173104" elapsed="0.017501">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:27:47.191120" elapsed="0.000051"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:27:47.169925" elapsed="0.021353">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:27:47.169617" elapsed="0.021777">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:27:47.164911" elapsed="0.026667">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:27:48.198412" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:48.197600" elapsed="0.000871"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:48.199479" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:48.198863" elapsed="0.000671"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:48.199625" elapsed="0.000114"/>
</return>
<msg time="2026-10-16T01:27:48.199974" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:48.196810" elapsed="0.003216"/>
</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-10-16T01:27:48.205871" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:27:48.205218" elapsed="0.000710"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:27:48.206021" elapsed="0.000057"/>
</return>
<msg time="2026-10-16T01:27:48.206289" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:27:48.204456" elapsed="0.001883"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:48.208986" 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-10-16T01:27:48.208421" elapsed="0.000658"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:48.210043" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:27:48.209495" elapsed="0.000637"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:27:48.216143" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:27:48.216254" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:27:48.216472" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:27:48.210818" elapsed="0.006490">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:27:48.210264" elapsed="0.007204">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:27:48.217937" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:48.217538" elapsed="0.000533"/>
</branch>
<status status="FAIL" start="2026-10-16T01:27:48.210228" elapsed="0.007892">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:27:48.218903" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:48.219168" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:48.219096" elapsed="0.000155"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:27:48.219061" 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-10-16T01:27:48.219597" elapsed="0.000066"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:27:48.219788" 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-10-16T01:27:48.207031" elapsed="0.012969">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:27:48.220118" elapsed="0.000031"/>
</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-10-16T01:27:48.203510" elapsed="0.016792">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:27:48.220807" elapsed="0.000051"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:27:48.200374" elapsed="0.020588">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:27:48.200130" elapsed="0.020945">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:27:48.195664" elapsed="0.025592">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<msg time="2026-10-16T01:27:48.221443" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</msg>
<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="FAIL" start="2026-10-16T01:27:43.038047" elapsed="5.183585">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<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-10-16T01:27:42.523425" elapsed="5.698500">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<doc>Delete bridge with OVS command and verify it gets deleted from all instances.</doc>
<status status="FAIL" start="2026-10-16T01:27:42.110686" elapsed="6.111526">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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-10-16T01:27:48.225808" elapsed="0.000463"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:27:48.224810" elapsed="0.001574"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:48.228494" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:48.228301" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:48.228262" elapsed="0.000399"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:48.232968" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:48.232779" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:48.232739" elapsed="0.000370"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:48.235176" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:48.234394" elapsed="0.000839"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:48.236235" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:48.235568" elapsed="0.000721"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:48.236381" elapsed="0.000061"/>
</return>
<msg time="2026-10-16T01:27:48.236761" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:48.233549" elapsed="0.003267"/>
</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-10-16T01:27:48.242296" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:48.242106" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:48.242068" elapsed="0.000388"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:48.244053" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:48.243937" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:48.243914" elapsed="0.000226"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:27:48.244675" level="INFO">${karaf_connection_index} = 598</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:27:48.244342" elapsed="0.000397"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:27:48.245230" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:27:48.244969" elapsed="0.000295"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:27:48.278155" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:27:48.246100" elapsed="0.032320"/>
</kw>
<msg time="2026-10-16T01:27:48.278655" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:27:48.278743" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:48.245475" elapsed="0.033323"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:27:48.350346" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:48.279613" elapsed="0.070918"/>
</kw>
<msg time="2026-10-16T01:27:48.350729" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:27:48.350774" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:48.279026" elapsed="0.071784"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:48.351096" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:48.350883" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:48.350864" elapsed="0.000328"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:48.351885" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:48.351374" elapsed="0.000594"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:48.352234" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:48.352031" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:48.352014" elapsed="0.000315"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:27:48.352360" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:48.354962" 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-10-16T01:27:48.356793" elapsed="0.000481"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:27:48.359010" 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-10-16T01:27:48.353209" elapsed="0.006186"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:27:48.352659" elapsed="0.006853"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:27:48.243532" elapsed="0.116059"/>
</kw>
<msg time="2026-10-16T01:27:48.359693" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:48.359816" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:48.242694" elapsed="0.117159"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:27:48.360009" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:27:48.359923" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:48.359906" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:27:48.360409" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:48.360736" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:27:48.360801" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:27:48.241411" elapsed="0.119475"/>
</kw>
<msg time="2026-10-16T01:27:48.360968" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:48.361007" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:48.237538" elapsed="0.123504"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:48.361324" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:48.361108" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:48.361093" elapsed="0.000303"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:27:48.237226" elapsed="0.124191"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:48.363863" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:48.363778" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:48.363761" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:48.365025" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:48.364941" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:48.364925" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:27:48.365449" level="INFO">${karaf_connection_index} = 600</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:27:48.365227" elapsed="0.000247"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:27:48.365851" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:27:48.365633" elapsed="0.000243"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:27:48.399373" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:27:48.366436" elapsed="0.033117"/>
</kw>
<msg time="2026-10-16T01:27:48.399754" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:27:48.399798" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:48.366028" elapsed="0.033805"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:27:48.463293" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:48.400433" elapsed="0.063073"/>
</kw>
<msg time="2026-10-16T01:27:48.463681" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:27:48.463745" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:48.400000" elapsed="0.063783"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:48.464061" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:48.463854" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:48.463836" elapsed="0.000320"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:48.464686" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:48.464334" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:48.465040" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:48.464843" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:48.464827" elapsed="0.000306"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:27:48.465163" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:48.467795" 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-10-16T01:27:48.469491" elapsed="0.000487"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:27:48.471342" 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-10-16T01:27:48.466104" elapsed="0.005649"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:27:48.465429" elapsed="0.006443"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:27:48.364663" elapsed="0.107286"/>
</kw>
<msg time="2026-10-16T01:27:48.472030" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:48.472069" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:48.364070" elapsed="0.108034"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:27:48.472257" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:27:48.472173" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:48.472156" elapsed="0.000177"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:27:48.472649" 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-10-16T01:27:48.473032" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:27:48.473097" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:27:48.363457" elapsed="0.109724"/>
</kw>
<msg time="2026-10-16T01:27:48.473262" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:48.473300" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:48.361678" elapsed="0.111658"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:48.473616" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:48.473402" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:48.473386" elapsed="0.000335"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:27:48.361525" elapsed="0.112218"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:48.476136" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:48.476050" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:48.476032" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:48.477337" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:48.477251" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:48.477234" elapsed="0.000166"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:27:48.477804" 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-10-16T01:27:48.477542" elapsed="0.000286"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:27:48.478170" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:27:48.477989" elapsed="0.000205"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:27:48.514089" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:27:48.478791" elapsed="0.035477"/>
</kw>
<msg time="2026-10-16T01:27:48.514451" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:27:48.514493" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:48.478349" elapsed="0.036179"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:27:48.578554" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:48.515158" elapsed="0.063606"/>
</kw>
<msg time="2026-10-16T01:27:48.578920" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:27:48.578961" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:48.514727" elapsed="0.064269"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:48.579283" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:48.579075" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:48.579047" elapsed="0.000329"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:48.579935" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:48.579554" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:48.580271" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:48.580076" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:48.580060" elapsed="0.000303"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:27:48.580393" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:48.582865" elapsed="0.000470"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:27:48.584569" elapsed="0.000635"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:27:48.586413" elapsed="0.000370"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:27:48.581182" elapsed="0.005670"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:27:48.580670" elapsed="0.006297"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:27:48.476992" elapsed="0.110051"/>
</kw>
<msg time="2026-10-16T01:27:48.587125" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:48.587163" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:48.476380" elapsed="0.110818"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:27:48.587351" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:27:48.587267" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:48.587251" elapsed="0.000176"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:27:48.587977" elapsed="0.000054"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:48.588312" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:27:48.588377" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:27:48.475759" elapsed="0.112702"/>
</kw>
<msg time="2026-10-16T01:27:48.588542" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:48.588581" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:48.473985" elapsed="0.114630"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:48.588930" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:48.588712" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:48.588682" elapsed="0.000319"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:27:48.473849" elapsed="0.115173"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:27:48.236919" elapsed="0.352129"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:27:48.232004" elapsed="0.357092"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:27:48.227729" elapsed="0.361418"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:48.226803" elapsed="0.362384"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:27:48.224000" elapsed="0.365234"/>
</kw>
<kw name="Verify Sample Port Is Modified" owner="ClusterOvsdb">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:27:48.591379" 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-10-16T01:27:48.591052" elapsed="0.000357"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:27:48.595909" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:27:48.594604" elapsed="0.001340">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:27:49.605201" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:27:49.602269" elapsed="0.003014">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:27:50.614518" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:27:50.611562" elapsed="0.003037">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:27:51.625819" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:27:51.622885" elapsed="0.003017">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:27:52.635299" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:27:52.632367" elapsed="0.003018">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:27:53.644771" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:27:53.641793" elapsed="0.003063">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<msg time="2026-10-16T01:27:53.645172" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: Variable '${ovsdb_uuid}' not found.</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-10-16T01:27:48.591609" elapsed="5.053845">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: Variable '${ovsdb_uuid}' not found.</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-10-16T01:27:48.590678" elapsed="5.055086">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: Variable '${ovsdb_uuid}' not found.</status>
</kw>
<doc>Verify modified port exists in all instances.</doc>
<status status="FAIL" start="2026-10-16T01:27:48.222915" elapsed="5.423145">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: Variable '${ovsdb_uuid}' not found.</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-10-16T01:27:53.649357" elapsed="0.000573"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:27:53.648797" elapsed="0.001249"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:53.652206" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:53.651980" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:53.651935" elapsed="0.000427"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:53.656879" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:53.656535" elapsed="0.000453"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:53.656493" elapsed="0.000542"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:53.659193" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:53.658359" elapsed="0.000891"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:53.660249" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:53.659586" elapsed="0.000717"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:53.660395" elapsed="0.000060"/>
</return>
<msg time="2026-10-16T01:27:53.660742" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:53.657486" elapsed="0.003313"/>
</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-10-16T01:27:53.670525" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:53.670332" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:53.670292" elapsed="0.000399"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:53.673319" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:53.673134" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:53.673096" elapsed="0.000364"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:27:53.674349" level="INFO">${karaf_connection_index} = 598</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:27:53.673833" elapsed="0.000572"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:27:53.675572" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:27:53.674824" elapsed="0.000805"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:27:53.712443" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:27:53.677038" elapsed="0.035682"/>
</kw>
<msg time="2026-10-16T01:27:53.712941" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:27:53.712999" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:53.676053" elapsed="0.036995"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:27:53.788336" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:53.713890" elapsed="0.074633"/>
</kw>
<msg time="2026-10-16T01:27:53.788779" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:27:53.788822" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:53.713271" elapsed="0.075588"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:53.789138" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:53.788930" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:53.788911" elapsed="0.000322"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:53.789795" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:53.789410" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:53.790135" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:53.789939" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:53.789922" elapsed="0.000306"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:27:53.790259" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:53.792774" 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-10-16T01:27:53.794565" elapsed="0.000520"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:27:53.796459" 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-10-16T01:27:53.791078" elapsed="0.005801"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:27:53.790542" elapsed="0.006455"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:27:53.672488" elapsed="0.124584"/>
</kw>
<msg time="2026-10-16T01:27:53.797151" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:53.797190" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:53.671111" elapsed="0.126114"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:27:53.797375" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:27:53.797291" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:53.797275" elapsed="0.000176"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:27:53.797878" 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-10-16T01:27:53.798172" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:27:53.798235" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:27:53.669551" elapsed="0.128767"/>
</kw>
<msg time="2026-10-16T01:27:53.798400" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:53.798438" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:53.661536" elapsed="0.136937"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:53.798800" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:53.798539" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:53.798523" elapsed="0.000350"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:27:53.661227" elapsed="0.137668"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:53.801413" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:53.801328" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:53.801311" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:53.802599" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:53.802515" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:53.802498" elapsed="0.000177"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:27:53.803064" level="INFO">${karaf_connection_index} = 600</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:27:53.802839" elapsed="0.000249"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:27:53.803426" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:27:53.803246" elapsed="0.000203"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:27:53.836642" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:27:53.804044" elapsed="0.032823"/>
</kw>
<msg time="2026-10-16T01:27:53.837023" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:27:53.837064" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:53.803601" elapsed="0.033498"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:27:53.905503" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:53.838299" elapsed="0.067430"/>
</kw>
<msg time="2026-10-16T01:27:53.905896" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:27:53.905937" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:53.837272" elapsed="0.068701"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:53.906268" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:53.906052" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:53.906030" elapsed="0.000336"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:53.906923" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:53.906544" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:53.907264" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:53.907068" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:53.907052" elapsed="0.000305"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:27:53.907388" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:53.909950" elapsed="0.000478"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:27:53.911642" elapsed="0.000497"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:27:53.913468" 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-10-16T01:27:53.908231" elapsed="0.005635"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:27:53.907721" elapsed="0.006258"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:27:53.802259" elapsed="0.111797"/>
</kw>
<msg time="2026-10-16T01:27:53.914141" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:53.914180" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:53.801653" elapsed="0.112563"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:27:53.914368" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:27:53.914284" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:53.914267" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:27:53.914912" 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-10-16T01:27:53.915219" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:27:53.915283" 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-10-16T01:27:53.801037" elapsed="0.114332"/>
</kw>
<msg time="2026-10-16T01:27:53.915454" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:53.915493" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:53.799140" elapsed="0.116389"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:53.915853" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:53.915595" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:53.915580" elapsed="0.000345"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:27:53.799005" elapsed="0.116941"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:53.918518" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:53.918435" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:53.918419" elapsed="0.000162"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:53.919727" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:53.919601" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:53.919584" elapsed="0.000208"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:27:53.920159" 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-10-16T01:27:53.919933" elapsed="0.000250"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:27:53.920523" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:27:53.920339" elapsed="0.000208"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:27:53.953862" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:27:53.921159" elapsed="0.032894"/>
</kw>
<msg time="2026-10-16T01:27:53.954207" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:27:53.954248" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:53.920747" elapsed="0.033536"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:27:54.034097" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:53.954900" elapsed="0.079377"/>
</kw>
<msg time="2026-10-16T01:27:54.034431" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:27:54.034472" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:53.954446" elapsed="0.080061"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:54.034811" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:54.034577" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:54.034558" elapsed="0.000349"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:54.035420" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:54.035087" elapsed="0.000415"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:54.035784" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:54.035561" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:54.035546" elapsed="0.000364"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:27:54.035941" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:54.038380" 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-10-16T01:27:54.040129" elapsed="0.000449"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:27:54.041958" elapsed="0.000308"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:27:54.036734" elapsed="0.005598"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:27:54.036204" elapsed="0.006244"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:27:53.919346" elapsed="0.123179"/>
</kw>
<msg time="2026-10-16T01:27:54.042606" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:54.042646" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:53.918774" elapsed="0.123994"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:27:54.042926" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:27:54.042841" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:54.042824" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:27:54.043311" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:54.043606" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:27:54.043684" 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-10-16T01:27:53.918140" elapsed="0.125647"/>
</kw>
<msg time="2026-10-16T01:27:54.043869" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:54.043909" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:53.916199" elapsed="0.127744"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:54.044222" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:54.044009" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:54.043994" elapsed="0.000299"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:27:53.916063" elapsed="0.128251"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:27:53.660911" elapsed="0.383431"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:27:53.655874" elapsed="0.388522"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:27:53.651339" elapsed="0.393110"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:53.650376" elapsed="0.394116"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:27:53.647962" elapsed="0.396577"/>
</kw>
<kw name="Delete Sample Port And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:27:54.048593" 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-10-16T01:27:54.047434" elapsed="0.001194">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-10-16T01:27:53.646773" elapsed="0.402018">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-10-16T01:27:54.050301" elapsed="0.000199"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:27:54.050060" elapsed="0.000490"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:54.051479" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:54.051394" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:54.051377" elapsed="0.000165"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:54.053426" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:54.053344" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:54.053328" elapsed="0.000160"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:54.054405" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:54.054080" elapsed="0.000351"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:54.054887" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:54.054579" elapsed="0.000332"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:54.054951" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:27:54.055075" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:54.053723" elapsed="0.001375"/>
</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-10-16T01:27:54.057589" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:54.057505" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:54.057488" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:54.058763" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:54.058639" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:54.058623" elapsed="0.000203"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:27:54.059189" level="INFO">${karaf_connection_index} = 598</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:27:54.058967" elapsed="0.000247"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:27:54.059550" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:27:54.059371" elapsed="0.000202"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:27:54.092410" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:27:54.060216" elapsed="0.032372"/>
</kw>
<msg time="2026-10-16T01:27:54.092775" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:27:54.092817" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:54.059807" elapsed="0.033045"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:27:54.176205" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:54.093431" elapsed="0.082969"/>
</kw>
<msg time="2026-10-16T01:27:54.176564" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:27:54.176608" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:54.093014" elapsed="0.083630"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:54.176966" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:54.176757" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:54.176737" elapsed="0.000327"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:54.177587" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:54.177243" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:54.177971" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:54.177773" elapsed="0.000345"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:54.177756" elapsed="0.000390"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:27:54.178178" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:54.180632" 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-10-16T01:27:54.182394" elapsed="0.000475"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:27:54.184444" elapsed="0.000362"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:27:54.178982" elapsed="0.005891"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:27:54.178446" elapsed="0.006545"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:27:54.058386" elapsed="0.126683"/>
</kw>
<msg time="2026-10-16T01:27:54.185151" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:54.185191" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:54.057825" elapsed="0.127401"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:27:54.185379" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:27:54.185294" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:54.185277" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:27:54.185861" 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-10-16T01:27:54.186165" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:27:54.186229" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:27:54.057218" elapsed="0.129096"/>
</kw>
<msg time="2026-10-16T01:27:54.186396" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:54.186435" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:54.055422" elapsed="0.131047"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:54.186782" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:54.186536" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:54.186520" elapsed="0.000335"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:27:54.055286" elapsed="0.131590"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:54.189425" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:54.189341" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:54.189325" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:54.190584" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:54.190500" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:54.190483" elapsed="0.000165"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:27:54.191052" level="INFO">${karaf_connection_index} = 600</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:27:54.190827" elapsed="0.000250"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:27:54.191415" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:27:54.191235" elapsed="0.000203"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:27:54.226961" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:27:54.192037" elapsed="0.035100"/>
</kw>
<msg time="2026-10-16T01:27:54.227295" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:27:54.227336" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:54.191591" elapsed="0.035780"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:27:54.328143" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:54.228041" elapsed="0.100292"/>
</kw>
<msg time="2026-10-16T01:27:54.328491" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:27:54.328532" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:54.227575" elapsed="0.100992"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:54.328878" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:54.328637" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:54.328619" elapsed="0.000355"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:54.329489" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:54.329155" elapsed="0.000419"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:54.329862" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:54.329635" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:54.329618" elapsed="0.000337"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:27:54.329986" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:54.332429" 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-10-16T01:27:54.334172" elapsed="0.000446"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:27:54.336046" elapsed="0.000304"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:27:54.330781" elapsed="0.005635"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:27:54.330252" elapsed="0.006279"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:27:54.190246" elapsed="0.146362"/>
</kw>
<msg time="2026-10-16T01:27:54.336720" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:54.336762" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:54.189634" elapsed="0.147164"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:27:54.336954" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:27:54.336868" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:54.336851" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:27:54.337350" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:54.337650" elapsed="0.000038"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:27:54.337823" 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-10-16T01:27:54.189051" elapsed="0.148862"/>
</kw>
<msg time="2026-10-16T01:27:54.337995" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:54.338035" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:54.187122" elapsed="0.150948"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:54.338354" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:54.338137" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:54.338121" elapsed="0.000349"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:27:54.186985" elapsed="0.151508"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:54.341070" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:54.340985" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:54.340967" elapsed="0.000167"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:54.342240" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:54.342157" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:54.342140" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:27:54.342683" 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-10-16T01:27:54.342445" elapsed="0.000279"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:27:54.343066" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:27:54.342884" elapsed="0.000206"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:27:54.375491" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:27:54.343745" elapsed="0.031946"/>
</kw>
<msg time="2026-10-16T01:27:54.375870" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:27:54.375911" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:54.343244" elapsed="0.032703"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:27:54.455710" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:54.376531" elapsed="0.079368"/>
</kw>
<msg time="2026-10-16T01:27:54.456058" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:27:54.456100" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:54.376110" elapsed="0.080025"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:54.456405" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:54.456205" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:54.456187" elapsed="0.000312"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:54.457050" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:54.456696" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:54.457390" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:54.457197" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:54.457180" elapsed="0.000302"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:27:54.457513" elapsed="0.000024"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:54.459976" elapsed="0.000473"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:27:54.461658" elapsed="0.000480"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:27:54.463300" elapsed="0.000304"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:27:54.458291" elapsed="0.005394"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:27:54.457806" elapsed="0.006018"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:27:54.341902" elapsed="0.121998"/>
</kw>
<msg time="2026-10-16T01:27:54.463981" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:54.464060" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:54.341281" elapsed="0.122816"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:27:54.464251" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:27:54.464166" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:54.464150" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:27:54.464642" 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-10-16T01:27:54.465254" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:27:54.465319" 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-10-16T01:27:54.340658" elapsed="0.124746"/>
</kw>
<msg time="2026-10-16T01:27:54.465487" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:54.465527" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:54.338791" elapsed="0.126770"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:54.465875" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:54.465628" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:54.465612" elapsed="0.000335"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:27:54.338604" elapsed="0.127364"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:27:54.055148" elapsed="0.410846"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:27:54.053055" elapsed="0.412989"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:27:54.051110" elapsed="0.414985"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:54.050722" elapsed="0.415413"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:27:54.049721" elapsed="0.416461"/>
</kw>
<kw name="Delete Sample Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:27:54.470143" 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-10-16T01:27:54.468985" elapsed="0.001193">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-10-16T01:27:54.049158" elapsed="0.421143">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-10-16T01:27:54.471732" elapsed="0.000202"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:27:54.471460" 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-10-16T01:27:54.472879" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:54.472793" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:54.472776" elapsed="0.000166"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:54.474823" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:54.474740" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:54.474722" elapsed="0.000163"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:54.475793" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:54.475437" elapsed="0.000382"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:54.476236" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:54.475968" elapsed="0.000291"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:54.476300" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:27:54.476425" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:54.475083" elapsed="0.001365"/>
</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-10-16T01:27:54.479060" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:54.478975" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:54.478958" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:54.480231" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:54.480148" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:54.480132" elapsed="0.000161"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:27:54.480659" level="INFO">${karaf_connection_index} = 598</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:27:54.480436" elapsed="0.000293"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:27:54.481074" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:27:54.480892" elapsed="0.000207"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:27:54.513937" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:27:54.481658" elapsed="0.032456"/>
</kw>
<msg time="2026-10-16T01:27:54.514269" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:27:54.514310" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:54.481250" elapsed="0.033096"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:27:54.603842" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:54.514972" elapsed="0.089066"/>
</kw>
<msg time="2026-10-16T01:27:54.604194" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:27:54.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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:54.514508" elapsed="0.089764"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:54.604545" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:54.604341" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:54.604324" elapsed="0.000316"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:54.605194" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:54.604856" elapsed="0.000431"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:54.605543" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:54.605348" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:54.605331" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:27:54.605688" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:54.608141" 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-10-16T01:27:54.609881" elapsed="0.000448"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:27:54.611507" elapsed="0.000547"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:27:54.606454" elapsed="0.005667"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:27:54.605969" elapsed="0.006267"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:27:54.479890" elapsed="0.132423"/>
</kw>
<msg time="2026-10-16T01:27:54.612394" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:54.612434" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:54.479271" elapsed="0.133232"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:27:54.612679" elapsed="0.000043"/>
</return>
<status status="PASS" start="2026-10-16T01:27:54.612575" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:54.612557" 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-10-16T01:27:54.613094" 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-10-16T01:27:54.613398" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:27:54.613463" 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-10-16T01:27:54.478656" elapsed="0.134892"/>
</kw>
<msg time="2026-10-16T01:27:54.613631" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:54.613683" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:54.476846" elapsed="0.136963"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:54.614098" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:54.613879" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:54.613863" elapsed="0.000306"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:27:54.476692" elapsed="0.137499"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:54.616885" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:54.616789" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:54.616771" elapsed="0.000178"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:54.618062" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:54.617980" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:54.617963" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:27:54.618485" level="INFO">${karaf_connection_index} = 600</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:27:54.618266" elapsed="0.000244"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:27:54.618886" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:27:54.618689" elapsed="0.000221"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:27:54.654308" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:27:54.619469" elapsed="0.035013"/>
</kw>
<msg time="2026-10-16T01:27:54.654638" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:27:54.654693" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:54.619061" elapsed="0.035685"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:27:54.741637" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:54.655329" elapsed="0.086529"/>
</kw>
<msg time="2026-10-16T01:27:54.742015" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:27:54.742056" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:54.654910" elapsed="0.087182"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:54.742361" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:54.742161" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:54.742143" elapsed="0.000313"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:54.742999" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:54.742635" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:54.743384" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:54.743187" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:54.743170" elapsed="0.000310"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:27:54.743511" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:54.745980" elapsed="0.000470"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:27:54.747677" elapsed="0.000470"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:27:54.749515" 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-10-16T01:27:54.744303" elapsed="0.005612"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:27:54.743815" elapsed="0.006215"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:27:54.617721" elapsed="0.132386"/>
</kw>
<msg time="2026-10-16T01:27:54.750188" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:54.750228" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:54.617096" elapsed="0.133167"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:27:54.750416" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:27:54.750332" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:54.750315" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:27:54.750861" 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-10-16T01:27:54.751157" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:27:54.751221" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:27:54.616438" elapsed="0.134866"/>
</kw>
<msg time="2026-10-16T01:27:54.751387" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:54.751426" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:54.614432" elapsed="0.137030"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:54.751797" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:54.751529" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:54.751513" elapsed="0.000358"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:27:54.614298" elapsed="0.137594"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:54.754465" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:54.754381" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:54.754364" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:54.755611" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:54.755528" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:54.755512" elapsed="0.000174"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:27:54.756074" 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-10-16T01:27:54.755850" elapsed="0.000249"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:27:54.756435" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:27:54.756256" elapsed="0.000203"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:27:54.789963" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:27:54.757052" elapsed="0.033086"/>
</kw>
<msg time="2026-10-16T01:27:54.790346" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:27:54.790389" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:54.756609" elapsed="0.033815"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:27:54.872339" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:54.791047" elapsed="0.081479"/>
</kw>
<msg time="2026-10-16T01:27:54.872717" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:27:54.872761" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:54.790586" elapsed="0.082211"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:54.873072" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:54.872869" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:54.872850" elapsed="0.000317"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:54.873694" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:54.873344" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:54.874063" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:54.873868" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:54.873852" elapsed="0.000304"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:27:54.874187" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:54.876645" 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-10-16T01:27:54.878372" elapsed="0.000489"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:27:54.880237" elapsed="0.000306"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:27:54.874988" elapsed="0.005621"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:27:54.874457" elapsed="0.006321"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:27:54.755273" elapsed="0.125584"/>
</kw>
<msg time="2026-10-16T01:27:54.880938" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:54.880977" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:54.754689" elapsed="0.126323"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:27:54.881165" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:27:54.881081" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:54.881064" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:27:54.881558" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:54.881962" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:27:54.882029" 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-10-16T01:27:54.754090" elapsed="0.128026"/>
</kw>
<msg time="2026-10-16T01:27:54.882199" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:54.882238" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:54.752136" elapsed="0.130139"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:54.882646" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:54.882414" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:54.882396" elapsed="0.000354"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:27:54.752000" elapsed="0.130772"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:27:54.476530" elapsed="0.406270"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:27:54.474421" elapsed="0.408432"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:27:54.472510" elapsed="0.410395"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:54.472132" elapsed="0.410816"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:27:54.471128" elapsed="0.411870"/>
</kw>
<kw name="Create Sample Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:27:54.887204" 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-10-16T01:27:54.885926" elapsed="0.001314">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-10-16T01:27:54.470573" elapsed="0.416797">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-10-16T01:27:54.889190" elapsed="0.000201"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:27:54.888949" elapsed="0.000492"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:54.890346" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:54.890261" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:54.890244" elapsed="0.000165"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:54.892314" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:54.892230" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:54.892213" elapsed="0.000164"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:54.893292" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:54.892969" elapsed="0.000348"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:54.893773" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:54.893467" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:54.893839" elapsed="0.000026"/>
</return>
<msg time="2026-10-16T01:27:54.893965" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:54.892576" elapsed="0.001412"/>
</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-10-16T01:27:54.897495" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:54.897410" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:54.897393" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:54.898652" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:54.898570" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:54.898553" elapsed="0.000198"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:27:54.899120" level="INFO">${karaf_connection_index} = 598</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:27:54.898897" elapsed="0.000248"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:27:54.899485" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:27:54.899303" elapsed="0.000206"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:27:54.932593" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:27:54.900104" elapsed="0.032708"/>
</kw>
<msg time="2026-10-16T01:27:54.932970" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:27:54.933052" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:54.899661" elapsed="0.033430"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:27:55.020172" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:54.933693" elapsed="0.086667"/>
</kw>
<msg time="2026-10-16T01:27:55.020516" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:27:55.020557" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:54.933255" elapsed="0.087338"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:55.020903" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:55.020662" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:55.020644" elapsed="0.000355"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:55.021511" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:55.021177" elapsed="0.000420"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:55.021883" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:55.021657" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:55.021641" elapsed="0.000336"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:27:55.022009" elapsed="0.000024"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:55.024468" 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-10-16T01:27:55.026198" elapsed="0.000451"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:27:55.028060" elapsed="0.000308"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:27:55.022799" elapsed="0.005635"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:27:55.022272" elapsed="0.006279"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:27:54.898313" elapsed="0.130316"/>
</kw>
<msg time="2026-10-16T01:27:55.028741" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:55.028783" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:54.897736" elapsed="0.131083"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:27:55.028973" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:27:55.028888" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:55.028871" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:27:55.029363" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:55.029661" elapsed="0.000126"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:27:55.029833" 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-10-16T01:27:54.897117" elapsed="0.132804"/>
</kw>
<msg time="2026-10-16T01:27:55.030004" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:55.030042" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:54.894313" elapsed="0.135765"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:55.030398" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:55.030182" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:55.030165" elapsed="0.000305"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:27:54.894176" elapsed="0.136316"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:55.033039" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:55.032955" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:55.032937" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:55.034208" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:55.034125" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:55.034109" elapsed="0.000162"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:27:55.034632" level="INFO">${karaf_connection_index} = 600</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:27:55.034411" elapsed="0.000246"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:27:55.035050" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:27:55.034867" elapsed="0.000207"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:27:55.067639" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:27:55.035637" elapsed="0.032217"/>
</kw>
<msg time="2026-10-16T01:27:55.068024" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:27:55.068066" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:55.035226" elapsed="0.032876"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:27:55.147586" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:55.068721" elapsed="0.079079"/>
</kw>
<msg time="2026-10-16T01:27:55.147957" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:27:55.147998" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:55.068264" elapsed="0.079769"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:55.148303" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:55.148103" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:55.148085" elapsed="0.000311"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:55.148947" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:55.148572" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:55.149287" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:55.149092" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:55.149076" elapsed="0.000303"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:27:55.149409" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:55.151862" 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-10-16T01:27:55.153543" elapsed="0.000485"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:27:55.155381" 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-10-16T01:27:55.150194" elapsed="0.005591"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:27:55.149684" elapsed="0.006217"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:27:55.033870" elapsed="0.122145"/>
</kw>
<msg time="2026-10-16T01:27:55.156098" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:55.156137" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:55.033250" elapsed="0.122923"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:27:55.156325" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:27:55.156240" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:55.156224" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:27:55.156824" 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-10-16T01:27:55.157127" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:27:55.157191" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:27:55.032631" elapsed="0.124645"/>
</kw>
<msg time="2026-10-16T01:27:55.157358" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:55.157397" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:55.030765" elapsed="0.126668"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:55.157739" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:55.157499" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:55.157484" elapsed="0.000328"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:27:55.030602" elapsed="0.127231"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:55.160364" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:55.160279" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:55.160262" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:55.161524" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:55.161439" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:55.161422" elapsed="0.000166"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:27:55.161989" 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-10-16T01:27:55.161764" elapsed="0.000250"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:27:55.162354" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:27:55.162172" elapsed="0.000206"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:27:55.207913" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:27:55.162979" elapsed="0.045108"/>
</kw>
<msg time="2026-10-16T01:27:55.208243" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:27:55.208284" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:55.162531" elapsed="0.045789"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:27:55.269850" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:55.208944" elapsed="0.061085"/>
</kw>
<msg time="2026-10-16T01:27:55.270183" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:27:55.270224" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:55.208482" elapsed="0.061777"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:55.270527" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:55.270327" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:55.270310" elapsed="0.000346"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:55.271210" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:55.270872" elapsed="0.000424"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:55.271552" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:55.271357" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:55.271340" elapsed="0.000304"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:27:55.271691" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:55.274146" elapsed="0.000471"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:27:55.275881" elapsed="0.000448"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:27:55.277527" elapsed="0.000557"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:27:55.272462" elapsed="0.005687"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:27:55.271975" elapsed="0.006290"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:27:55.161183" elapsed="0.117158"/>
</kw>
<msg time="2026-10-16T01:27:55.278422" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:55.278460" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:55.160572" elapsed="0.117925"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:27:55.278650" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-10-16T01:27:55.278565" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:55.278549" 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-10-16T01:27:55.279066" 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-10-16T01:27:55.279362" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:27:55.279425" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:27:55.159989" elapsed="0.119519"/>
</kw>
<msg time="2026-10-16T01:27:55.279590" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:55.279628" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:55.158076" elapsed="0.121588"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:55.280058" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:55.279840" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:55.279823" elapsed="0.000307"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:27:55.157942" elapsed="0.122210"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:27:54.894036" elapsed="0.386143"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:27:54.891938" elapsed="0.388290"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:27:54.890007" elapsed="0.390270"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:54.889584" elapsed="0.390733"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:27:54.888586" elapsed="0.391777"/>
</kw>
<kw name="Create Sample Port And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:27:55.284498" 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-10-16T01:27:55.283154" elapsed="0.001379">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-10-16T01:27:54.888043" elapsed="0.396611">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-10-16T01:27:55.286142" elapsed="0.000199"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:27:55.285900" elapsed="0.000491"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:55.287284" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:55.287196" elapsed="0.000132"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:55.287180" elapsed="0.000168"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:55.289259" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:55.289176" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:55.289160" elapsed="0.000161"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:55.290218" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:55.289896" elapsed="0.000348"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:55.290682" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:55.290392" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:55.290764" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:27:55.290890" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:55.289518" elapsed="0.001394"/>
</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-10-16T01:27:55.293652" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:55.293568" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:55.293550" 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-10-16T01:27:55.294854" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:55.294768" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:55.294750" elapsed="0.000165"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:27:55.295280" level="INFO">${karaf_connection_index} = 598</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:27:55.295057" elapsed="0.000248"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:27:55.295647" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:27:55.295463" elapsed="0.000224"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:27:55.332055" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:27:55.296268" elapsed="0.035963"/>
</kw>
<msg time="2026-10-16T01:27:55.332409" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:27:55.332450" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:55.295860" elapsed="0.036626"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:27:55.427617" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:55.333099" elapsed="0.094739"/>
</kw>
<msg time="2026-10-16T01:27:55.427994" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:27:55.428036" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:55.332650" elapsed="0.095421"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:55.428340" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:55.428139" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:55.428122" elapsed="0.000346"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:55.429020" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:55.428647" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:55.429367" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:55.429172" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:55.429156" elapsed="0.000303"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:27:55.429490" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:55.431944" elapsed="0.000469"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:27:55.433631" elapsed="0.000483"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:27:55.435461" 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-10-16T01:27:55.430271" elapsed="0.005592"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:27:55.429787" elapsed="0.006193"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:27:55.294466" elapsed="0.141591"/>
</kw>
<msg time="2026-10-16T01:27:55.436139" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:55.436178" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:55.293896" elapsed="0.142319"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:27:55.436367" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:27:55.436283" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:55.436266" elapsed="0.000177"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:27:55.436850" 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-10-16T01:27:55.437149" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:27:55.437212" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:27:55.293273" elapsed="0.144023"/>
</kw>
<msg time="2026-10-16T01:27:55.437377" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:55.437416" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:55.291233" elapsed="0.146220"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:55.437788" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:55.437519" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:55.437503" elapsed="0.000360"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:27:55.291096" elapsed="0.146789"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:55.440420" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:55.440335" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:55.440318" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:55.441569" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:55.441486" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:55.441469" elapsed="0.000168"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:27:55.442034" level="INFO">${karaf_connection_index} = 600</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:27:55.441812" elapsed="0.000246"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:27:55.442437" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:27:55.442252" elapsed="0.000210"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:27:55.473979" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:27:55.443054" elapsed="0.031095"/>
</kw>
<msg time="2026-10-16T01:27:55.474324" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:27:55.474365" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:55.442614" elapsed="0.031787"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:27:55.570314" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:55.475029" elapsed="0.095479"/>
</kw>
<msg time="2026-10-16T01:27:55.570686" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:27:55.570752" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:55.474564" elapsed="0.096225"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:55.571069" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:55.570862" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:55.570843" elapsed="0.000324"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:55.571728" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:55.571346" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:55.572083" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:55.571886" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:55.571869" elapsed="0.000307"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:27:55.572207" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:55.574780" 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-10-16T01:27:55.576501" elapsed="0.000491"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:27:55.578193" elapsed="0.000309"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:27:55.573010" elapsed="0.005558"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:27:55.572472" elapsed="0.006409"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:27:55.441230" elapsed="0.137731"/>
</kw>
<msg time="2026-10-16T01:27:55.579043" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:55.579083" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:55.440627" elapsed="0.138493"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:27:55.579274" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:27:55.579189" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:55.579172" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:27:55.579666" elapsed="0.000057"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:55.580001" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:27:55.580103" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:27:55.440043" elapsed="0.140147"/>
</kw>
<msg time="2026-10-16T01:27:55.580273" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:55.580312" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:55.438129" elapsed="0.142219"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:55.580628" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:55.580414" elapsed="0.000407"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:55.580399" elapsed="0.000448"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:27:55.437994" elapsed="0.142876"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:55.583345" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:55.583260" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:55.583242" 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-10-16T01:27:55.584570" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:55.584444" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:55.584427" elapsed="0.000206"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:27:55.585034" 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-10-16T01:27:55.584807" elapsed="0.000252"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:27:55.585394" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:27:55.585215" elapsed="0.000203"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:27:55.614047" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:27:55.586015" elapsed="0.028207"/>
</kw>
<msg time="2026-10-16T01:27:55.614376" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:27:55.614417" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:55.585569" elapsed="0.028885"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:27:55.686913" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:55.615067" elapsed="0.072033"/>
</kw>
<msg time="2026-10-16T01:27:55.687256" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:27:55.687298" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:55.614618" elapsed="0.072716"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:55.687603" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:55.687403" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:55.687385" elapsed="0.000345"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:55.688245" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:55.687909" elapsed="0.000427"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:55.688591" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:55.688396" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:55.688380" elapsed="0.000337"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:27:55.688750" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:55.691195" elapsed="0.000576"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:27:55.693003" elapsed="0.000448"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:27:55.694926" 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-10-16T01:27:55.689501" elapsed="0.005818"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:27:55.689013" elapsed="0.006422"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:27:55.584189" elapsed="0.111325"/>
</kw>
<msg time="2026-10-16T01:27:55.695596" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:55.695637" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:55.583582" elapsed="0.112105"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:27:55.695857" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:27:55.695772" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:55.695755" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:27:55.696249" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:55.696544" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:27:55.696609" elapsed="0.000013"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:27:55.582968" elapsed="0.113859"/>
</kw>
<msg time="2026-10-16T01:27:55.696915" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:55.696955" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:55.581116" elapsed="0.115874"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:55.697274" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:55.697056" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:55.697040" elapsed="0.000305"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:27:55.580981" elapsed="0.116385"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:27:55.290959" elapsed="0.406433"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:27:55.288885" elapsed="0.408557"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:27:55.286946" elapsed="0.410547"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:55.286535" elapsed="0.410999"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:27:55.285529" elapsed="0.412052"/>
</kw>
<kw name="Modify the destination IP of Sample Port" owner="ClusterOvsdb">
<msg time="2026-10-16T01:27:55.700751" 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-10-16T01:27:55.699433" elapsed="0.001355">Variable '${original_candidate}' not found.</status>
</kw>
<doc>Modify the dst ip of existing port in Owner.</doc>
<status status="FAIL" start="2026-10-16T01:27:55.285034" elapsed="0.415876">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-10-16T01:27:55.702266" elapsed="0.000200"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:27:55.702025" elapsed="0.000492"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:55.703408" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:55.703324" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:55.703308" elapsed="0.000162"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:55.705340" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:55.705257" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:55.705241" elapsed="0.000203"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:27:55.706355" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:27:55.706033" elapsed="0.000347"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:27:55.706837" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:27:55.706530" elapsed="0.000331"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:27:55.706903" elapsed="0.000025"/>
</return>
<msg time="2026-10-16T01:27:55.707028" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:27:55.705649" elapsed="0.001401"/>
</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-10-16T01:27:55.709558" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:55.709472" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:55.709454" elapsed="0.000169"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:55.710750" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:55.710628" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:55.710611" elapsed="0.000203"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:27:55.711180" level="INFO">${karaf_connection_index} = 598</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:27:55.710956" elapsed="0.000249"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:27:55.711544" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:27:55.711363" elapsed="0.000205"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:27:55.745376" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:27:55.712157" elapsed="0.033397"/>
</kw>
<msg time="2026-10-16T01:27:55.745760" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:27:55.745808" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:55.711749" elapsed="0.034097"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:27:55.823800" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:55.746478" elapsed="0.077501"/>
</kw>
<msg time="2026-10-16T01:27:55.824151" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:27:55.824192" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:55.746020" elapsed="0.078207"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:55.824498" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:55.824296" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:55.824279" elapsed="0.000312"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:55.825141" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:55.824804" elapsed="0.000418"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:55.825477" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:55.825282" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:55.825266" elapsed="0.000303"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:27:55.825599" elapsed="0.000024"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:55.828080" elapsed="0.000470"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:27:55.829870" elapsed="0.000450"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:27:55.831501" elapsed="0.000450"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:27:55.826386" elapsed="0.005632"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:27:55.825899" elapsed="0.006234"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:27:55.710373" elapsed="0.121836"/>
</kw>
<msg time="2026-10-16T01:27:55.832290" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:55.832330" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:55.709801" elapsed="0.122564"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:27:55.832517" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:27:55.832433" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:55.832417" elapsed="0.000176"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:27:55.833122" 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-10-16T01:27:55.833422" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:27:55.833485" 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-10-16T01:27:55.709184" elapsed="0.124388"/>
</kw>
<msg time="2026-10-16T01:27:55.833654" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:55.833727" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:55.707372" elapsed="0.126393"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:55.834052" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:55.833834" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:55.833818" elapsed="0.000304"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:27:55.707235" elapsed="0.126908"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:55.836648" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:55.836564" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:55.836546" 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-10-16T01:27:55.837835" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:55.837750" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:55.837732" elapsed="0.000166"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:27:55.838263" level="INFO">${karaf_connection_index} = 600</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:27:55.838040" elapsed="0.000248"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:27:55.838626" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:27:55.838446" elapsed="0.000204"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:27:55.871836" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:27:55.839242" elapsed="0.032794"/>
</kw>
<msg time="2026-10-16T01:27:55.872197" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:27:55.872240" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:55.838835" elapsed="0.033441"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:27:55.941724" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:55.872899" elapsed="0.069003"/>
</kw>
<msg time="2026-10-16T01:27:55.942095" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:27:55.942138" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:55.872445" elapsed="0.069729"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:55.942451" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:55.942245" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:55.942227" elapsed="0.000320"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:55.943101" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:55.942756" elapsed="0.000428"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:55.943445" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:55.943246" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:55.943230" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:27:55.943570" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:55.946055" elapsed="0.000470"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:27:55.947750" elapsed="0.000447"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:27:55.949360" elapsed="0.000302"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:27:55.944393" elapsed="0.005370"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:27:55.943870" elapsed="0.006011"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:27:55.837457" elapsed="0.112501"/>
</kw>
<msg time="2026-10-16T01:27:55.950040" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:55.950079" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:55.836887" elapsed="0.113227"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:27:55.950267" elapsed="0.000023"/>
</return>
<status status="PASS" start="2026-10-16T01:27:55.950182" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:55.950166" elapsed="0.000177"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:27:55.950654" elapsed="0.000035"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:55.951007" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:27:55.951072" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:27:55.836275" elapsed="0.114881"/>
</kw>
<msg time="2026-10-16T01:27:55.951238" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:55.951278" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:55.834386" elapsed="0.116927"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:55.951594" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:55.951379" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:55.951363" elapsed="0.000301"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:27:55.834251" elapsed="0.117488"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:55.954456" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:55.954371" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:55.954353" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:27:55.955648" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:27:55.955564" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:55.955547" elapsed="0.000201"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:27:55.956114" 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-10-16T01:27:55.955891" elapsed="0.000248"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:27:55.956475" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:27:55.956295" elapsed="0.000204"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:27:55.985126" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:27:55.957086" elapsed="0.028221"/>
</kw>
<msg time="2026-10-16T01:27:55.985464" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:27:55.985506" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:55.956650" elapsed="0.028891"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:27:56.038938" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:55.986165" elapsed="0.052965"/>
</kw>
<msg time="2026-10-16T01:27:56.039288" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:27:56.039329" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:55.985745" elapsed="0.053619"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:56.039634" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:56.039433" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:56.039416" elapsed="0.000360"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:27:56.040294" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:27:56.039958" elapsed="0.000417"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:56.040631" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:56.040434" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:56.040418" elapsed="0.000338"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:27:56.040788" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:27:56.043218" 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-10-16T01:27:56.044950" elapsed="0.000450"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:27:56.046668" 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-10-16T01:27:56.041539" elapsed="0.005539"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:27:56.041053" elapsed="0.006143"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:27:55.955308" elapsed="0.091963"/>
</kw>
<msg time="2026-10-16T01:27:56.047353" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:56.047392" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:55.954665" elapsed="0.092762"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:27:56.047578" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:27:56.047495" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:56.047479" elapsed="0.000176"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:27:56.048266" 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-10-16T01:27:56.048606" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:27:56.048719" 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-10-16T01:27:55.954077" elapsed="0.094736"/>
</kw>
<msg time="2026-10-16T01:27:56.048896" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:27:56.048936" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:55.951987" elapsed="0.096984"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:27:56.049254" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:27:56.049039" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-16T01:27:56.049023" elapsed="0.000301"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:27:55.951852" elapsed="0.097493"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:27:55.707097" elapsed="0.342275"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:27:55.704969" elapsed="0.344452"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:27:55.703074" elapsed="0.346398"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:27:55.702661" elapsed="0.346853"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:27:55.701663" elapsed="0.347898"/>
</kw>
<kw name="Verify Sample Port Is Modified" owner="ClusterOvsdb">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:27:56.051866" 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-10-16T01:27:56.051504" elapsed="0.000388"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:27:56.056421" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:27:56.055143" elapsed="0.001313">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:27:57.065830" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:27:57.062880" elapsed="0.003035">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:27:58.075152" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:27:58.072217" elapsed="0.003016">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:27:59.084406" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:27:59.081499" elapsed="0.002988">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:28:00.094078" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:28:00.091091" elapsed="0.003088">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<kw name="Check_Item_Occurrence_Member_List_Or_All" owner="ClusterManagement">
<msg time="2026-10-16T01:28:01.108835" level="FAIL">Variable '${ovsdb_uuid}' not found.</msg>
<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-10-16T01:28:01.105400" elapsed="0.003559">Variable '${ovsdb_uuid}' not found.</status>
</kw>
<msg time="2026-10-16T01:28:01.109300" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: Variable '${ovsdb_uuid}' not found.</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-10-16T01:27:56.052090" elapsed="5.057513">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: Variable '${ovsdb_uuid}' not found.</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-10-16T01:27:56.051143" elapsed="5.058783">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: Variable '${ovsdb_uuid}' not found.</status>
</kw>
<doc>Verify port is modified in all instances.</doc>
<status status="FAIL" start="2026-10-16T01:27:55.701207" elapsed="5.409023">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: Variable '${ovsdb_uuid}' not found.</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-10-16T01:28:01.114780" elapsed="0.001295"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:28:01.114138" elapsed="0.002067"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:28:01.118862" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:28:01.118568" elapsed="0.000403"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:01.118520" elapsed="0.000507"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:28:01.123599" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:28:01.123399" elapsed="0.000366"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:01.123359" elapsed="0.000464"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:28:01.125547" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:28:01.125076" elapsed="0.000506"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:28:01.126219" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:28:01.125832" elapsed="0.000421"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:28:01.126311" elapsed="0.000039"/>
</return>
<msg time="2026-10-16T01:28:01.126494" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:28:01.124313" elapsed="0.002212"/>
</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-10-16T01:28:01.130158" elapsed="0.000026"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:28:01.130013" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:01.129982" elapsed="0.000282"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:28:01.131925" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:28:01.131797" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:01.131771" elapsed="0.000249"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:28:01.132568" level="INFO">${karaf_connection_index} = 598</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:28:01.132231" elapsed="0.000373"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:28:01.133152" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:28:01.132878" elapsed="0.000310"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:28:01.167218" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:28:01.134054" elapsed="0.033432"/>
</kw>
<msg time="2026-10-16T01:28:01.167726" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:28:01.167775" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:28:01.133414" elapsed="0.034398"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:28:01.233722" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:28:01.168590" elapsed="0.065418"/>
</kw>
<msg time="2026-10-16T01:28:01.234299" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:28:01.234343" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:28:01.168055" elapsed="0.066326"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:28:01.234834" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:28:01.234493" elapsed="0.000419"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:01.234459" elapsed="0.000483"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:28:01.235608" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:28:01.235128" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:28:01.235992" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:28:01.235787" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:01.235769" elapsed="0.000323"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:28:01.236133" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:28:01.238839" elapsed="0.000485"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:28:01.240538" elapsed="0.000512"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:28:01.242229" 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-10-16T01:28:01.237069" elapsed="0.005541"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:28:01.236479" elapsed="0.006273"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:28:01.131378" elapsed="0.111456"/>
</kw>
<msg time="2026-10-16T01:28:01.242924" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:28:01.242965" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:28:01.130481" elapsed="0.112520"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:28:01.243158" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-10-16T01:28:01.243071" elapsed="0.000144"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:01.243055" elapsed="0.000183"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:28:01.243581" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:28:01.243917" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:28:01.243984" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:28:01.129526" elapsed="0.114549"/>
</kw>
<msg time="2026-10-16T01:28:01.244164" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:28:01.244205" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:28:01.127032" elapsed="0.117211"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:28:01.244533" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:28:01.244312" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:01.244296" elapsed="0.000308"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:28:01.126835" elapsed="0.117791"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:28:01.247511" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:28:01.247426" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:01.247408" elapsed="0.000167"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:28:01.248747" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:28:01.248627" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:01.248610" elapsed="0.000202"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:28:01.249191" level="INFO">${karaf_connection_index} = 600</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:28:01.248957" elapsed="0.000259"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:28:01.249562" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:28:01.249375" elapsed="0.000211"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:28:01.284076" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:28:01.250310" elapsed="0.034193"/>
</kw>
<msg time="2026-10-16T01:28:01.284931" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:28:01.285025" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:28:01.249881" elapsed="0.035223"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:28:01.362648" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:28:01.286647" elapsed="0.076247"/>
</kw>
<msg time="2026-10-16T01:28:01.363078" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:28:01.363120" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:28:01.285513" elapsed="0.077643"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:28:01.363471" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:28:01.363236" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:01.363216" elapsed="0.000351"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:28:01.364184" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:28:01.363796" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:28:01.364522" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:28:01.364327" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:01.364311" elapsed="0.000303"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:28:01.364644" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:28:01.367126" elapsed="0.000471"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:28:01.368890" elapsed="0.000450"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:28:01.370503" 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-10-16T01:28:01.365451" elapsed="0.005470"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:28:01.364946" elapsed="0.006094"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:28:01.248371" elapsed="0.122747"/>
</kw>
<msg time="2026-10-16T01:28:01.371201" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:28:01.371241" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:28:01.247787" elapsed="0.123490"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:28:01.371430" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:28:01.371345" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:01.371329" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:28:01.371903" 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-10-16T01:28:01.372203" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:28:01.372267" 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-10-16T01:28:01.247120" elapsed="0.125233"/>
</kw>
<msg time="2026-10-16T01:28:01.372437" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:28:01.372477" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:28:01.244935" elapsed="0.127577"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:28:01.372936" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:28:01.372580" elapsed="0.000407"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:01.372564" elapsed="0.000446"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:28:01.244793" elapsed="0.128238"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:28:01.375519" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:28:01.375434" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:01.375416" elapsed="0.000165"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:28:01.376933" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:28:01.376639" elapsed="0.000338"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:01.376622" elapsed="0.000376"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:28:01.377362" 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-10-16T01:28:01.377140" elapsed="0.000246"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:28:01.377771" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:28:01.377563" elapsed="0.000233"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:28:01.430872" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:28:01.378361" elapsed="0.052698"/>
</kw>
<msg time="2026-10-16T01:28:01.431213" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:28:01.431254" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:28:01.377949" elapsed="0.053341"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:28:01.514885" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:28:01.431942" elapsed="0.083545"/>
</kw>
<msg time="2026-10-16T01:28:01.516003" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:28:01.516099" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:28:01.431454" elapsed="0.084727"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:28:01.517056" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:28:01.516415" elapsed="0.000807"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:01.516346" elapsed="0.000937"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:28:01.518985" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:28:01.517686" elapsed="0.001485"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:28:01.519835" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:28:01.519308" elapsed="0.000831"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:01.519271" elapsed="0.000925"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:28:01.520273" elapsed="0.000072"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:28:01.526169" elapsed="0.001124"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:28:01.529818" elapsed="0.000651"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:28:01.532248" elapsed="0.000428"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:28:01.522247" elapsed="0.010644"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:28:01.521023" elapsed="0.012032"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:28:01.376381" elapsed="0.156787"/>
</kw>
<msg time="2026-10-16T01:28:01.533290" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:28:01.533347" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:28:01.375798" elapsed="0.157600"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:28:01.533618" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-10-16T01:28:01.533498" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:01.533475" elapsed="0.000356"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:28:01.534297" 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-10-16T01:28:01.534756" elapsed="0.000033"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:28:01.534848" elapsed="0.000021"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:28:01.375140" elapsed="0.159836"/>
</kw>
<msg time="2026-10-16T01:28:01.535097" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:28:01.535154" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:28:01.373278" elapsed="0.161925"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:28:01.535604" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:28:01.535300" elapsed="0.000372"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:01.535277" elapsed="0.000469"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:28:01.373141" elapsed="0.162640"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:28:01.126597" elapsed="0.409229"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:28:01.122657" elapsed="0.413250"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:28:01.117595" elapsed="0.418387"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:28:01.116563" elapsed="0.419481"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:28:01.113208" elapsed="0.422906"/>
</kw>
<kw name="Delete Sample Port And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:28:01.541976" 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-10-16T01:28:01.540174" elapsed="0.001855">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-10-16T01:28:01.111125" elapsed="0.431095">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-10-16T01:28:01.544840" elapsed="0.000497"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:28:01.544439" elapsed="0.000976"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:28:01.546926" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:28:01.546802" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:01.546775" elapsed="0.000240"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:28:01.549641" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:28:01.549526" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:01.549503" elapsed="0.000297"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:28:01.551083" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:28:01.550583" elapsed="0.000536"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:28:01.551735" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:28:01.551327" elapsed="0.000444"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:28:01.551829" elapsed="0.000036"/>
</return>
<msg time="2026-10-16T01:28:01.552007" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:28:01.550088" elapsed="0.001951"/>
</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-10-16T01:28:01.554979" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:28:01.554894" elapsed="0.000129"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:01.554877" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:28:01.556151" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:28:01.556067" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:01.556050" elapsed="0.000164"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:28:01.556593" level="INFO">${karaf_connection_index} = 598</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:28:01.556359" elapsed="0.000258"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:28:01.557015" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:28:01.556810" elapsed="0.000230"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:28:01.590066" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:28:01.557610" elapsed="0.032674"/>
</kw>
<msg time="2026-10-16T01:28:01.590460" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:28:01.590501" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:28:01.557195" elapsed="0.033342"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:28:01.673240" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:28:01.591226" elapsed="0.082204"/>
</kw>
<msg time="2026-10-16T01:28:01.673585" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:28:01.673627" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:28:01.590762" elapsed="0.082901"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:28:01.674002" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:28:01.673776" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:01.673751" elapsed="0.000351"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:28:01.674626" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:28:01.674286" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:28:01.675007" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:28:01.674809" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:01.674792" elapsed="0.000363"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:28:01.675189" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:28:01.677784" elapsed="0.000485"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:28:01.679493" elapsed="0.000520"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:28:01.681207" elapsed="0.000311"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:28:01.676065" elapsed="0.005519"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:28:01.675508" elapsed="0.006225"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:28:01.555808" elapsed="0.126006"/>
</kw>
<msg time="2026-10-16T01:28:01.681899" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:28:01.681939" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:28:01.555192" elapsed="0.126784"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:28:01.682131" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:28:01.682045" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:01.682029" elapsed="0.000181"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:28:01.682546" 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-10-16T01:28:01.683171" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:28:01.683238" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:28:01.554579" elapsed="0.128747"/>
</kw>
<msg time="2026-10-16T01:28:01.683414" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:28:01.683454" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:28:01.552501" elapsed="0.130989"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:28:01.683809" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:28:01.683558" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:01.683543" elapsed="0.000341"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:28:01.552308" elapsed="0.131601"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:28:01.686607" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:28:01.686521" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:01.686504" elapsed="0.000166"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:28:01.687790" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:28:01.687671" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:01.687654" elapsed="0.000199"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:28:01.688247" level="INFO">${karaf_connection_index} = 600</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:28:01.687996" elapsed="0.000277"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:28:01.688619" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:28:01.688432" elapsed="0.000211"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:28:01.721695" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:28:01.689281" elapsed="0.032618"/>
</kw>
<msg time="2026-10-16T01:28:01.722076" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:28:01.722117" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:28:01.688825" elapsed="0.033328"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:28:01.791862" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:28:01.722807" elapsed="0.069252"/>
</kw>
<msg time="2026-10-16T01:28:01.792226" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:28:01.792268" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:28:01.722349" elapsed="0.069955"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:28:01.792596" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:28:01.792380" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:01.792361" elapsed="0.000331"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:28:01.793257" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:28:01.792903" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:28:01.793600" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:28:01.793406" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:01.793389" elapsed="0.000304"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:28:01.793755" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:28:01.796274" 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-10-16T01:28:01.798006" elapsed="0.000464"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:28:01.799665" 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-10-16T01:28:01.794561" elapsed="0.005520"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:28:01.794056" elapsed="0.006144"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:28:01.687414" elapsed="0.112863"/>
</kw>
<msg time="2026-10-16T01:28:01.800360" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:28:01.800400" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:28:01.686843" elapsed="0.113591"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:28:01.800588" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:28:01.800503" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:01.800486" elapsed="0.000180"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:28:01.801054" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:28:01.801361" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:28:01.801426" 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-10-16T01:28:01.686217" elapsed="0.115294"/>
</kw>
<msg time="2026-10-16T01:28:01.801598" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:28:01.801638" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:28:01.684171" elapsed="0.117501"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:28:01.802015" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:28:01.801796" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:01.801779" elapsed="0.000347"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:28:01.684033" elapsed="0.118116"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:28:01.805015" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:28:01.804930" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:01.804912" elapsed="0.000167"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:28:01.806181" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:28:01.806097" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:01.806081" elapsed="0.000163"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:28:01.806613" 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-10-16T01:28:01.806386" elapsed="0.000253"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:28:01.807016" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:28:01.806828" elapsed="0.000212"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:28:01.842532" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:28:01.807605" elapsed="0.035169"/>
</kw>
<msg time="2026-10-16T01:28:01.842967" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:28:01.843009" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:28:01.807194" elapsed="0.035848"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:28:01.926068" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:28:01.843622" elapsed="0.082626"/>
</kw>
<msg time="2026-10-16T01:28:01.926404" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:28:01.926445" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:28:01.843205" elapsed="0.083276"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:28:01.926787" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:28:01.926550" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:01.926532" elapsed="0.000351"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:28:01.927391" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:28:01.927060" elapsed="0.000416"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:28:01.927761" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:28:01.927537" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:01.927520" elapsed="0.000335"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:28:01.927886" elapsed="0.000024"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:28:01.930335" 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-10-16T01:28:01.932026" elapsed="0.000440"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:28:01.933634" 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-10-16T01:28:01.928647" elapsed="0.005391"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:28:01.928149" 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-10-16T01:28:01.805840" elapsed="0.128389"/>
</kw>
<msg time="2026-10-16T01:28:01.934311" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:28:01.934384" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:28:01.805227" elapsed="0.129196"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:28:01.934577" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:28:01.934493" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:01.934476" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:28:01.935004" 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-10-16T01:28:01.935303" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:28:01.935368" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:28:01.804600" elapsed="0.130851"/>
</kw>
<msg time="2026-10-16T01:28:01.935535" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:28:01.935575" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:28:01.802409" elapsed="0.133201"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:28:01.936217" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:28:01.935677" elapsed="0.000591"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:01.935661" elapsed="0.000628"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:28:01.802271" elapsed="0.134040"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:28:01.552109" elapsed="0.384229"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:28:01.549116" elapsed="0.387279"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:28:01.546275" elapsed="0.390176"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:28:01.545626" elapsed="0.390870"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:28:01.543524" elapsed="0.393024"/>
</kw>
<kw name="Delete Sample Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-10-16T01:28:01.940572" 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-10-16T01:28:01.939303" elapsed="0.001305">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-10-16T01:28:01.542818" elapsed="0.398018">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-10-16T01:28:01.943135" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-10-16T01:28:01.942769" elapsed="0.000621"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:28:01.944304" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:28:01.944218" elapsed="0.000128"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:01.944200" elapsed="0.000168"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:28:01.946581" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:28:01.946488" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:01.946469" elapsed="0.000185"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-10-16T01:28:01.947753" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:28:01.947340" elapsed="0.000444"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:28:01.948281" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:28:01.947957" elapsed="0.000351"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:28:01.948365" elapsed="0.000028"/>
</return>
<msg time="2026-10-16T01:28:01.948504" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:28:01.946931" elapsed="0.001599"/>
</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-10-16T01:28:01.951640" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:28:01.951535" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:01.951512" elapsed="0.000237"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:28:01.953066" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:28:01.952966" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:01.952946" elapsed="0.000200"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:28:01.953586" level="INFO">${karaf_connection_index} = 598</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:28:01.953321" elapsed="0.000295"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:28:01.954008" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:28:01.953820" elapsed="0.000213"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:28:01.986365" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:28:01.954596" elapsed="0.031968"/>
</kw>
<msg time="2026-10-16T01:28:01.986765" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:28:01.986808" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:28:01.954187" elapsed="0.032657"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:28:02.072319" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:28:01.987478" elapsed="0.085021"/>
</kw>
<msg time="2026-10-16T01:28:02.072655" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:28:02.072696" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:28:01.987025" elapsed="0.085740"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:28:02.073062" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:28:02.072846" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:02.072824" elapsed="0.000335"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:28:02.073676" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:28:02.073339" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:28:02.074048" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:28:02.073849" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:02.073833" elapsed="0.000308"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:28:02.074172" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:28:02.076756" 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-10-16T01:28:02.078490" elapsed="0.000514"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:28:02.080386" 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-10-16T01:28:02.075026" elapsed="0.005768"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:28:02.074484" elapsed="0.006434"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:28:01.952604" elapsed="0.128390"/>
</kw>
<msg time="2026-10-16T01:28:02.081081" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:28:02.081121" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:28:01.951928" elapsed="0.129229"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:28:02.081363" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-10-16T01:28:02.081277" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:02.081259" elapsed="0.000185"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:28:02.081871" 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-10-16T01:28:02.082178" elapsed="0.000022"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:28:02.082242" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:28:01.951174" elapsed="0.131154"/>
</kw>
<msg time="2026-10-16T01:28:02.082416" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:28:02.082456" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:28:01.949025" elapsed="0.133466"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:28:02.082804" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:28:02.082560" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:02.082544" elapsed="0.000333"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-10-16T01:28:01.948851" elapsed="0.134049"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:28:02.085493" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:28:02.085409" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:02.085392" elapsed="0.000164"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:28:02.086642" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:28:02.086558" elapsed="0.000125"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:02.086542" elapsed="0.000213"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:28:02.087130" level="INFO">${karaf_connection_index} = 600</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given `dictionary` based on the given `key`.</doc>
<status status="PASS" start="2026-10-16T01:28:02.086903" elapsed="0.000252"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:28:02.087494" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:28:02.087311" elapsed="0.000207"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:28:02.119285" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:28:02.088105" elapsed="0.031355"/>
</kw>
<msg time="2026-10-16T01:28:02.119617" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:28:02.119659" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:28:02.087669" elapsed="0.032025"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:28:02.188016" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:28:02.120343" elapsed="0.067898"/>
</kw>
<msg time="2026-10-16T01:28:02.188408" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:28:02.188450" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:28:02.119911" elapsed="0.068575"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:28:02.188808" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:28:02.188561" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:02.188541" elapsed="0.000362"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:28:02.189450" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:28:02.189091" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:28:02.189902" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:28:02.189672" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:02.189655" elapsed="0.000342"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:28:02.190028" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:28:02.192538" 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-10-16T01:28:02.194276" elapsed="0.000509"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:28:02.195994" 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-10-16T01:28:02.190853" elapsed="0.005523"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:28:02.190317" elapsed="0.006175"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:28:02.086302" elapsed="0.110267"/>
</kw>
<msg time="2026-10-16T01:28:02.196652" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:28:02.196691" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:28:02.085730" elapsed="0.111229"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:28:02.197116" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:28:02.197031" elapsed="0.000140"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:02.197014" elapsed="0.000179"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:28:02.197517" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:28:02.197849" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:28:02.197914" elapsed="0.000014"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-10-16T01:28:02.085111" elapsed="0.112889"/>
</kw>
<msg time="2026-10-16T01:28:02.198095" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:28:02.198135" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:28:02.083161" elapsed="0.115009"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:28:02.198453" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:28:02.198237" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:02.198221" elapsed="0.000303"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-10-16T01:28:02.083022" elapsed="0.115523"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:28:02.201203" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:28:02.201119" elapsed="0.000126"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:02.201102" elapsed="0.000163"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-10-16T01:28:02.202351" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:28:02.202269" elapsed="0.000124"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:02.202252" elapsed="0.000161"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-10-16T01:28:02.202836" 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-10-16T01:28:02.202573" elapsed="0.000288"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:28:02.203204" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-10-16T01:28:02.203019" elapsed="0.000209"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-10-16T01:28:02.239348" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-10-16T01:28:02.203813" elapsed="0.035711"/>
</kw>
<msg time="2026-10-16T01:28:02.239769" level="INFO">${status_write} = PASS</msg>
<msg time="2026-10-16T01:28:02.239812" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:28:02.203379" elapsed="0.036468"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-10-16T01:28:02.318257" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:28:02.240454" elapsed="0.077984"/>
</kw>
<msg time="2026-10-16T01:28:02.318592" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-10-16T01:28:02.318632" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:28:02.240011" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:28:02.319021" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:28:02.318787" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:02.318768" elapsed="0.000362"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:28:02.319643" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "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-10-16T01:28:02.319308" 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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:28:02.320013" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:28:02.319814" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:02.319798" elapsed="0.000309"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-10-16T01:28:02.320137" elapsed="0.000025"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:28:02.322578" 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-10-16T01:28:02.324357" elapsed="0.000479"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:28:02.326225" elapsed="0.000302"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:28:02.320936" elapsed="0.005657"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if `condition` is true.</doc>
<status status="PASS" start="2026-10-16T01:28:02.320402" elapsed="0.006336"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-10-16T01:28:02.202014" elapsed="0.124802"/>
</kw>
<msg time="2026-10-16T01:28:02.326897" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:28:02.326937" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:28:02.201411" elapsed="0.125560"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-10-16T01:28:02.327122" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-10-16T01:28:02.327038" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:02.327021" elapsed="0.000178"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" 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-10-16T01:28:02.327514" elapsed="0.000023"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-10-16T01:28:02.327919" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-10-16T01:28:02.327984" 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-10-16T01:28:02.200825" elapsed="0.127244"/>
</kw>
<msg time="2026-10-16T01:28:02.328151" level="INFO">${status} = PASS</msg>
<msg time="2026-10-16T01:28:02.328190" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "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 errorw.</doc>
<status status="PASS" start="2026-10-16T01:28:02.198943" elapsed="0.129282"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:28:02.328575" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:28:02.328358" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:02.328340" elapsed="0.000308"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-10-16T01:28:02.198671" elapsed="0.129999"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-10-16T01:28:01.948647" elapsed="0.380144"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-10-16T01:28:01.946155" elapsed="0.382699"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-10-16T01:28:01.943967" elapsed="0.384941"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible errorw.</doc>
<status status="PASS" start="2026-10-16T01:28:01.943533" elapsed="0.385420"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-10-16T01:28:01.942046" elapsed="0.386958"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:28:02.333654" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:28:02.333255" elapsed="0.000480"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:02.333238" elapsed="0.000522"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:28:02.334089" 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-10-16T01:28:02.334182" 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-10-16T01:28:02.333955" elapsed="0.000251"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:28:02.334678" level="INFO">Attempting to execute command "sudo mn -c" on remote system "10.30.171.104" 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-10-16T01:28:02.334390" elapsed="0.000358"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:28:02.335228" level="INFO">${conn_id} = 743</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-10-16T01:28:02.334924" elapsed="0.000328"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:28:02.336091" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:28:02.336160" 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-10-16T01:28:02.335819" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:28:02.336331" elapsed="0.000280"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:28:02.337393" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:28:02.695011" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:27:30 UTC 2026

  System load:  0.0                Processes:             105
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%

 * Canonical Workshop gives developers fast, composable, reproducible, and
   secure developer environments that are perfect for agentic workflows.

   https://ubuntu.com/workshop

Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:27:42 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:28:02.337161" elapsed="0.357997"/>
</kw>
<msg time="2026-10-16T01:28:02.695235" 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-10-16T01:28:02.336797" elapsed="0.358520"/>
</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-10-16T01:28:02.335443" elapsed="0.359981"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:28:02.695979" level="INFO">Executing command 'sudo mn -c'.</msg>
<msg time="2026-10-16T01:28:03.905370" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:28:03.905675" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:28:03.905838" 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-10-16T01:28:02.695747" elapsed="1.210299"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:28:03.906474" elapsed="0.000523"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:28:03.908147" 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-10-16T01:28:03.907502" 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-10-16T01:28:03.908695" elapsed="0.000085"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:28:03.908428" elapsed="0.000424"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:03.908379" 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-10-16T01:28:03.909196" elapsed="0.000064"/>
</return>
<status status="PASS" start="2026-10-16T01:28:03.909011" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:03.908980" elapsed="0.000397"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:28:03.909447" elapsed="0.000028"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:28:03.911136" elapsed="0.000705"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:28:03.912250" elapsed="0.000746"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:28:03.913319" elapsed="0.000206"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:28:03.910162" elapsed="0.003472"/>
</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-10-16T01:28:02.332841" elapsed="1.581003"/>
</kw>
<msg time="2026-10-16T01:28:03.913954" 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-10-16T01:28:02.330654" elapsed="1.583410"/>
</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-10-16T01:28:02.330248" elapsed="1.583976"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:28:03.918456" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:28:03.917938" elapsed="0.000637"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:03.917898" elapsed="0.000730"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:28:03.919393" 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-10-16T01:28:03.919597" 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-10-16T01:28:03.919108" elapsed="0.000543"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:28:03.920828" 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.104" 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-10-16T01:28:03.920127" elapsed="0.000797"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:28:03.922033" level="INFO">${conn_id} = 745</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-10-16T01:28:03.921311" elapsed="0.000776"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:28:03.923972" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:28:03.924126" 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-10-16T01:28:03.923360" elapsed="0.000814"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:28:03.924581" elapsed="0.000700"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:28:03.927323" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:28:04.310187" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:27:30 UTC 2026

  System load:  0.0                Processes:             105
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%

 * Canonical Workshop gives developers fast, composable, reproducible, and
   secure developer environments that are perfect for agentic workflows.

   https://ubuntu.com/workshop

Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:28:02 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:28:03.926798" elapsed="0.383501"/>
</kw>
<msg time="2026-10-16T01:28:04.310367" 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-10-16T01:28:03.925644" elapsed="0.384792"/>
</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-10-16T01:28:03.922511" elapsed="0.388018"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:28:04.310999" 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-10-16T01:28:04.354209" level="INFO">Command exited with return code -1.</msg>
<msg time="2026-10-16T01:28:04.354433" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:28:04.354520" 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-10-16T01:28:04.310798" elapsed="0.043768"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:28:04.354993" elapsed="0.000422"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:28:04.356519" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:28:04.355964" elapsed="0.000643"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:28:04.357061" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:28:04.356828" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:04.356779" elapsed="0.000435"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:28:04.357499" elapsed="0.000053"/>
</return>
<status status="PASS" start="2026-10-16T01:28:04.357321" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:04.357290" elapsed="0.000379"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:28:04.357794" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:28:04.359885" elapsed="0.000642"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:28:04.360988" elapsed="0.000317"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:28:04.361619" elapsed="0.000255"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:28:04.358938" elapsed="0.003043"/>
</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-10-16T01:28:03.916934" elapsed="0.445199"/>
</kw>
<msg time="2026-10-16T01:28:04.362236" 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-10-16T01:28:03.915607" elapsed="0.446728"/>
</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-10-16T01:28:03.914569" elapsed="0.447919"/>
</kw>
<arg>${tools_system}</arg>
<status status="PASS" start="2026-10-16T01:28:02.329941" elapsed="2.032655"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:28:04.366766" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:28:04.366197" elapsed="0.000690"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:04.366156" elapsed="0.000785"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:28:04.367792" 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-10-16T01:28:04.368005" 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-10-16T01:28:04.367459" elapsed="0.000601"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:28:04.369176" level="INFO">Attempting to execute command "sudo ovs-vsctl del-manager" on remote system "10.30.171.104" 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-10-16T01:28:04.368476" elapsed="0.000793"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:28:04.370386" 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-10-16T01:28:04.369657" elapsed="0.000784"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:28:04.372307" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:28:04.372459" 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-10-16T01:28:04.371755" elapsed="0.000752"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:28:04.372889" elapsed="0.000625"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:28:04.375293" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:28:04.755569" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:27:30 UTC 2026

  System load:  0.0                Processes:             105
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%

 * Canonical Workshop gives developers fast, composable, reproducible, and
   secure developer environments that are perfect for agentic workflows.

   https://ubuntu.com/workshop

Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:28:04 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:28:04.374781" elapsed="0.380953"/>
</kw>
<msg time="2026-10-16T01:28:04.755806" 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-10-16T01:28:04.373930" elapsed="0.381947"/>
</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-10-16T01:28:04.370922" elapsed="0.385050"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:28:04.756453" level="INFO">Executing command 'sudo ovs-vsctl del-manager'.</msg>
<msg time="2026-10-16T01:28:04.780143" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:28:04.780313" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:28:04.780368" 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-10-16T01:28:04.756235" elapsed="0.024164"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:28:04.780609" elapsed="0.000526"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:28:04.781960" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:28:04.781469" elapsed="0.000545"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:28:04.782275" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:28:04.782119" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:04.782087" 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-10-16T01:28:04.782555" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-10-16T01:28:04.782443" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:04.782424" elapsed="0.000237"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:28:04.782797" elapsed="0.000022"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:28:04.783846" elapsed="0.000404"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:28:04.784503" elapsed="0.000245"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:28:04.784948" elapsed="0.000129"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:28:04.783223" elapsed="0.001920"/>
</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-10-16T01:28:04.365210" elapsed="0.420028"/>
</kw>
<msg time="2026-10-16T01:28:04.785375" 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-10-16T01:28:04.364000" elapsed="0.421441"/>
</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-10-16T01:28:04.363021" elapsed="0.422518"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:28:04.788195" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:28:04.787866" elapsed="0.000402"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:04.787841" elapsed="0.000459"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:28:04.788777" 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-10-16T01:28:04.788910" 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-10-16T01:28:04.788563" elapsed="0.000381"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:28:04.789689" level="INFO">Attempting to execute command "sudo /usr/share/openvswitch/scripts/ovs-ctl stop" on remote system "10.30.171.104" 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-10-16T01:28:04.789203" elapsed="0.000585"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:28:04.790444" 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-10-16T01:28:04.790030" elapsed="0.000448"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:28:04.791630" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:28:04.791762" 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-10-16T01:28:04.791281" elapsed="0.000514"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:28:04.792003" elapsed="0.000394"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:28:04.793518" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:28:05.179178" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:27:30 UTC 2026

  System load:  0.0                Processes:             105
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%

 * Canonical Workshop gives developers fast, composable, reproducible, and
   secure developer environments that are perfect for agentic workflows.

   https://ubuntu.com/workshop

Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:28:04 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:28:04.793195" elapsed="0.386114"/>
</kw>
<msg time="2026-10-16T01:28:05.179382" 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-10-16T01:28:04.792623" elapsed="0.386831"/>
</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-10-16T01:28:04.790783" elapsed="0.388767"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:28:05.180070" level="INFO">Executing command 'sudo /usr/share/openvswitch/scripts/ovs-ctl stop'.</msg>
<msg time="2026-10-16T01:28:05.445416" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:28:05.445680" level="INFO">${stdout} =  * Exiting ovs-vswitchd (8384)
 * Exiting ovsdb-server (8367)</msg>
<msg time="2026-10-16T01:28:05.445836" 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-10-16T01:28:05.179848" elapsed="0.266037"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:28:05.446263" elapsed="0.000505"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:28:05.447912" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:28:05.447276" 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-10-16T01:28:05.448402" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:28:05.448164" elapsed="0.000340"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:05.448116" elapsed="0.000437"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:28:05.448895" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-10-16T01:28:05.448660" elapsed="0.000488"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:05.448630" elapsed="0.000578"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:28:05.449282" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:28:05.450939" elapsed="0.000636"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:28:05.452031" elapsed="0.000311"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:28:05.452651" elapsed="0.000265"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:28:05.449985" elapsed="0.003037"/>
</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-10-16T01:28:04.787184" elapsed="0.665996"/>
</kw>
<msg time="2026-10-16T01:28:05.453289" 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-10-16T01:28:04.786418" elapsed="0.666975"/>
</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-10-16T01:28:04.785828" elapsed="0.667724"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:28:05.457673" elapsed="0.000105"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:28:05.457155" elapsed="0.000696"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:05.457115" elapsed="0.000788"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:28:05.458633" 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-10-16T01:28:05.458897" 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-10-16T01:28:05.458355" elapsed="0.000596"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:28:05.460056" level="INFO">Attempting to execute command "sudo rm -rf /etc/openvswitch/conf.db" on remote system "10.30.171.104" 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-10-16T01:28:05.459364" elapsed="0.000788"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:28:05.461333" 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-10-16T01:28:05.460535" elapsed="0.000851"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:28:05.463260" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:28:05.463415" 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-10-16T01:28:05.462651" elapsed="0.000813"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:28:05.463840" elapsed="0.000625"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:28:05.466463" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:28:05.895932" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:27:30 UTC 2026

  System load:  0.0                Processes:             105
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%

 * Canonical Workshop gives developers fast, composable, reproducible, and
   secure developer environments that are perfect for agentic workflows.

   https://ubuntu.com/workshop

Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:28:05 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:28:05.465684" elapsed="0.430386"/>
</kw>
<msg time="2026-10-16T01:28:05.896146" 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-10-16T01:28:05.464875" elapsed="0.431346"/>
</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-10-16T01:28:05.461862" elapsed="0.434526"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:28:05.896897" level="INFO">Executing command 'sudo rm -rf /etc/openvswitch/conf.db'.</msg>
<msg time="2026-10-16T01:28:05.919823" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:28:05.919969" level="INFO">${stdout} = </msg>
<msg time="2026-10-16T01:28:05.920023" 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-10-16T01:28:05.896652" elapsed="0.023401"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:28:05.920264" elapsed="0.000273"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:28:05.921269" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:28:05.920903" elapsed="0.000419"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:28:05.921591" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:28:05.921430" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:05.921397" elapsed="0.000291"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:28:05.921910" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-10-16T01:28:05.921795" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:05.921774" elapsed="0.000243"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:28:05.922059" 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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:28:05.923099" 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-10-16T01:28:05.923798" elapsed="0.000206"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:28:05.924199" elapsed="0.000124"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:28:05.922475" elapsed="0.001912"/>
</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-10-16T01:28:05.456169" elapsed="0.468315"/>
</kw>
<msg time="2026-10-16T01:28:05.924549" 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-10-16T01:28:05.454967" elapsed="0.469646"/>
</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-10-16T01:28:05.453989" elapsed="0.470757"/>
</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 or task with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-10-16T01:28:05.927309" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:28:05.926980" elapsed="0.000401"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:05.926954" elapsed="0.000459"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:28:05.927893" 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-10-16T01:28:05.928021" 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-10-16T01:28:05.927679" elapsed="0.000376"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:28:05.928772" level="INFO">Attempting to execute command "sudo /usr/share/openvswitch/scripts/ovs-ctl start" on remote system "10.30.171.104" 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-10-16T01:28:05.928315" elapsed="0.000519"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-10-16T01:28:05.929493" 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-10-16T01:28:05.929079" elapsed="0.000473"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-10-16T01:28:05.930715" level="INFO">Length is 0.</msg>
<msg time="2026-10-16T01:28:05.930826" 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-10-16T01:28:05.930353" elapsed="0.000504"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:28:05.931060" elapsed="0.000394"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-10-16T01:28:05.932535" level="INFO">Logging into '10.30.171.104:22' as 'jenkins'.</msg>
<msg time="2026-10-16T01:28:06.305379" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-187-generic x86_64)

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

 System information as of Fri Oct 16 01:27:30 UTC 2026

  System load:  0.0                Processes:             105
  Usage of /:   19.8% of 38.58GB   Users logged in:       0
  Memory usage: 5%                 IPv4 address for ens3: 10.30.171.104
  Swap usage:   0%

 * Canonical Workshop gives developers fast, composable, reproducible, and
   secure developer environments that are perfect for agentic workflows.

   https://ubuntu.com/workshop

Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

14 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.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Fri Oct 16 01:28:05 2026 from 10.30.171.166
[?2004h[jenkins@releng-12472-74-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-10-16T01:28:05.932215" elapsed="0.373276"/>
</kw>
<msg time="2026-10-16T01:28:06.305559" 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-10-16T01:28:05.931675" elapsed="0.373954"/>
</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-10-16T01:28:05.929857" elapsed="0.375893"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-10-16T01:28:06.306190" level="INFO">Executing command 'sudo /usr/share/openvswitch/scripts/ovs-ctl start'.</msg>
<msg time="2026-10-16T01:28:06.450609" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-10-16T01:28:06.450904" 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-10-16T01:28:06.450997" 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-10-16T01:28:06.305995" elapsed="0.145050"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:28:06.451401" elapsed="0.000487"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:28:06.452975" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:28:06.452374" elapsed="0.000688"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:28:06.453449" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:28:06.453218" elapsed="0.000332"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:06.453172" elapsed="0.000428"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-10-16T01:28:06.453938" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-10-16T01:28:06.453706" elapsed="0.000356"/>
</branch>
<status status="PASS" start="2026-10-16T01:28:06.453676" elapsed="0.000434"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-10-16T01:28:06.454180" elapsed="0.000028"/>
</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>Conditionally runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-10-16T01:28:06.455798" elapsed="0.000630"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-10-16T01:28:06.456902" elapsed="0.000308"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-10-16T01:28:06.457518" elapsed="0.000244"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-10-16T01:28:06.454861" elapsed="0.003010"/>
</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-10-16T01:28:05.926356" elapsed="0.531670"/>
</kw>
<msg time="2026-10-16T01:28:06.458135" 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-10-16T01:28:05.925584" elapsed="0.532655"/>
</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-10-16T01:28:05.925000" elapsed="0.533394"/>
</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-10-16T01:28:02.329569" elapsed="4.128935"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-10-16T01:28:06.459611" 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-10-16T01:28:06.458970" elapsed="0.000695"/>
</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-10-16T01:28:06.466900" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:28:06.466129" elapsed="0.000826"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:28:06.468071" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:28:06.467410" elapsed="0.000723"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:28:06.468240" elapsed="0.000065"/>
</return>
<msg time="2026-10-16T01:28:06.468528" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:28:06.465308" elapsed="0.003270"/>
</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-10-16T01:28:06.474936" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:28:06.474223" elapsed="0.000768"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:28:06.475084" elapsed="0.000056"/>
</return>
<msg time="2026-10-16T01:28:06.475352" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:28:06.473474" elapsed="0.001928"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:28:06.478068" 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-10-16T01:28:06.477527" elapsed="0.000633"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:28:06.479106" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:28:06.478571" elapsed="0.000624"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:28:06.487644" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:28:06.487826" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:28:06.488068" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:28:06.479873" elapsed="0.009053">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:28:06.479327" elapsed="0.009764">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:28:06.489489" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:28:06.489159" elapsed="0.000458"/>
</branch>
<status status="FAIL" start="2026-10-16T01:28:06.479292" elapsed="0.010373">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:28:06.490457" elapsed="0.000051"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:28:06.490767" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:28:06.490645" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:28:06.490611" 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-10-16T01:28:06.491203" elapsed="0.000043"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:28:06.491343" 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-10-16T01:28:06.476106" elapsed="0.015448">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:28:06.491678" elapsed="0.000077"/>
</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-10-16T01:28:06.472517" elapsed="0.019402">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:28:06.492373" elapsed="0.000048"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:28:06.468994" elapsed="0.023847">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:28:06.468688" elapsed="0.024281">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:28:06.464183" elapsed="0.028976">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:28:07.500023" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:28:07.499139" elapsed="0.000952"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:28:07.501111" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:28:07.500442" elapsed="0.000723"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:28:07.501264" elapsed="0.000076"/>
</return>
<msg time="2026-10-16T01:28:07.501571" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:28:07.498283" elapsed="0.003338"/>
</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-10-16T01:28:07.508180" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:28:07.507519" elapsed="0.000718"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:28:07.508332" elapsed="0.000059"/>
</return>
<msg time="2026-10-16T01:28:07.508606" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:28:07.506804" elapsed="0.001854"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:28:07.511652" 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-10-16T01:28:07.511125" elapsed="0.000670"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:28:07.512758" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:28:07.512227" elapsed="0.000625"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:28:07.519593" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:28:07.519765" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:28:07.519984" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:28:07.513492" elapsed="0.007295">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:28:07.512991" elapsed="0.007960">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:28:07.521353" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:28:07.521021" elapsed="0.000460"/>
</branch>
<status status="FAIL" start="2026-10-16T01:28:07.512953" elapsed="0.008576">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:28:07.522311" elapsed="0.000052"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:28:07.522576" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:28:07.522502" elapsed="0.000158"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:28:07.522466" elapsed="0.000373"/>
</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-10-16T01:28:07.523163" elapsed="0.000044"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:28:07.523304" elapsed="0.000031"/>
</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-10-16T01:28:07.509669" elapsed="0.013846">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:28:07.523635" 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-10-16T01:28:07.505823" elapsed="0.018053">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:28:07.524336" elapsed="0.000048"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:28:07.502040" elapsed="0.022448">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:28:07.501785" elapsed="0.022816">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:28:07.497029" elapsed="0.027808">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:28:08.531633" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:28:08.530805" elapsed="0.000922"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:28:08.532771" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:28:08.532108" elapsed="0.000719"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:28:08.532922" elapsed="0.000074"/>
</return>
<msg time="2026-10-16T01:28:08.533227" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:28:08.529952" elapsed="0.003327"/>
</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-10-16T01:28:08.539618" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:28:08.539010" elapsed="0.000664"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:28:08.539840" elapsed="0.000060"/>
</return>
<msg time="2026-10-16T01:28:08.540119" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:28:08.538254" elapsed="0.001916"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:28:08.542848" 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-10-16T01:28:08.542300" elapsed="0.000642"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:28:08.543882" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:28:08.543351" 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-10-16T01:28:08.550282" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:28:08.550392" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:28:08.550600" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:28:08.544608" elapsed="0.006791">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:28:08.544110" elapsed="0.007543">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:28:08.552163" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:28:08.551822" elapsed="0.000472"/>
</branch>
<status status="FAIL" start="2026-10-16T01:28:08.544072" elapsed="0.008270">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:28:08.553132" elapsed="0.000053"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:28:08.553397" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:28:08.553326" elapsed="0.000154"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:28:08.553290" 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-10-16T01:28:08.553884" elapsed="0.000044"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:28:08.554025" elapsed="0.000030"/>
</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-10-16T01:28:08.540905" elapsed="0.013329">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:28:08.554351" elapsed="0.000031"/>
</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-10-16T01:28:08.537278" elapsed="0.017257">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:28:08.555037" elapsed="0.000050"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:28:08.533643" elapsed="0.021548">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:28:08.533390" elapsed="0.021914">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:28:08.528609" elapsed="0.026878">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:28:09.562413" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:28:09.561533" elapsed="0.000945"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:28:09.563490" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:28:09.562878" elapsed="0.000664"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:28:09.563637" elapsed="0.000122"/>
</return>
<msg time="2026-10-16T01:28:09.563997" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:28:09.560689" elapsed="0.003357"/>
</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-10-16T01:28:09.570402" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:28:09.569794" elapsed="0.000663"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:28:09.570552" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:28:09.570883" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:28:09.569036" elapsed="0.001898"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:28:09.573534" 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-10-16T01:28:09.573029" elapsed="0.000598"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:28:09.574572" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:28:09.574092" elapsed="0.000568"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:28:09.581177" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:28:09.581303" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:28:09.581536" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:28:09.575350" elapsed="0.007014">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:28:09.574850" elapsed="0.007688">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:28:09.583001" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:28:09.582609" elapsed="0.000526"/>
</branch>
<status status="FAIL" start="2026-10-16T01:28:09.574809" elapsed="0.008375">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:28:09.583963" elapsed="0.000052"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:28:09.584230" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:28:09.584156" elapsed="0.000159"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:28:09.584121" 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-10-16T01:28:09.584664" elapsed="0.000090"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:28:09.584856" 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-10-16T01:28:09.571590" elapsed="0.013479">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:28:09.585189" 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-10-16T01:28:09.568062" elapsed="0.017316">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:28:09.585883" elapsed="0.000075"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:28:09.564405" elapsed="0.021663">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:28:09.564157" elapsed="0.022025">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:28:09.559430" elapsed="0.026934">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:28:10.593475" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:28:10.592601" elapsed="0.000938"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:28:10.594545" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:28:10.593930" elapsed="0.000670"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:28:10.594694" elapsed="0.000120"/>
</return>
<msg time="2026-10-16T01:28:10.595050" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:28:10.591804" elapsed="0.003297"/>
</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-10-16T01:28:10.601146" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:28:10.600485" elapsed="0.000717"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:28:10.601298" elapsed="0.000058"/>
</return>
<msg time="2026-10-16T01:28:10.601571" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:28:10.599773" elapsed="0.001849"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:28:10.604277" 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-10-16T01:28:10.603768" elapsed="0.000604"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:28:10.605327" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:28:10.604837" elapsed="0.000578"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:28:10.611765" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:28:10.611885" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:28:10.612094" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:28:10.606118" elapsed="0.006781">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:28:10.605555" elapsed="0.007507">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:28:10.613463" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:28:10.613131" elapsed="0.000461"/>
</branch>
<status status="FAIL" start="2026-10-16T01:28:10.605516" elapsed="0.008124">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:28:10.614425" elapsed="0.000052"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:28:10.614689" elapsed="0.000077"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:28:10.614617" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:28:10.614582" 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-10-16T01:28:10.615180" elapsed="0.000044"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:28:10.615319" elapsed="0.000030"/>
</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-10-16T01:28:10.602333" elapsed="0.013197">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:28:10.615649" elapsed="0.000031"/>
</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-10-16T01:28:10.598808" elapsed="0.017081">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:28:10.616443" elapsed="0.000051"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:28:10.595618" elapsed="0.020982">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:28:10.595360" elapsed="0.021408">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:28:10.590544" elapsed="0.026418">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:28:11.628432" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-10-16T01:28:11.627554" elapsed="0.000943"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-10-16T01:28:11.629513" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Creates and returns a list containing the given items.</doc>
<status status="PASS" start="2026-10-16T01:28:11.628893" elapsed="0.000675"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-10-16T01:28:11.629664" elapsed="0.000123"/>
</return>
<msg time="2026-10-16T01:28:11.630029" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-10-16T01:28:11.626688" elapsed="0.003393"/>
</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-10-16T01:28:11.636146" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variable.</doc>
<status status="PASS" start="2026-10-16T01:28:11.635479" elapsed="0.000723"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-10-16T01:28:11.636297" elapsed="0.000059"/>
</return>
<msg time="2026-10-16T01:28:11.636578" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-10-16T01:28:11.634766" elapsed="0.001868"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:28:11.639307" 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-10-16T01:28:11.638800" elapsed="0.000602"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-10-16T01:28:11.640354" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-10-16T01:28:11.639864" elapsed="0.000579"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-10-16T01:28:11.646664" level="INFO">GET Request : url=http://10.30.170.180: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.34.2', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-10-16T01:28:11.646847" level="INFO">GET Response : url=http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=404, reason=Not Found 
 headers={'Cache-Control': 'must-revalidate,no-cache,no-store', 'Content-Type': 'text/html;charset=iso-8859-1', 'Content-Length': '407'} 
 body=&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/&gt;
&lt;title&gt;Error 404 Not Found&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;&lt;h2&gt;HTTP ERROR 404 Not Found&lt;/h2&gt;
&lt;table&gt;
&lt;tr&gt;&lt;th&gt;URI:&lt;/th&gt;&lt;td&gt;/rests/data/network-topology:network-topology&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;STATUS:&lt;/th&gt;&lt;td&gt;404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;MESSAGE:&lt;/th&gt;&lt;td&gt;Not Found&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;SERVLET:&lt;/th&gt;&lt;td&gt;default&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;/body&gt;
&lt;/html&gt;
 
 </msg>
<msg time="2026-10-16T01:28:11.647077" level="FAIL">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:28:11.641137" elapsed="0.006740">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-10-16T01:28:11.640580" elapsed="0.007461">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:28:11.648440" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-10-16T01:28:11.648110" elapsed="0.000457"/>
</branch>
<status status="FAIL" start="2026-10-16T01:28:11.640543" elapsed="0.008073">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:28:11.649410" elapsed="0.000054"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-10-16T01:28:11.649676" elapsed="0.000057"/>
</return>
<status status="NOT RUN" start="2026-10-16T01:28:11.649603" elapsed="0.000212"/>
</branch>
<status status="NOT RUN" start="2026-10-16T01:28:11.649569" 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-10-16T01:28:11.650169" elapsed="0.000042"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-10-16T01:28:11.650306" elapsed="0.000030"/>
</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-10-16T01:28:11.637355" elapsed="0.013161">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-10-16T01:28:11.650784" elapsed="0.000036"/>
</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-10-16T01:28:11.633800" elapsed="0.017186">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?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-10-16T01:28:11.651446" elapsed="0.000049"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-10-16T01:28:11.630572" elapsed="0.021026">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-10-16T01:28:11.630192" elapsed="0.021550">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</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="FAIL" start="2026-10-16T01:28:11.625439" elapsed="0.026521">HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<msg time="2026-10-16T01:28:11.652148" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</msg>
<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="FAIL" start="2026-10-16T01:28:06.460142" elapsed="5.192196">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<doc>Cleans up test environment, close existing sessions.</doc>
<status status="FAIL" start="2026-10-16T01:28:02.329208" elapsed="9.323347">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</kw>
<doc>Cleans up test environment, close existing sessions in teardown.</doc>
<status status="FAIL" start="2026-10-16T01:28:01.941396" elapsed="9.711493">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 404 Client Error: Not Found for url: http://10.30.170.180:8181/rests/data/network-topology:network-topology?content=nonconfig</status>
</test>
<kw name="Delete All Sessions" owner="RequestsLibrary" type="TEARDOWN">
<msg time="2026-10-16T01:28:11.654687" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects </doc>
<status status="PASS" start="2026-10-16T01:28:11.654519" elapsed="0.000398"/>
</kw>
<doc>Test suite for Ovsdb Southbound Cluster - Candidate failover and recover</doc>
<status status="FAIL" start="2026-10-16T01:24:49.483974" elapsed="202.171017"/>
</suite>
<status status="FAIL" start="2026-10-16T01:21:08.686775" elapsed="422.970275"/>
</suite>
<status status="FAIL" start="2026-10-16T01:13:58.803525" elapsed="852.856106"/>
</suite>
<statistics>
<total>
<stat pass="6" fail="158" skip="0">All Tests</stat>
</total>
<tag>
</tag>
<suite>
<stat name="ovsdb-upstream-clustering.txt" id="s1" pass="6" fail="158" skip="0">ovsdb-upstream-clustering.txt</stat>
<stat name="Southbound Cluster" id="s1-s1" pass="3" fail="79" skip="0">ovsdb-upstream-clustering.txt.Southbound Cluster</stat>
<stat name="Ovsdb Southbound Cluster" id="s1-s1-s1" pass="3" fail="41" skip="0">ovsdb-upstream-clustering.txt.Southbound Cluster.Ovsdb Southbound Cluster</stat>
<stat name="Southbound Cluster Extension" id="s1-s1-s2" pass="0" fail="38" skip="0">ovsdb-upstream-clustering.txt.Southbound Cluster.Southbound Cluster Extension</stat>
<stat name="Southbound Cluster" id="s1-s2" pass="3" fail="79" skip="0">ovsdb-upstream-clustering.txt.Southbound Cluster</stat>
<stat name="Ovsdb Southbound Cluster" id="s1-s2-s1" pass="3" fail="41" skip="0">ovsdb-upstream-clustering.txt.Southbound Cluster.Ovsdb Southbound Cluster</stat>
<stat name="Southbound Cluster Extension" id="s1-s2-s2" pass="0" fail="38" skip="0">ovsdb-upstream-clustering.txt.Southbound Cluster.Southbound Cluster Extension</stat>
</suite>
</statistics>
<errors>
</errors>
</robot>
